===============
1 數據准備
1.1 建表
DROP TABLE IF EXISTS staff; CREATE TABLE IF NOT EXISTS staff ( id INT PRIMARY KEY auto_increment, name VARCHAR(50) NOT NULL, age INT, pos VARCHAR(50) COMMENT '職位', salary DECIMAL(10,2) );
注意:name 字段上加了 NOT NULL 限制
1.2 插入數據
INSERT INTO staff(name, age, pos, salary) VALUES('Alice', 22, 'HR', 5000); INSERT INTO staff(name, age, pos, salary) VALUES('Bob', 22, 'RD', 10000);
2 測試&Explain分析
2.1 建立索引
CREATE INDEX idx_nameAgePos ON staff(name, age, pos);
2.2 測試
Case#1:索引生效
EXPLAIN SELECT * FROM staff WHERE name = 'Alice';
分析:name 等於一個常量,當然能夠使用索引
Case#2:索引失效(IS NULL)
EXPLAIN SELECT * FROM staff WHERE name IS NULL;
分析:建表語句中明確表明 name 字段 NOT NULL,所以,此處的查詢是不可能的
Case#3:索引失效(IS NOT NULL)
EXPLAIN SELECT * FROM staff WHERE name IS NOT NULL;
分析:建表語句中明確表明 name 字段 NOT NULL,而此處的查詢條件為 WHERE name IS NOT NULL,等價於不加這個條件,於是,查詢等價於 SELECT * FROM staff,所以,全表掃描、不能使用索引
3 結論
對於已經有 NOT NULL 修飾的字段來說,不要再使用 IS NULL 或者 IS NOT NULL 來作為查詢條件,沒有意義。