我有一个包含INT列的200k条目表。我想创建一个索引来加快查询速度。这是我想要执行的查询:SELECT A,B,C,D,E FROM table WHERE A=23 and (B=45 or C=43)
。我创建了以下索引:B
,ACD
,C
,ABC
。
使用EXPLAIN
命令,我发现MySQL选择了索引ACD
。所以我一直用更多的值填充表格,我意识到MySQL正在上面的索引之间切换(并不总是相同的)。
由于存在许多插入,因此具有各种索引会导致性能问题,我们可以假设此表由其他需要不同列的查询访问,其中每个索引都有意义。
我知道USE INDEX()
,但我想了解我们是否应该相信MySQL选择正确的索引。
答案 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可以使用A
或AB
上的索引,但AB
最好。由于索引被另一列
ACB
使用您给定的WHERE子句,我认为MySQL查询引擎不能使用多个索引。我会创建AB
和AC
并使用FORCE INDEX,查看哪一个更快。
在这种情况下,三列复合键无效,因为您正在查看A和另一列。如果您的查询使用AND
而非OR
,则此类密钥会有所帮助。 <{1}}上的索引对
ABC