技术

数据库索引调优:从 EXPLAIN 开始

2 分钟1 条评论

慢查询治理是后端工程师的日常。大多数"数据库太慢"的问题,最后都归结为一个词:索引。

先看执行计划,再动手#

拿到慢查询,第一反应不是加索引,而是看执行计划:

EXPLAIN ANALYZE
SELECT id, title FROM posts
WHERE category_id = 'tech' AND published_at IS NOT NULL
ORDER BY published_at DESC
LIMIT 10;

重点看三件事:扫描方式(Seq Scan 还是 Index Scan)、扫描行数与返回行数的比值、排序是否落盘。

复合索引的列序#

复合索引遵循"最左前缀"原则。设计列序的经验公式:

  1. 等值条件的列放前面;
  2. 范围条件的列放后面;
  3. 排序列紧跟范围列(或者干脆用覆盖索引扛住排序)。

比如上面那条查询,(category_id, published_at DESC) 就是一个理想的复合索引:等值在前、排序在后,LIMIT 10 时只需要读 10 行。

不要忘了写入成本#

索引不是免费的。每个索引都会拖慢写入、占用存储,过于激进的索引策略会让 OLTP 场景雪崩。

指标 健康值 危险信号
索引命中率 > 99% < 95%
单表索引数 ≤ 5~6 十几个起步
无人使用的索引 定期清理 越积越多

小结#

调优的顺序永远是:测量 → 定位 → 最小改动 → 复测。EXPLAIN 是起点,也是终点——改完之后再用它确认,而不是靠感觉。

评论 1

登录后即可参与讨论。

  • R
    Raymond

    EXPLAIN 那一步太真实了,上周刚治理完一条 800ms 的慢查询,最后就是个列序问题。