MySQL中NULL對索引的影響深入講解
前言
看了很多博客,也聽過很多人說,包括我們公司的DBA,說MySql中如果某一列中含有null,那么包含該列的索引就無效了。
翻了下《高性能MySQL第二版》和《MySQL技術內幕——InnoDB存儲引擎第2版》,并沒有看到關于這個的介紹。但在本地試了下,null列是可以用到索引的,不管是單列索引還是聯(lián)合索引,但僅限于is null,is not null是不走索引的。
后來在官方文檔中找到了說明,如果某列字段中包含null,確實是可以使用索引的,地址:https://dev.mysql.com/doc/refman/5.7/en/is-null-optimization.html。
在mysql5.6和5.7下均可,存儲引擎為InnoDB。
數(shù)據(jù)如下:

1. 單列索引
給name列建單列索引:

查詢name為null的行:

查詢name為'test0'或為null的行:

可以發(fā)現(xiàn)都可以用到索引。
2. 聯(lián)合索引
給age和name添加聯(lián)合索引:

查詢age為14并且name為null的行:

可以發(fā)現(xiàn)同樣用到了索引。
3. 其他
雖然MySQL可以在含有null的列上使用索引,但不代表null和其他數(shù)據(jù)在索引中是一樣的。
不建議列上允許為空。最好限制not null,并設置一個默認值,比如0和''空字符串等,如果是datetime類型,可以設置成'1970-01-01 00:00:00'這樣的特殊值。
對MySQL來說,null是一個特殊的值,Conceptually, NULL means “a missing unknown value” and it is treated somewhat differently from other values。比如:不能使用=,<,>這樣的運算符,對null做算術運算的結果都是null,count時不會包括null行等,null比空字符串需要更多的存儲空間等。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
相關文章
MySQL從MyISAM轉換成InnoDB錯誤與常用解決辦法
由于一些程序的要求,需要MyISAM數(shù)據(jù)引擎或InnoDB,下面是具體的解決方法,經(jīng)測試偶爾會出現(xiàn)一些問題。2011-05-05
mysql連接器之mysql-connector-java問題
這篇文章主要介紹了mysql連接器之mysql-connector-java問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
Mysql四種分區(qū)方式以及組合分區(qū)落地實現(xiàn)詳解
對用戶來說,分區(qū)表是一個獨立的邏輯表,但是底層由多個物理子表組成,下面這篇文章主要給大家介紹了關于Mysql四種分區(qū)方式以及組合分區(qū)落地實現(xiàn)的相關資料,需要的朋友可以參考下2022-04-04

