基本上,如果我有一个包含复合索引(colA,colB,colC)和(colB,colD,colE)的表,MySQL是否能够利用它们在colB上的重叠来组合它们并加速涉及colA的查询,colB和colD,即使没有单个索引覆盖这三个特定列?
我尝试在这样的测试用例上使用EXPLAIN,但即使它将两个索引识别为可能的键,它只使用第一个。但是,我不知道这是因为它无法进行组合,或者因为优化器在给定行数的情况下认为不值得。
我希望它能够,但找不到任何直接的确认。感谢您的投入。
答案 0 :(得分:0)
我也找不到任何确定的答案,但我认为答案是它取决于查询和表格中的数据。如果查询引用任何最左列,则可以使用多列索引。使用(ColA, ColB, ColC)
索引,索引可用于引用(ColA)
,(ColA, ColB)
或(ColA, ColB, ColC)
的查询。您的其他索引也是如此。
当两个单独的索引可用时,MySQL优化器将在基于两个索引执行交集或使用单个索引之间进行选择,并过滤掉剩余的结果。我怀疑如果这两个单独的索引都是多列索引,并且查询引用索引的最左侧部分(如您的示例所做的那样ColA, ColB, ColC, ColD
),情况也是如此。
您可能会发现这些使用链接(但我认为其中任何一个都不会提供明确的答案):
MySQL手册
Multiple-Column Indexes
How MySQL Uses Indexes
MySQL性能博客
Multi Column indexes vs Index Merge