索引法則--IS NULL, IS NOT NULL 也無法使用索引


 

Mysql 系列文章主頁 

 

===============

 

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 來作為查詢條件,沒有意義。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM