MySQL的。为“OR”查询创建索引

时间:2012-03-22 20:39:46

标签: mysql indexing explain

我有一个包含INT列的200k条目表。我想创建一个索引来加快查询速度。这是我想要执行的查询:SELECT A,B,C,D,E FROM table WHERE A=23 and (B=45 or C=43)。我创建了以下索引:BACDCABC

使用EXPLAIN命令,我发现MySQL选择了索引ACD。所以我一直用更多的值填充表格,我意识到MySQL正在上面的索引之间切换(并不总是相同的)。

由于存在许多插入,因此具有各种索引会导致性能问题,我们可以假设此表由其他需要不同列的查询访问,其中每个索引都有意义。

我知道USE INDEX(),但我想了解我们是否应该相信MySQL选择正确的索引。

2 个答案:

答案 0 :(得分:7)

由于SQL语句中的OR,MySQL只是获得包含A的第一个索引,即ACD

我得出的结论是,使用INDEX解决此问题的方法是进行两次单独的查询。 SELECT A,B,C,D,E FROM table WHERE A=23 AND B=45将使用INDEX ABC,然后SELECT A,B,C,D,E FROM table WHERE A=23 AND C=43将使用INDEX ACD。这可以通过(...) UNION (...)一步完成,结果更快,只使用INDEX。

答案 1 :(得分:0)

Mysql只能使用复合索引的“最左边”部分。即,如果你的where子句看起来像

WHERE A=1 AND B=2

然后MySQL可以使用AAB上的索引,但AB最好。由于索引被另一列

拆分,因此无法使用ACB

使用您给定的WHERE子句,我认为MySQL查询引擎不能使用多个索引。我会创建ABAC并使用FORCE INDEX,查看哪一个更快。

在这种情况下,三列复合键无效,因为您正在查看A和另一列。如果您的查询使用AND而非OR,则此类密钥会有所帮助。 <{1}}上的索引对

有用
ABC