外观
如何理解SQL 索引与查询计划?
标准回答
B-tree 适合很多等值、范围和排序访问,复合索引顺序应与过滤选择性、范围和排序需求结合。并不是每个 WHERE 字段都各建一个索引就最优;索引会占用空间、拖慢写入并影响维护。
分析先看实际查询、参数分布和计划:估计行数与实际行数是否相差很大,扫描了多少行,是否发生额外排序、回表、磁盘读或锁等待。顺序扫描不一定错误,小表或高比例返回可能更划算。
EXPLAIN ANALYZE 会真正执行语句,不能随意对有副作用的线上写操作使用。先在合适环境检查,配合缓冲和时延信息理解瓶颈。慢查询也可能在等锁或连接,不能只通过加索引修复所有超时。
追问与回答
复合索引前列是范围条件会怎样
后续列能否进一步减少扫描或支持排序取决于查询与规划器,不能机械套用一个口诀;用实际计划验证。
为什么加索引后性能没有提高
可能选择性低、统计过时、表达式不匹配、返回量过大或瓶颈不在扫描。比较计划和资源而非只看索引存在。
易混淆点
- 看到 Seq Scan 就断言 SQL 必须优化。
参考资料
内容来源
- Android 与 AI 工程 Wiki · 原条目
q186