索引设计与慢查询优化
在基础篇索引原理之上,本章结合 MySQL 的实际行为,给出可落地的索引设计与慢查询治理方法。
EXPLAIN 实战
重点关注:
联合索引设计原则
- 等值查询列放前面,范围查询列放最后。
- 区分度高的列优先:区分度 = 不重复值数 / 总行数。
- 尽量让高频查询走覆盖索引,消除回表。
- 遵循最左前缀,避免冗余索引。
区分度评估
Tip
ORDER BY 的方向会与索引顺序耦合。ORDER BY created_at DESC 在 (tenant_id, status, created_at) 索引上可以正序扫描再逆序返回,无需 filesort;但如果排序方向与索引不一致(如 a ASC, b DESC 混合),MySQL 8 才支持降序索引 (a ASC, b DESC)。
慢查询治理流程
- 开启慢查询日志,设定阈值(如 1s),收集 Top SQL。
- 用
EXPLAIN分析问题 SQL 的访问路径。 - 补/改索引,或改写 SQL(消除函数、优化分页)。
- 验证效果,观察
rows、耗时与 QPS 变化。 - 回归与监控,防止索引被误删或数据分布变化导致回退。
常见反模式对照
Warning
索引不是越多越好:每个索引都会拖慢写入、占用空间,并增加优化器误判的概率。上线新索引前,用 pt-index-usage 或 performance_schema 分析现有索引的实际使用率,定期清理无用索引。
小结
- 用
EXPLAIN定位访问类型、命中索引与额外排序/临时表。 - 联合索引遵循「等值在前、范围在后、高区分度在前」。
- 慢查询治理是「采集 → 分析 → 改造 → 验证 → 监控」的闭环。
- 记住常见反模式,改写往往比加索引更有效。