現(xiàn)在通過實例來驗證下:
我的myslq版本是:8.0.19
建表語句
CREATE TABLE? test_index (
id bigint(20) NOT NULL AUTO_INCREMENT,
a bigint(255) DEFAULT NULL,
b bigint(255) DEFAULT NULL,
c bigint(255) DEFAULT NULL,
PRIMARY KEY (id),
KEY index_b (b) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
其中b建了單獨的索引
共插入10條數(shù)據(jù):

一、IS NULL
依次減少該表b字段值為null的數(shù)量,分別執(zhí)行以下sql看其執(zhí)行計劃:
EXPLAIN SELECT * FROM test_index WHERE b IS NULL;(= "")
結果:
當b字段為null的數(shù)量等于8的時候,會走索引

當b字段為null的數(shù)量為等于9個的時候,不會走索引

二、IS NOT NULL
依次增加該表b字段值不為null的數(shù)量,分別執(zhí)行以下sql看其執(zhí)行計劃:
EXPLAIN SELECT * FROM test_index WHERE b IS NOT NULL;()
結果:
當b字段不為null的數(shù)量等于8時候,會走索引

當b字段不為null的數(shù)量等于9的時候,不會走索引

三、查詢條件為= NULL 或者? != NULL
EXPLAIN SELECT * FROM t_union_index WHERE b = NULL;
EXPLAIN SELECT * FROM t_union_index WHERE b != NULL;
結果:不會走索引。
為什么會出現(xiàn)這種情況呢?
null 表示什么也不是, 不能=、>、< … 所有的判斷,結果都是false,所有只能用 is null進行判斷。
結論:
默認為Null的列,存在Null值會導致mysql優(yōu)化器處理起來比較復雜,但是到底走不走索引,或者走那個索引,是要靠mysql優(yōu)化器預先預估走那個索引成本比較低來決定的
我實驗中的大致結果是:
查詢條件中IS NULL,當命中結果數(shù)量小于等于80%的時候,會走索引(數(shù)據(jù)量越大比例會變動)。
查詢條件中的IS NOT NULL,命中結果數(shù)量小于等于80%的時候,會走索引(數(shù)據(jù)量越大比例會變動)。