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
相关产品推荐
相关产品推荐

