使用OR子句表现缓慢

时间:2018-04-02 06:58:27

标签: mysql myisam

我有一张大约100万行的MyISAM表。

SELECT * FROM table WHERE colA='ABC' AND (colB='123' OR colC='123');

上面的查询需要10秒才能运行。所有相关列都已编入索引。

但是当我把它拆分成如下......

SELECT * FROM table WHERE colA='ABC' AND colB='123';
SELECT * FROM table WHERE colA='ABC' AND colC='123';

每个单独的查询需要0.002秒。

什么给出,以及如何优化表/查询?

1 个答案:

答案 0 :(得分:0)

( SELECT * FROM table WHERE colA='ABC' AND colB='123' )
UNION DISTINCT
( SELECT * FROM table WHERE colA='ABC' AND colC='123' )
;

并且

INDEX(colA, colB),
INDEX(colA, colC)

你应该考虑转移到InnoDB,尽管这个问题可能无关紧要。

以下是UNION的工作原理:

  1. 执行每个SELECT。由于建议的索引,它们将非常有效。
  2. 将结果收集到tmp表中。
  3. 删除临时表并传送结果行。
  4. 所有行被触及'在原始查询中(使用OR)。

    使用UNION

    1. SELECTs
    2. 仅触及必要的行
    3. 这些行被写入tmp表。
    4. 重读这些行。 (去除可能涉及多次触摸行。)