You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL复合索引列顺序怎么选?含date列时索引组合如何设置?

复合索引创建问题解答

基础问题(仅client_id、is_recurring列场景)

  • 首先明确:SQL语句中WHERE子句的条件书写顺序,完全不影响复合索引的匹配使用,数据库优化器会自动调整条件顺序来适配可用的索引,不需要为不同的条件书写顺序创建不同列顺序的复合索引。
  • 复合索引列顺序的核心原则是:等值查询列优先,区分度高的列优先。你场景中的两个列都是等值查询,client_id的区分度远高于仅包含0/1两个枚举值的is_recurring,因此只需要创建compost_index('client_id','is_recurring')即可,不需要创建反过来的索引,也不需要两个都建。
  • 额外优化建议:创建上述复合索引后,原有的client_id单列索引可以删除,因为复合索引的前缀天然包含client_id,可以覆盖所有仅按client_id过滤的查询场景,减少冗余索引的维护开销。

补充问题(新增date列场景)

复合索引针对范围查询、排序的规则是:等值查询列全部放在前面,范围/排序列放在最后,根据你的常用查询场景,推荐的索引组合如下:

  • 如果常用查询同时带client_id、is_recurring两个等值条件,再对date做范围过滤或者排序,直接创建compost_index('client_id','is_recurring','date')即可,该索引既可以满足前两列的等值过滤,还能避免排序时的文件排序(filesort)操作,大幅提升查询性能。
  • 如果存在仅带client_id等值条件+date范围/排序的查询场景,可以额外创建compost_index('client_id','date')。
  • 不要将date列放在等值查询列的前面,会导致前缀索引失效,大幅降低索引过滤效率。

内容的提问来源于stack exchange,提问作者Jaber Al Nahian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 20:39:00