本篇內(nèi)容主要講解“MySQL中NULL走不走索引”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“MYSQL中NULL走不走索引”吧!
公司主營(yíng)業(yè)務(wù):成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出東勝免費(fèi)做網(wǎng)站回饋大家。
首先的先標(biāo)準(zhǔn)化一些事情
1 數(shù)據(jù)表到底是哪種格式 (DYNAMIC)
2 此種格式的特點(diǎn),以及NULL 在這樣存儲(chǔ)格式是怎么進(jìn)行處理的
Dynamic 這種行的存儲(chǔ)格式有一些特點(diǎn)
1 所有的字符串的值大于 4 的都是動(dòng)態(tài)的
2 每一行前都有一個(gè)位圖,位圖指示哪些列包含空字符串或零。如果字符串列在刪除尾隨空間后長(zhǎng)度為零,或者數(shù)字列的值為零,則在位圖中標(biāo)記它,而不是保存到磁盤。非空字符串保存為長(zhǎng)度字節(jié)加上字符串內(nèi)容。
3 空列需要行中額外的空間來記錄它們的值是否為空。
從上面的話,總結(jié)出來一句話,NULL 需要額外的空間來保存他,對(duì)比在你的字段里面'' 或者 0 來表明默認(rèn)值,NULL 比他們更浪費(fèi)空間。
在MYSQL5.7中NULL 是可以用\N
來代表NULL ,但在MYSQL 8 中被廢棄了,NULL 就是NULL 來代表。
這里有一個(gè)問題,提出NULL 不好,而要表設(shè)計(jì)中盡量不為空的依據(jù)是哪里來的。我們可以根據(jù)官方文檔中的一段話來說明。
其中有幾句,不使用NULL,可以
1 更好的使用INDEX
2 節(jié)省空間
3 加速SQL 的運(yùn)行
OK,那我們就來做一下實(shí)驗(yàn),看看怎么來證明使用NULL 到底能不能走索引
從上圖來看,查詢空值是可以走索引的。那我們換只用寫法我們差 is not null
看上去的確是is not null是不能走索引,但實(shí)際上是這樣的嗎,是數(shù)量引起的全表掃描,還是is not null引起的問題?
下面的實(shí)驗(yàn)證明 is not null也是可以走索引的,而is not null 無法走索引的情況和平時(shí)其他走不了索引的情況是一樣的,主要還是看cost 成本計(jì)算。
如果是OR 條件中 使用 is null or is null ,從下圖看是可以走索引的
按照索引的原理,二級(jí)索引的值是可以為NULL, 而索引的列值為NULL 的二級(jí)索引記錄來說,B+樹種的NULL 的值存在哪里,一般來說是B+樹的最左邊。
我們繼續(xù)進(jìn)行測(cè)試,如果將部分條件和 is not null聯(lián)合進(jìn)行查詢,從下圖看也是會(huì)走相關(guān)索引的。
所以上面的實(shí)驗(yàn)證明了, is null , is not null 都是可以走相關(guān)的索引的,如果不走索引要不就是相關(guān)走INDEX 的成本比全表掃描還高,要不就是索引可能失效,或統(tǒng)計(jì)分析出了問題。
到此,相信大家對(duì)“MYSQL中NULL走不走索引”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!