[My]SQL可以组合多个重叠的复合索引吗?

[My]SQL可以组合多个重叠的复合索引吗?,sql,mysql,indexing,Sql,Mysql,Indexing,基本上,如果我有一个具有复合索引(colA、colB、colC)和(colB、colD、colE)的表,MySQL是否能够利用它们在colB上的重叠来组合它们并加速涉及colA、colB和colD的查询,即使没有一个索引覆盖这三个特定列 我试着在这样的测试用例上使用EXPLAIN,但即使它将两个索引都识别为可能的键,它也只使用了第一个。但是,我不知道这是因为它无法进行组合,还是因为优化器认为在给定行数的情况下不值得这样做 我希望它能够,但找不到任何直接的确认。谢谢您的输入。我也找不到任何明确的答

基本上,如果我有一个具有复合索引(colA、colB、colC)和(colB、colD、colE)的表,MySQL是否能够利用它们在colB上的重叠来组合它们并加速涉及colA、colB和colD的查询,即使没有一个索引覆盖这三个特定列

我试着在这样的测试用例上使用EXPLAIN,但即使它将两个索引都识别为可能的键,它也只使用了第一个。但是,我不知道这是因为它无法进行组合,还是因为优化器认为在给定行数的情况下不值得这样做


我希望它能够,但找不到任何直接的确认。谢谢您的输入。

我也找不到任何明确的答案,但我认为答案是它取决于查询和表中的数据。如果查询引用最左边的任何列,则可以使用多列索引。使用
(ColA,ColB,ColC)
索引,该索引可用于引用
(ColA)
(ColA,ColB)
(ColA,ColB,ColC)
的查询。同样的原则也适用于其他索引

当有两个单独的索引可用时,MySQL优化器将在基于这两个索引执行交集或使用单个索引以及过滤掉其余结果之间进行选择。如果这两个单独的索引都是多列索引,并且如果查询引用了索引的最左边部分(就像您的示例中使用
ColA、ColB、ColC、ColD
时所做的那样),我怀疑同样的情况也会发生

您可能会发现这些有用的链接(但我认为它们中的任何一个都不会提供明确的答案):

MySQL手册

MySQL性能博客

我也找不到任何明确的答案,但我认为答案取决于查询和表中的数据。如果查询引用最左边的任何列,则可以使用多列索引。使用
(ColA,ColB,ColC)
索引,该索引可用于引用
(ColA)
(可乐,可乐)
(可乐,可乐,可乐)
。同样的原则适用于其他索引

当两个单独的索引可用时,MySQL优化器将选择基于两个索引执行交集,或者使用单个索引,然后过滤掉剩余的结果。如果这两个单独的索引都是多列索引,并且查询引用的是索引的最左端,我怀疑情况也是如此NDEX(如您的示例中使用的
ColA、ColB、ColC、ColD

您可能会发现这些有用的链接(但我认为它们中的任何一个都不会提供明确的答案):

MySQL手册

MySQL性能博客

这个页面似乎在支持您:它说5.0之前的MySQL版本不会使用多个索引。但现在,很明显,在某些情况下,它可以使用多个索引。我想知道MySQL是否需要一个相当大的表来决定执行索引合并。这个页面似乎在支持您:它说MySQ的版本5.0之前的L不会使用多个索引。但现在,很明显,在某些情况下,它可以使用多个索引。我想知道MySQL是否需要一个相当大的表来决定执行索引合并。