【问题标题】:Can [My]SQL combine multiple overlapping composite indexes?[My]SQL 可以组合多个重叠的复合索引吗?
【发布时间】:2010-08-14 13:18:07
【问题描述】:

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

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

我希望它应该能够,但找不到任何直接的确认。感谢您的意见。

【问题讨论】:

    标签: sql mysql indexing


    【解决方案1】:

    我也找不到任何明确的答案,但我认为答案取决于查询和表中的数据。如果查询引用任何最左侧的列,则可以使用多列索引。使用您的(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

    【讨论】:

    • 这个页面似乎支持你:dev.mysql.com/doc/refman/5.0/en/index-merge-optimization.html 它说 MySQL 5.0 之前的版本不会使用多个索引。但是现在,很明显,它可以在某些情况下使用多个索引。我想知道 MySQL 是否需要相当大的表才能决定执行索引合并。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多