范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

为什么数据库字段要使用NOTNULL?

  最近刚入职新公司,发现数据库设计有点小问题,数据库字段很多没有NOT NULL,对于强迫症晚期患者来说,简直难以忍受,因此有了这篇文章。
  基于目前大部分的开发现状来说,我们都会把字段全部设置成 NOT NULL 并且给默认值的形式。
  通常,对于默认值一般这样设置:  整形,我们一般使用0作为默认值。  字符串,默认空字符串  时间,可以默认 1970-01-01 08:00:01 ,或者默认0000-00-00 00:00:00 ,但是连接参数要添加zeroDateTimeBehavior=convertToNull ,建议的话还是不要用这种默认的时间格式比较好
  但是,考虑下原因,为什么要设置成NOT NULL?
  来自高性能Mysql中有这样一段话:  尽量避免NULL
  很多表都包含可为NULL(空值)的列,即使应用程序并不需要保存NULL也是如此,这是因为可为NULL是列的默认属性。通常情况下最好指定列为NOT NULL,除非真的需要存储NULL值。
  如果查询中包含可为NULL的列,对MySql来说更难优化,因为可为NULL的列使得索引、索引统计和值比较都更复杂。可为NULL的列会使用更多的存储空间,在MySql里也需要特殊处理。当可为NULL的列被索引时,每个索引记录需要一个额外的字节,在MyISAM里甚至还可能导致固定大小的索引(例如只有一个整数列的索引)变成可变大小的索引。
  通常把可为NULL的列改为NOT NULL带来的性能提升比较小,所以(调优时)没有必要首先在现有schema中查找并修改掉这种情况,除非确定这会导致问题。但是,如果计划在列上建索引,就应该尽量避免设计成可为NULL的列。
  当然也有例外,例如值得一提的是,InnoDB使用单独的位(bit)存储NULL值,所以对于稀疏数据有很好的空间效率。但这一点不适用于MyISAM。
  书中的描述说了几个主要问题,我这里暂且抛开MyISAM的问题不谈,这里我针对InnoDB作为考量条件。  如果不设置NOT NULL的话,NULL是列的默认值,如果不是本身需要的话,尽量就不要使用NULL 使用NULL带来更多的问题,比如索引、索引统计、值计算更加复杂,如果使用索引,就要避免列设置成NULL 如果是索引列,会带来的存储空间的问题,需要额外的特殊处理,还会导致更多的存储空间占用 对于稀疏数据有更好的空间效率,稀疏数据指的是 很多值为NULL,只有少数行的列有非NULL值 的情况 默认值
  对于MySql而言,如果不主动设置为NOT NULL的话,那么插入数据的时候默认值就是NULL。
  NULL和NOT NULL使用的空值代表的含义是不一样,NULL可以认为这一列的值是未知的,空值则可以认为我们知道这个值,只不过他是空的而已。
  举个例子,一张表中的某一条 name 字段是NULL,我们可以认为不知道名字是什么,反之如果是空字符串则可以认为我们知道没有名字,他就是一个空值。
  而对于大多数程序的情况而言,没有什么特殊需要非要字段要NULL的吧,NULL值反而会对程序造成比如空指针的问题。
  对于现状大部分使用 MyBatis 的情况来说,我建议使用默认生成的insertSelective 方法或者纯手动写插入方法,可以避免新增NOT NULL字段导致的默认值不生效或者插入报错的问题。 值计算
  聚合函数不准确
  对于NULL值的列,使用聚合函数的时候会忽略NULL值。
  现在我们有一张表, name 字段默认是NULL,此时对name 进行count 得出的结果是1,这个是错误的。
  count(*) 是对表中的行数进行统计,count(name) 则是对表中非NULL的列进行统计。
  =失效
  对于NULL值的列,是不能使用 = 表达式进行判断的,下面对name 的查询是不成立的,必须使用is NULL 。
  与其他值运算
  NULL和其他任何值进行运算都是NULL,包括表达式的值也是NULL。
  user 表第二条记录age 是NULL,所以+1 之后还是NULL,name 是NULL,进行concat 运算之后结果还是NULL。
  可以再看下下面的例子,任何和NULL进行运算的话得出的结果都会是NULL,想象下你设计的某个字段如果是NULL还不小心进行各种运算,最后得出的结果…
  distinct、group by、order by
  对于 distinct 和group by 来说,所有的NULL值都会被视为相等,对于order by 来说升序NULL会排在最前
  其他问题
  表中只有一条有名字的记录,此时查询名字 !=a 预期的结果应该是想查出来剩余的两条记录,会发现与预期结果不匹配。
  索引问题
  为了验证NULL字段对索引的影响,分别对 name  和age 添加索引。
  关于网上很多说如果NULL那么不能使用索引的说法,这个描述其实并不准确,根据引用官方文档[3]里描述,使用is NULL和范围查询都是可以和正常一样使用索引的,实际验证的结果好像也是这样,看以下例子。
  然后接着我们往数据库中继续插入一些数据进行测试,当NULL列值变多之后发现索引失效了。
  我们知道,一个查询SQL执行大概是这样的流程:
  首先连接器负责连接到指定的数据库上,接着看看查询缓存中是否有这条语句,如果有就直接返回结果。
  如果缓存没有命中的话,就需要分析器来对SQL语句进行语法和词法分析,判断SQL语句是否合法。
  现在来到优化器,就会选择使用什么索引比较合理,SQL语句具体怎么执行的方案就确定下来了。
  最后执行器负责执行语句、有无权限进行查询,返回执行结果。
  从上面的简单测试结果其实可以看到,索引列存在NULL就会存在书中所说的导致优化器在做索引选择的时候更复杂,更加难以优化。  存储空间
  数据库中的一行记录在最终磁盘文件中也是以行的方式来存储的,对于InnoDB来说,有4种行存储格式: REDUNDANT 、 COMPACT 、 DYNAMIC  和 COMPRESSED 。
  InnoDB的默认行存储格式是 COMPACT ,存储格式如下所示,虚线部分代表可能不一定会存在。
  变长字段长度列表:有多个字段则以逆序存储,我们只有一个字段所有不考虑那么多,存储格式是16进制,如果没有变长字段就不需要这一部分了。
  NULL值列表:用来存储我们记录中值为NULL的情况,如果存在多个NULL值那么也是逆序存储,并且必须是8bit的整数倍,如果不够8bit,则高位补0。1代表是NULL,0代表不是NULL。如果都是NOT NULL那么这个就存在了。
  ROW_ID:一行记录的唯一标志,没有指定主键的时候自动生成的ROW_ID作为主键。
  TRX_ID:事务ID。
  ROLL_PRT:回滚指针。
  最后就是每列的值。
  为了说明清楚这个存储格式的问题,我弄张表来测试,这张表只有 c1 字段是NOT NULL,其他都是可以为NULL的。
  可变字段长度列表 : c1 和c3 字段值长度分别为1和2,所以长度转换为16进制是0x01 0x02 ,逆序之后就是0x02 0x01 。
  NULL值列表 :因为存在允许为NULL的列,所以 c2,c3,c4 分别为010,逆序之后还是一样,同时高位补0满8位,结果是00000010 。
  其他字段我们暂时不管他,最后第一条记录的结果就是,当然这里我们就不考虑编码之后的结果了。
  这样就是一个完整的数据行数据的格式,反之,如果我们把所有字段都设置为NOT NULL,并且插入一条数据 a,bb,ccc,dddd 的话,存储格式应该这样:
  虽然我们发现NULL本身并不会占用存储空间,但是如果存在NULL的话就会多占用一个字节的标志位的空间。  文章参考文档:
  https://dev.mysql.com/doc/refman/8.0/en/problems-with-null.html
  https://dev.mysql.com/doc/refman/8.0/en/working-with-null.html
  https://dev.mysql.com/doc/refman/5.6/en/is-null-optimization.html
  https://dev.mysql.com/doc/refman/5.6/en/innodb-row-format.html
  https://www.cnblogs.com/zhoujinyi/articles/2726462.html
  后台回复【pdf】获取百本计算机电子书和大厂面试精华,文章每周持续更新。我是艾小仙,阿里巴巴技术专家,我们下期见!
  面经PDF整理

盛夏未来郑宇星不喜欢陈辰却吻了她?吴磊认为是最不渣的做法电影市场的低迷期,盛夏未来逆风而上,青春电影上映三天破亿,豆瓣分数破7。5分,口碑不断上涨。张子枫的演技保障,吴磊的少年感,两个年轻演员用实力征服了观众。祖峰郝蕾等实力派作为配角锦爆料华晨宇整容等恶习,大嫂是真爱还是真黑?7月16日,ID为发发爱我2021的网友在微博上晒出了华晨宇的私人整容照片,照片细节到有华晨宇植发的素颜照,确实长得有点像,还未确认到底是不是华晨宇。还公开宣称自己与华晨宇有多年亲你是我的荣耀3个细节证明,于途高中时期就对乔晶晶有好感尽管目前你是我的荣耀豆瓣分数还没出,网络上很多黑子一直在嘲热巴的颜值下跌之类,但剧集的爆火不容置疑。开播11天,热度累计保持10天日冠,累计播放量高达13。3亿。这个成绩让很多剧望小狼狗爱上御姐,这部电视剧比亲爱的热爱的更甜蜜年下不叫姐,心思有点野!网友们用这样的评论来形容我的邻居长不大,不仅押韵,还直指剧情核心。可能是因为现在改编剧太多了,所以个人对于原创剧特别友好,我的邻居长不大是我的邻居睡不着后的顶楼3停播也不消停,网友挖出吴允熙与朱丹泰是兄妹恋?7月23日,顶楼3给东京奥运会开幕式让路,停播一周。7月24号网友们的关注点并没有在虽迟终到的开幕式上,而是对顶楼3停播一周发表热议。网友甲表示没有顶楼就没有快乐!网友乙建议将周五顶楼2具虎东不再登场,吴允熙变得更加狠毒了SBS新金土剧pentrohouse2将于19日首播,18日公开了在cosmopolitan3月号中搭档出演的柳真和朴恩硕的画报。黑色系列的情侣装装扮的两人以独一无二的眼神和姿势散李智雅缺席顶楼2剧本研读会,沈秀莲真的凉了?演员们参与顶楼2的剧本练习现场照片被公开了。在前几天,SBS新金土剧顶楼2公开了主要演员们聚在一起进行的剧本练习现场。顶楼第1季虽然是破格性的,但是具有很强中毒性的故事感性的演出演李智雅缺席顶层第二季发布会,沈秀莲复活的可能性有多大?SBS方面公开了将于19日首播的顶层第二季制作发表会出席者名单。当天公开的出席者名单中,柳真金素妍严基俊奉太奎尹钟勋朴恩锡河道权的名字,在第1季中担任沈秀莲的李智雅将缺席。在第一季收购南瓜电影恒腾网络锁定3年15亿净利近年来,流媒体发展迅猛,尤其是疫情期间,成为逆势增长最为瞩目的行业。日前,恒腾网络(0136。HK)全资收购了儒意影业,后者旗下的南瓜电影将被打造成中国版Netflix,成为上市公拓展营收模式恒腾网络授权恒大旅游使用IP作为国内最顶尖的影视公司,儒意影业近年来爆款频出,今年春节档刷爆话题热度的你好,李焕英便是由儒意影业参与投资制作及发行,上映仅7天票房突破30亿,创中国电影史新纪录。此前上映的送你赵奕欢近照曝光,曾经的网络剧女神担当,现今却沦落为三线网红说到赵奕欢这个女明星,相信大多数九零后的小伙伴都对她印象非常深刻。赵奕欢曾凭借美貌和身材,曾一度成为了网络剧的女神,更是出演过不少影视,如青春期就是其中之一,当时更是收获了一波90
别看他在这就是街舞被当做搞笑dancer,当年也是KOD的冠军这一季这就是街舞的气氛组成员实在是太多了,本来以为肖杰老师一个人就可以成为场外最佳解说了,可是没想到,小鸡三儿这些明明可以靠实力吃饭的舞者,纷纷走上了谐星的不归路。小鸡这一期的三儿晴雅集绝对是郭敬明翻身之作,看不见他的进步,就是你的退步晴雅集的好看超乎想象,这部电影小编给8分。3分给特效,4分给演员,1分给郭敬明。别看郭敬明只占了1分,他这1分很重要。当郭敬明学乖以后,知道在电影里怎么收敛以后,他拍出来的电影,绝33岁赵丽颖演13岁周翡,不顾角色年龄差,强行装嫩肯定不行赵丽颖和王一博主演的有翡正在热播,播放量可观,但是豆瓣评分却是一降再降,从6。3降到6。1再到现在6。0,眼瞧着就要不及格了。其中有一个被质疑声音很大的就是赵丽颖的扮相,她已经33星光大赏直播截图,热巴一骑绝尘!宋茜腹肌优秀,唐嫣杨幂平平星光大赏红毯走完了,相比于男明星,现在更想看女明星的红毯,看到这么多女明星走红毯,小编单方面觉得今晚的红毯热巴赢了!真的是美到一骑绝尘啊!说仙女下凡也不为过,真的很白而且会发光。星章安仁举报王永正,钻营做事没底线,但这样的人最容易成功章安仁从一出场看起来还算老实,到为了留校不择手段举报王永正,假如不是看过小说知道章安仁这个角色本来就是个凤凰男,肯定会对章安仁这个角色有厌恶情绪的。只不过章安仁这么做其实并没有错,谁不想活成朱锁锁?个性大胆像个花蝴蝶,如鱼得水游戏人间朱锁锁这个角色神了,男女通吃的节奏啊。前6集朱锁锁住在舅舅家,的确从状态上有点压抑,但是自从朱锁锁去到精言上班以后,立刻如鱼得水啊。是一个非常让人喜欢的角色。不过我们的确要承认,朱流金岁月回头再看发现谢宏祖一点都不憨,他对朱锁锁志在必得什么事情都禁不住反复琢磨。谢宏祖对朱锁锁的确是喜欢,而且是不加掩饰的喜欢。他对朱锁锁的表白和追求都很直接,看起来是挺苏的,但是仔细琢磨之下不难发现,他所谓的追求,可真是一点也不简单热泪盈眶!年均74岁清华校友合唱少年,春晚需要这样的节目2月4号小年夜晚上总台举办了一场网络春晚,这场网络春晚也有不少亮点,其中之一就是清华大学上海校友会唱团唱了一首少年,这个视频被官方点评少年二字不问白发,只问心境,无关年龄,只关热爱就凭服装道具这么多死扣的细节,山海情9。4分也是应该的孔笙导演向来严格,而且拍的电视剧是出了名的细节控。山海情也不例外,今天不讲剧情,就从细节上来说说这部剧为什么会得到9。4的高分。大概应该有很多网友已经知道了,蘑菇是他们自己种的,为看完司藤的服装要是还不认识改良旗袍,那就是你的不对了司藤这部剧,景甜为我们贡献了很多很美的造型,景甜本人就很白,身材也很好,而司藤这个角色也的确是活在一九三几的人物,所以哪怕复活以后,在服饰上也是比较复古的。景甜在剧中的造型的确都非小舍得米桃换衣服灯光诡异,是在暗示她人生的理想与现实不知道有没有朋友觉得米桃换衣服那段的灯光非常诡异,看了以后一点都不为米桃穿新衣服感到开心,反而觉得,一种被霸凌的感觉笼罩在米桃的身上。这其实是导演的镜头语言。所谓镜头语言,就是把导