首页/数据/SQL 速查/NULL 值与索引使用
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条变更与事务52 条
性能与执行计划72 条

NULL 值与索引使用

IS NULL 通常可走索引;负向条件(<>、NOT IN、NOT LIKE)容易退回扫描,能否走索引以实际计划为准。

SQL 速查数据更新于 2026-10-12

示例

示例
-- 可走索引(B 树包含 NULL 条目)
SELECT * FROM users WHERE deleted_at IS NULL;

-- 负向条件:多数情况退化为扫描
SELECT * FROM users WHERE status <> 'active';
SELECT * FROM users WHERE email NOT LIKE 'a%';

-- 改写思路:用状态枚举的正向条件替代负向条件
SELECT * FROM users WHERE status IN ('pending', 'locked');
存储InnoDB 与 PG 的 B 树都会为 NULL 建立条目,IS NULL 可用索引
唯一索引MySQL 唯一索引允许多个 NULL;PG 默认同理
NOT IN含 NULL 时结果语义易错,性能上也通常无索引可用

易错点

  • 把 NOT IN 当普通条件优化:既有无索引问题又有 NULL 语义陷阱,优先改写
  • 认为 NULL 不占索引空间:B 树会记录 NULL 条目,索引体积与选择性都会受影响

数据来源与参考

  • MySQL 8.0 Reference Manual §8.3.1 How MySQL Uses Indexes
  • PostgreSQL Documentation §11.2 Index Types
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌