452 字
2 分钟
联合索引应该如何设计
  1. 1MySQL 面试复习导读:知识地图与阅读路线
  2. 2MySQL 存储引擎怎么选:InnoDB、MyISAM 与 MEMORY
  3. 3MySQL 索引类型与 B+ 树:结构、分类和失效场景
  4. 4MySQL B+ 树查询全过程:从根节点到页目录
  5. 5InnoDB 聚簇索引与二级索引:什么是回表
  6. 6MySQL 覆盖索引:如何避免回表
  7. 7MySQL 联合索引的最左前缀匹配原则
  8. 8MySQL 索引下推:把过滤提前到存储引擎
  9. 9MySQL 事务异常读:脏读、不可重复读与幻读
  10. 10MySQL 四种事务隔离级别与选型取舍
  11. 11MySQL MVCC:Undo Log、版本链与 ReadView
  12. 12MySQL InnoDB 锁的分类:行锁、表锁与意向锁
  13. 13MySQL 乐观锁与悲观锁:冲突少时重试,冲突多时排队
  14. 14MySQL 发生死锁怎么办:检测、定位与处理
  15. 15MySQL 事务的 ACID 特性分别是什么
  16. 16InnoDB Redo Log 如何保证崩溃恢复
  17. 17InnoDB Undo Log 的回滚与 MVCC 作用
  18. 18MySQL Binlog 是什么,和 Redo Log 有什么区别
  19. 19一条 MySQL 查询从连接到返回结果经历什么
  20. 20如何用 EXPLAIN 读懂 MySQL 执行计划
  21. 21MySQL 为什么需要 Redo Log 与 Binlog 两阶段提交
  22. 22MySQL 崩溃后如何恢复已提交事务
  23. 23InnoDB Buffer Pool 如何提升查询与写入性能
  24. 24联合索引应该如何设计本文
  25. 25InnoDB 快照读与当前读如何处理幻读
  26. 26联合索引范围条件之后的列还能使用吗
  27. 27MySQL 索引看起来失效了,如何判断优化器的选择
  28. 28MySQL 8.0 如何定位并处理 InnoDB 死锁
  29. 29MySQL 慢查询如何定位和优化
  30. 30MySQL 的 ORDER BY、GROUP BY 与 filesort
  31. 31MySQL 普通索引和唯一索引如何选择
  32. 32MySQL 主从复制的基本流程是什么
  33. 33MySQL 主从延迟和读写分离如何处理
  34. 34MySQL 深分页为什么慢,如何改写
  35. 35InnoDB 主键应该如何设计
  36. 36MySQL 字符集与排序规则有什么区别
  37. 37数据库范式与反范式如何取舍

联合索引应从代表性查询出发,而不是把所有高频字段拼在一起。假设常见查询是 WHERE tenant_id=? AND status=? AND created_at>=? ORDER BY created_at DESC LIMIT 50,候选索引可为 (tenant_id,status,created_at):前两列等值约束形成前缀,时间范围和排序字段位于其后。设计还要检查选择性、字段长度、写入模式和其他查询是否能复用此前缀。

索引顺序不存在固定的“区分度最高永远放第一”口诀。应优先让高频查询的等值条件形成连续前缀,再考虑范围条件、排序和覆盖需求。范围列之后的列通常不能继续缩小同一连续扫描区间,但 ICP 可能利用索引内后列过滤候选记录。若把大字段加入索引以覆盖查询,会增加索引体积和写放大,应比较回表节省与存储成本。

CREATE INDEX idx_order_lookup
ON orders (tenant_id, status, created_at);

用真实参数执行 EXPLAIN,观察 key、rows、排序和回表;同时检查数据分布、索引冗余与更新代价。不要仅凭 SQL 中 WHERE 的书写顺序决定索引,也不要认为优化器必然使用新建索引。

追问#

  1. 等值条件谁放前面? 按查询复用、选择性、排序需求和列宽共同判断;同一组等值列有时可互换,但不能脱离实际查询设计。
  2. 范围列后面的列完全没用吗? 通常不能继续缩小索引范围,但可能用于 ICP、覆盖或排序等其他环节,须验证执行计划。
  3. 是否应该把 SELECT 所有列都加入索引? 通常不应;覆盖收益要与索引膨胀、写放大和缓存命中下降权衡。
联合索引应该如何设计
https://blog.xqcherry.top/posts/interview/mysql/composite-index-design/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0