14

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

通过该EXPLAIN命令,我发现 MySQL 选择了 index ACD。所以我不断地用更多的值填充表,我意识到 MySQL 在上面的索引之间切换(并不总是相同的)。

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

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

4

2 回答 2

9

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

我得出的结论是,使用 an 解决此问题的方法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。

于 2012-03-23T09:43:51.380 回答
0

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

WHERE A=1 AND B=2

A那么 MySQL 可以在or上使用索引AB,但AB最好。ACB无法使用,因为索引被另一列拆分

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

在这种情况下,当您查找 A 和另一列时,三列复合键将无济于事。如果您的查询使用AND而不是OR. 上的索引ABC将对

WHERE A=1 AND B=2 AND C=3
于 2012-03-22T21:27:23.543 回答