在Mysql中,为什么未使用的索引会影响查询计划?

kan*_*ane 6 mysql

我已经多次看过这个,但我可能误解了EXPLAIN查询计划.

假设我有一个表(col1,col2).我想在col1和col2上加入另一个表.所以我创建了一个索引(col1,col2).有时,EXPLAIN显示索引未被使用.也许使用其他一些低效的索引或根本不使用.

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

有没有人曾经遇到过这种情况?你知道为什么会这样吗?

我的理论是,未使用的索引提供了一些关于表的更准确的统计信息,这些统计信息提示查询计划使用第一个索引.但是我对mysql的内部工作方式不太熟悉,知道这是真的还是如何证明它.

Lee*_*eft 2

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