索引与查询优化

索引用空间换取查询速度:按高频查询的过滤与排序顺序建立联合索引,遵循最左前缀;写放大与选择性之间需要权衡,冗余索引要定期清理。

联合索引按等值→范围→排序设计列序;注意最左前缀
覆盖查询列全部命中索引可避免回表
维护写多的表控制索引数量;定期检查未使用索引
  • 抓慢查询:按总耗时与出现频率排序,圈定优化对象
  • 看执行计划:确认扫描行数、命中索引与回表次数
  • 定列序:等值条件列在前,范围与排序列在后
  • 验证收益:对比优化前后执行计划与延迟数据
  • 控制成本:合并冗余索引,跟踪写延迟与空间占用

联合索引示例

联合索引示例
CREATE INDEX idx_order_user_status_time ON orders (user_id, status, created_at);
-- 支持:WHERE user_id=? AND status=? ORDER BY created_at
-- 范围条件之后的列,通常无法继续用于等值定位
索引是否生效要用执行计划验证:函数包裹列、隐式类型转换都会让索引失效。

易错点

  • 对低选择性列建索引,写入变慢且查询收益有限
  • 查询列被函数包裹,索引无法命中

数据来源与参考

  • 《高性能 MySQL(第 4 版)》
  • MySQL 8.0 Reference Manual:Optimization and Indexes
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌