【问题标题】:In Mysql, why do unused indexes affect the query plan?在Mysql中,为什么未使用的索引会影响查询计划?
【发布时间】:2014-07-18 04:46:06
【问题描述】:

我已经看过好几次了,但我可能误解了 EXPLAIN 查询计划。

假设我有一张桌子(col1,col2)。 我想将它与 col1 和 col2 上的另一个表一起加入。 所以我创建了一个索引(col1,col2)。 有时,EXPLAIN 表明索引没有被使用。也许使用了其他一些低效的索引,或者根本没有使用。

但是如果我创建另一个索引(col1),那么使用第一个索引(col1,col2)。

以前有人遇到过这种情况吗?您知道为什么会发生这种情况吗?

我的理论是未使用的索引提供了一些关于表的更准确的统计信息,提示查询计划使用第一个索引。但我对 mysql 的内部工作原理还不够熟悉,不知道这是否属实或如何证明。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    ALTER TABLEstates 的 MySQL 文档可能需要在其上运行 ANALYZE TABLE 以刷新索引基数,我认为这是您所看到的行为的一个因素。此外,查询优化器通常处理与填充表完全不同的空(或接近)空表,并且当只有几行时,它通常会执行全表扫描而不是使用索引。对于我自己在$work 的开发,我不能依赖我的开发数据库的EXPLAIN 输出。

    【讨论】:

    • 这是有道理的。不幸的是,我无法再用我的数据库、查询和索引重现该问题——可能是因为在使用过程中数据统计信息已更新。这似乎是正确的答案,尽管我无法用我的数据证明这一点。让我给别人一个回答的机会,但这看起来是对的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2010-11-14
    • 2015-06-05
    • 1970-01-01
    • 2011-04-22
    相关资源
    最近更新 更多