婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 為什么mysql字段要使用NOT NULL

為什么mysql字段要使用NOT NULL

熱門標簽:大豐地圖標注app 南太平洋地圖標注 html地圖標注并導航 武漢電銷機器人電話 北京金倫外呼系統(tǒng) 400電話變更申請 呂梁外呼系統(tǒng) 400電話辦理服務價格最實惠 催天下外呼系統(tǒng)

最近剛入職新公司,發(fā)現(xiàn)數(shù)據(jù)庫設計有點小問題,數(shù)據(jù)庫字段很多沒有NOT NULL,對于強迫癥晚期患者來說,簡直難以忍受,因此有了這篇文章。

基于目前大部分的開發(fā)現(xiàn)狀來說,我們都會把字段全部設置成NOT NULL并且給默認值的形式。

  • 通常,對于默認值一般這樣設置:
  • 整形,我們一般使用0作為默認值。
  • 字符串,默認空字符串

時間,可以默認1970-01-01 08:00:01,或者默認0000-00-00 00:00:00,但是連接參數(shù)要添加zeroDateTimeBehavior=convertToNull,建議的話還是不要用這種默認的時間格式比較好

但是,考慮下原因,為什么要設置成NOT NULL?

來自高性能Mysql中有這樣一段話:

盡量避免NULL

很多表都包含可為NULL(空值)的列,即使應用程序并不需要保存NULL也是如此,這是因為可為NULL是列的默認屬性。通常情況下最好指定列為NOT NULL,除非真的需要存儲NULL值。

如果查詢中包含可為NULL的列,對MySql來說更難優(yōu)化,因為可為NULL的列使得索引、索引統(tǒng)計和值比較都更復雜。可為NULL的列會使用更多的存儲空間,在MySql里也需要特殊處理。當可為NULL的列被索引時,每個索引記錄需要一個額外的字節(jié),在MyISAM里甚至還可能導致固定大小的索引(例如只有一個整數(shù)列的索引)變成可變大小的索引。

通常把可為NULL的列改為NOT NULL帶來的性能提升比較小,所以(調(diào)優(yōu)時)沒有必要首先在現(xiàn)有schema中查找并修改掉這種情況,除非確定這會導致問題。但是,如果計劃在列上建索引,就應該盡量避免設計成可為NULL的列。

當然也有例外,例如值得一提的是,InnoDB使用單獨的位(bit)存儲NULL值,所以對于稀疏數(shù)據(jù)有很好的空間效率。但這一點不適用于MyISAM。

書中的描述說了幾個主要問題,我這里暫且拋開MyISAM的問題不談,這里我針對InnoDB作為考量條件。

  • 如果不設置NOT NULL的話,NULL是列的默認值,如果不是本身需要的話,盡量就不要使用NULL
  • 使用NULL帶來更多的問題,比如索引、索引統(tǒng)計、值計算更加復雜,如果使用索引,就要避免列設置成NULL
  • 如果是索引列,會帶來的存儲空間的問題,需要額外的特殊處理,還會導致更多的存儲空間占用
  • 對于稀疏數(shù)據(jù)又更好的空間效率,稀疏數(shù)據(jù)指的是很多值為NULL,只有少數(shù)行的列有非NULL值的情況

默認值

對于MySql而言,如果不主動設置為NOT NULL的話,那么插入數(shù)據(jù)的時候默認值就是NULL。

NULL和NOT NULL使用的空值代表的含義是不一樣,NULL可以認為這一列的值是未知的,空值則可以認為我們知道這個值,只不過他是空的而已。

舉個例子,一張表中的某一條name字段是NULL,我們可以認為不知道名字是什么,反之如果是空字符串則可以認為我們知道沒有名字,他就是一個空值。

而對于大多數(shù)程序的情況而言,沒有什么特殊需要非要字段要NULL的吧,NULL值反而會對程序造成比如空指針的問題。

對于現(xiàn)狀大部分使用MyBatis的情況來說,我建議使用默認生成的insertSelective方法或者純手動寫插入方法,可以避免新增NOT NULL字段導致的默認值不生效或者插入報錯的問題。

值計算

聚合函數(shù)不準確

對于NULL值的列,使用聚合函數(shù)的時候會忽略NULL值。

現(xiàn)在我們有一張表,name字段默認是NULL,此時對name進行count得出的結果是1,這個是錯誤的。

count(*)是對表中的行數(shù)進行統(tǒng)計,count(name)則是對表中非NULL的列進行統(tǒng)計。

=失效

對于NULL值的列,是不能使用=表達式進行判斷的,下面對name的查詢是不成立的,必須使用is NULL

與其他值運算

NULL和其他任何值進行運算都是NULL,包括表達式的值也是NULL。

user表第二條記錄age是NULL,所以+1之后還是NULL,name是NULL,進行concat運算之后結果還是NULL。

可以再看下下面的例子,任何和NULL進行運算的話得出的結果都會是NULL,想象下你設計的某個字段如果是NULL還不小心進行各種運算,最后得出的結果。。。

distinct、group by、order by

對于distinctgroup by來說,所有的NULL值都會被視為相等,對于order by來說升序NULL會排在最前

其他問題

表中只有一條有名字的記錄,此時查詢名字!=a預期的結果應該是想查出來剩余的兩條記錄,會發(fā)現(xiàn)與預期結果不匹配。

索引問題

為了驗證NULL字段對索引的影響,分別對nameage添加索引。

關于網(wǎng)上很多說如果NULL那么不能使用索引的說法,這個描述其實并不準確,根據(jù)引用官方文檔[3]里描述,使用is NULL和范圍查詢都是可以和正常一樣使用索引的,實際驗證的結果好像也是這樣,看以下例子。

然后接著我們往數(shù)據(jù)庫中繼續(xù)插入一些數(shù)據(jù)進行測試,當NULL列值變多之后發(fā)現(xiàn)索引失效了。

我們知道,一個查詢SQL執(zhí)行大概是這樣的流程:

首先連接器負責連接到指定的數(shù)據(jù)庫上,接著看看查詢緩存中是否有這條語句,如果有就直接返回結果。

如果緩存沒有命中的話,就需要分析器來對SQL語句進行語法和詞法分析,判斷SQL語句是否合法。

現(xiàn)在來到優(yōu)化器,就會選擇使用什么索引比較合理,SQL語句具體怎么執(zhí)行的方案就確定下來了。

最后執(zhí)行器負責執(zhí)行語句、有無權限進行查詢,返回執(zhí)行結果。

從上面的簡單測試結果其實可以看到,索引列存在NULL就會存在書中所說的導致優(yōu)化器在做索引選擇的時候更復雜,更加難以優(yōu)化。

存儲空間

數(shù)據(jù)庫中的一行記錄在最終磁盤文件中也是以行的方式來存儲的,對于InnoDB來說,有4種行存儲格式:REDUNDANTCOMPACTDYNAMICCOMPRESSED

InnoDB的默認行存儲格式是COMPACT,存儲格式如下所示,虛線部分代表可能不一定會存在。

變長字段長度列表:有多個字段則以逆序存儲,我們只有一個字段所有不考慮那么多,存儲格式是16進制,如果沒有變長字段就不需要這一部分了。

NULL值列表:用來存儲我們記錄中值為NULL的情況,如果存在多個NULL值那么也是逆序存儲,并且必須是8bit的整數(shù)倍,如果不夠8bit,則高位補0。1代表是NULL,0代表不是NULL。如果都是NOT NULL那么這個就存在了。

ROW_ID:一行記錄的唯一標志,沒有指定主鍵的時候自動生成的ROW_ID作為主鍵。

TRX_ID:事務ID。

ROLL_PRT:回滾指針。

最后就是每列的值。

為了說明清楚這個存儲格式的問題,我弄張表來測試,這張表只有c1字段是NOT NULL,其他都是可以為NULL的。

可變字段長度列表:c1c3字段值長度分別為1和2,所以長度轉換為16進制是0x01 0x02,逆序之后就是0x02 0x01

NULL值列表:因為存在允許為NULL的列,所以c2,c3,c4分別為010,逆序之后還是一樣,同時高位補0滿8位,結果是00000010

其他字段我們暫時不管他,最后第一條記錄的結果就是,當然這里我們就不考慮編碼之后的結果了。

這樣就是一個完整的數(shù)據(jù)行數(shù)據(jù)的格式,反之,如果我們把所有字段都設置為NOT NULL,并且插入一條數(shù)據(jù)a,bb,ccc,dddd的話,存儲格式應該這樣:

雖然我們發(fā)現(xiàn)NULL本身并不會占用存儲空間,但是如果存在NULL的話就會多占用一個字節(jié)的標志位的空間。

文章參考文檔:

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

到此這篇關于為什么mysql字段要使用NOT NULL的文章就介紹到這了,更多相關mysql字段使用NOT NULL內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 解決mysql使用not in 包含null值的問題
  • 解決從集合運算到mysql的not like找不出NULL的問題
  • MySQL null與not null和null與空值''''''''的區(qū)別詳解
  • MySQL中建表時可空(NULL)和非空(NOT NULL)的用法詳解
  • MySQL中NOT IN填坑之列為null的問題解決
  • MySQL中可為空的字段設置為NULL還是NOT NULL
  • MySQL查詢空字段或非空字段(is null和not null)
  • mysql not in、left join、IS NULL、NOT EXISTS 效率問題記錄
  • MySQL非空約束(not null)案例講解

標簽:西寧 徐州 南充 龍巖 自貢 無錫 迪慶 麗水

巨人網(wǎng)絡通訊聲明:本文標題《為什么mysql字段要使用NOT NULL》,本文關鍵詞  為什么,mysql,字段,要,使用,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《為什么mysql字段要使用NOT NULL》相關的同類信息!
  • 本頁收集關于為什么mysql字段要使用NOT NULL的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲另类在线一区| 91黄色免费看| 三级久久三级久久| 亚洲一级二级在线| 婷婷六月综合亚洲| 老司机免费视频一区二区| 日韩av一级电影| 激情五月婷婷综合| 成人丝袜18视频在线观看| 成人黄色电影在线| 一本大道久久a久久精二百| 91成人在线免费观看| 在线观看网站黄不卡| 欧美嫩在线观看| 欧美一级欧美一级在线播放| 日韩欧美中文字幕精品| 国产欧美一区二区精品久导航| 欧美国产日韩在线观看| 亚洲欧美国产毛片在线| 午夜精品成人在线| 久久99国产精品成人| 成人综合婷婷国产精品久久| 色综合天天综合网国产成人综合天 | 日韩一区二区三区电影| 久久久91精品国产一区二区三区| 国产清纯白嫩初高生在线观看91 | 亚洲国产一二三| 免费欧美高清视频| 国产成人精品亚洲777人妖 | 精品1区2区在线观看| 国产精品成人免费精品自在线观看| 国产精品盗摄一区二区三区| 亚洲一区在线观看视频| 国产在线精品不卡| 91国偷自产一区二区使用方法| 欧美一级日韩一级| 亚洲精品高清在线| 国产老肥熟一区二区三区| 色女孩综合影院| 久久精品欧美日韩精品| 午夜精品爽啪视频| 91丨porny丨最新| 精品久久久久久久久久久院品网 | 麻豆精品视频在线观看| av不卡一区二区三区| 91精品国产福利在线观看| ●精品国产综合乱码久久久久| 蜜桃91丨九色丨蝌蚪91桃色| 91视频一区二区| 久久久久久久久久久久电影| 日日夜夜一区二区| 色综合中文字幕| 国产精品天干天干在观线| 久久66热偷产精品| 欧美精品在线观看播放| 一区二区中文字幕在线| 国产精品正在播放| 精品国产乱码久久久久久牛牛| 亚洲国产美国国产综合一区二区| 成人免费福利片| 中文字幕乱码久久午夜不卡| 六月丁香婷婷久久| 日韩一级视频免费观看在线| 亚洲午夜久久久久中文字幕久| 99久久综合精品| 国产精品丝袜在线| 懂色av一区二区三区免费观看| 精品国产一区二区国模嫣然| 老司机免费视频一区二区三区| 91麻豆精品国产91久久久 | 国产三级一区二区三区| 精品亚洲国内自在自线福利| 日韩三级精品电影久久久| 青草国产精品久久久久久| 欧美三级韩国三级日本三斤| 亚洲成人一二三| 91精品国产一区二区三区蜜臀| 日韩av在线发布| 日韩欧美三级在线| 国产精选一区二区三区| 久久亚洲精品小早川怜子| 国产麻豆欧美日韩一区| 日本一区二区三区久久久久久久久不 | 成人激情动漫在线观看| 国产欧美日韩在线视频| 成人激情免费网站| 亚洲欧美一区二区不卡| 欧洲色大大久久| 美女视频黄 久久| 国产视频一区二区在线| av成人动漫在线观看| 亚洲激情在线播放| 欧美丰满美乳xxx高潮www| 免费观看久久久4p| 中文字幕电影一区| 色老汉一区二区三区| 天天亚洲美女在线视频| www国产亚洲精品久久麻豆| 成人国产精品免费网站| 亚洲资源中文字幕| 日韩欧美一级二级| av电影天堂一区二区在线观看| 亚洲电影一区二区| xnxx国产精品| 在线欧美日韩精品| 激情五月婷婷综合网| 亚洲激情图片一区| 欧美精品一区二区三区久久久| 91麻豆福利精品推荐| 美女尤物国产一区| 一区二区三区四区在线免费观看| 欧美mv日韩mv亚洲| 色综合天天综合网天天看片 | 国产拍欧美日韩视频二区| 日本精品免费观看高清观看| 麻豆国产欧美日韩综合精品二区 | 日本91福利区| 中文字幕在线不卡视频| 欧美一区二区三区喷汁尤物| 99久免费精品视频在线观看| 免费成人av在线| 一区二区三区成人| 欧美经典一区二区| 日韩欧美国产综合| 欧美天天综合网| 成人av网站免费观看| 久久疯狂做爰流白浆xx| 亚洲一区在线观看免费观看电影高清| 国产日本一区二区| 精品免费日韩av| 欧美日韩日日摸| 91麻豆免费看| 不卡的av电影在线观看| 国产精品一色哟哟哟| 美女视频黄久久| 日本在线播放一区二区三区| 亚洲在线观看免费视频| 亚洲精品免费在线播放| 中文字幕av不卡| 日本一区二区三区四区| 亚洲精品一区二区三区福利| 日韩久久久久久| 91精品国产色综合久久ai换脸| 欧美三级一区二区| 欧美主播一区二区三区| 色婷婷av一区二区三区gif| 99国产精品久久久久久久久久| 国产91精品久久久久久久网曝门| 美女视频免费一区| 麻豆精品新av中文字幕| 蜜桃视频一区二区三区在线观看| 天天操天天色综合| 日韩成人伦理电影在线观看| 亚洲超碰97人人做人人爱| 亚洲成人久久影院| 日产国产欧美视频一区精品| 奇米色一区二区| 精彩视频一区二区三区| 国产一区二区三区久久久| 国产一本一道久久香蕉| 成人精品视频一区二区三区尤物| av亚洲精华国产精华精华| 一本色道久久综合亚洲aⅴ蜜桃 | 亚洲大片免费看| 亚洲电影第三页| 麻豆成人91精品二区三区| 国内成+人亚洲+欧美+综合在线 | 不卡视频免费播放| 91老师片黄在线观看| 欧美三级视频在线观看| 欧美成人三级在线| 中文字幕精品—区二区四季| 亚洲美女淫视频| 日本欧美加勒比视频| 国产精一品亚洲二区在线视频| 国产成人精品亚洲午夜麻豆| 欧美在线观看视频一区二区| 日韩天堂在线观看| 国产视频不卡一区| 亚洲福利视频三区| 国产精品资源在线| 欧美日韩中文字幕一区| 久久丝袜美腿综合| 亚洲国产精品久久久久婷婷884 | 91精品国产福利在线观看| 国产午夜精品一区二区三区视频| 亚洲日本va在线观看| 久久99久久久欧美国产| 成人免费毛片高清视频| 69成人精品免费视频| 国产精品久久三| 麻豆精品一区二区综合av| 99久久99久久综合| 亚洲精品一线二线三线无人区| 国产精品久久久久aaaa| 国内精品久久久久影院一蜜桃| 欧美色老头old∨ideo| 国产精品网站在线播放| 久久精品久久久精品美女| 欧美性欧美巨大黑白大战|