最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談為什么數(shù)據(jù)庫字段建議設(shè)置為NOT NULL

 更新時(shí)間:2024年12月05日 09:51:44   作者:除了編程啥都懂  
本文主要介紹了MySQL數(shù)據(jù)庫中將字段設(shè)置為NOT NULL的性能和優(yōu)缺點(diǎn),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、性能

如果查詢中包含可為null的列,對(duì)MYSQL來說更難優(yōu)化,因?yàn)榭蔀閚ull的列使得索引、索引統(tǒng)計(jì)和值比較都更復(fù)雜。可為null的列會(huì)使用更多的存儲(chǔ)空間,在MYSQL里也需要特殊處理。當(dāng)可為null的列被索引時(shí),每個(gè)索引記錄需要一個(gè)額外的字節(jié),在MyISAM里甚至還可能導(dǎo)致固定大小的索引(例如只有一個(gè)整數(shù)列的索引)變成可變大小的索引。

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

當(dāng)然也有例外,例如值得一提的是,InnoDB使用單獨(dú)的位(bit)存儲(chǔ)null值,所以對(duì)于稀疏數(shù)據(jù)有很好的空間效率。但這一點(diǎn)不適用于MyISAM。

注意:稀疏數(shù)據(jù)指的是很多值為null,只有少數(shù)行的列有非null值的情況。

二、開發(fā)的友好性

可以減少對(duì)空值的額外處理邏輯,開發(fā)人員可以更加簡(jiǎn)潔和清晰的編寫代碼。

三、聚合函數(shù)不準(zhǔn)確

對(duì)于null值的列,使用聚合函數(shù)的時(shí)候會(huì)忽略null值。

現(xiàn)在我們有一張表,name字段默認(rèn)是null,此時(shí)對(duì)name進(jìn)行count得出的結(jié)果是1,這個(gè)是錯(cuò)誤的。

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

四、null與其它值計(jì)算

null和其他任何值進(jìn)行運(yùn)算都是null,包括表達(dá)式的值也是null。比如null+1等于null,concat()函數(shù)拼接也還是null。

五、distinct、group by、order by的問題

對(duì)于distinct和group by來說,所有的null值都會(huì)被視為相等,對(duì)于order by來說升序null會(huì)排在最前。

六、索引問題

為了驗(yàn)證null字段對(duì)索引的影響,分別對(duì)name和age添加索引。

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

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

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

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

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

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

最后執(zhí)行器負(fù)責(zé)執(zhí)行語句、有無權(quán)限進(jìn)行查詢,返回執(zhí)行結(jié)果。

從上面的簡(jiǎn)單測(cè)試結(jié)果其實(shí)可以看到,索引列存在null就會(huì)導(dǎo)致優(yōu)化器在做索引選擇的時(shí)候更復(fù)雜,更加難以優(yōu)化。

七、其它問題

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

到此這篇關(guān)于為什么數(shù)據(jù)庫字段建議設(shè)置為NOT NULL的文章就介紹到這了,更多相關(guān)數(shù)據(jù)庫字段NOT NULL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JDBC常用接口總結(jié)

    JDBC常用接口總結(jié)

    這篇文章主要介紹了JDBC常用接口總結(jié),以及部分使用代碼語句,需要的朋友可以參考下。
    2017-09-09
  • OLEDB和ODBC的區(qū)別(優(yōu)缺點(diǎn))

    OLEDB和ODBC的區(qū)別(優(yōu)缺點(diǎn))

    ODBC是一種連接數(shù)據(jù)庫的開放標(biāo)準(zhǔn),OLEDB(對(duì)象鏈接和嵌入數(shù)據(jù)庫)位于ODBC層與應(yīng)用程序之間. 在你的ASP頁面里,ADO是位于OLEDB之上的應(yīng)用程序. 你的ADO調(diào)用先被送到OLEDB,然后再交由ODBC處理
    2012-09-09
  • 數(shù)據(jù)庫學(xué)習(xí)建議之提高數(shù)據(jù)庫速度的十條建議

    數(shù)據(jù)庫學(xué)習(xí)建議之提高數(shù)據(jù)庫速度的十條建議

    很多網(wǎng)站的重要信息都是保存在數(shù)據(jù)庫中,用戶通過提交訪問數(shù)據(jù)庫來獲取用戶信息。如果數(shù)據(jù)庫速度非常的快,有助于節(jié)省服務(wù)器的資源,那么如何優(yōu)化數(shù)據(jù)庫的速度呢,下面通過此篇文章一起學(xué)習(xí)數(shù)據(jù)庫學(xué)習(xí)建議之提高數(shù)據(jù)庫速度的十條建議
    2015-11-11
  • 最新評(píng)論

    巴彦淖尔市| 镇远县| 泾源县| 修武县| 八宿县| 贡山| 丰县| 饶平县| 定襄县| 麟游县| 荔浦县| 平乐县| 呼和浩特市| 湘乡市| 瑞金市| 库尔勒市| 屏东县| 土默特右旗| 黎城县| 霍州市| 林州市| 台东市| 渑池县| 饶阳县| 湖北省| 岑巩县| 扶绥县| 黑山县| 宜春市| 保康县| 镶黄旗| 酉阳| 公安县| 吴川市| 开江县| 翁源县| 宜良县| 甘肃省| 拉孜县| 隆昌县| 吉水县|