MySQL cars表索引设置咨询:单列索引还是多组联合索引?
针对你的cars表索引方案建议
先明确你的核心查询模式:所有查询都包含active=1这个过滤条件,然后分别搭配model、year或brand的等值匹配。那咱们来拆解两种方案的优劣,帮你选最优的:
方案1:单独给active、model、year、brand建索引
- 这种方案效率很低,而且浪费资源。比如你执行
SELECT * FROM cars WHERE active=1 AND model='A3'时,数据库通常只能用到active或model其中一个单独索引(优化器很难同时利用两个单列索引),没法高效过滤出同时满足两个条件的记录。 - 另外,四个单独索引会占用更多存储空间,每次插入、更新数据时,数据库都要更新这四个索引,维护成本更高。
方案2:建(active,model)、(active,year)、(active,brand)三组联合索引
- 这才是完美适配你查询场景的方案!因为你的每个查询都是「active=1 + 另一列等值匹配」的模式,把
active放在联合索引的最左侧,数据库可以先快速定位到所有active=1的行,然后直接在这个小范围的子集里匹配第二列的条件,查询效率拉满。 - 举个实际例子:当你执行
SELECT * FROM cars WHERE active=1 AND year=2017时,(active,year)联合索引会先过滤出active为1的所有记录,接着在这些记录里快速找到year=2017的条目——完全命中索引,哪怕你查的是SELECT *需要回表,经过索引过滤后的数据集已经很小了,开销几乎可以忽略。
额外小提示
- 如果你偶尔会有只查
active=1的需求(不带其他条件),那这三组联合索引里的任意一个都能满足,因为联合索引的前缀列是可以单独被利用的,所以不需要额外再建一个单独的active索引。 - 记住联合索引的核心原则:把每次查询都必带的、过滤性强的列放在最前面,这里
active是所有查询的基础条件,放在最左绝对是正确的选择。
内容的提问来源于stack exchange,提问作者KMatko
相关产品推荐
相关产品推荐

