4

我有一个有两个索引的表,其中一个是某个查询的更快覆盖索引。但是,mySQL (5.1) 没有选择正确的索引。我已经查看了这个查询的解释并做了一些速度测试,如果你强制使用它会产生很大的不同。

有什么方法可以检查它如何选择索引以及它基于什么标准?

4

1 回答 1

7

这将使用您需要的索引(如果它可用):

SELECT  *
FROM    table FORCE INDEX (myindex)

MySQL收集并使用表统计信息来估计索引的基数。

它保存在information_schema.statistics.

在可用于过滤的两个索引中,MySQL选择具有更大基数的一个。

如果有两个大基数的索引,可以同时选择INDEX MERGE

在一个索引可以服务的WHERE条件下,另一个可以服务ORDER BYMySQL似乎更喜欢第一个

然而,在后一种情况下,最好在两个列上创建一个复合索引,它可以服务于两个子句。

于 2009-05-29T11:38:37.523 回答