在 MySQL 中,单列 B+ 树索引查询 is null 时索引不会失效,优化器可以正常走索引;但如果是复合索引,需满足最左前缀原则,否则索引可能失效。
举两个核心例子:
1. 单列索引:CREATE INDEX idx_name ON t_user(name);
查询 SELECT * FROM t_user WHERE name IS NULL; 会走 idx_name 索引。
2. 复合索引:CREATE INDEX idx_age_name ON t_user(age, name);
查询 SELECT * FROM t_user WHERE name IS NULL; 会失效(跳过了最左列 age);
查询 SELECT * FROM t_user WHERE age = 20 AND name IS NULL; 则生效。
另外要注意,is not null 在 MySQL 中也能走索引,但在部分老版本或特殊索引类型(如全文索引)下可能有例外。