带有OR语句的mysql返回全表扫描

时间:2013-10-09 19:25:01

标签: mysql sql performance union explain

所以我有这个查询

SELECT
  *
FROM table1 i
  LEFT JOIN table2 k
    ON k.field1 = i.field2
WHERE  k.field3 IN
                   (632569, 658869, 1253996, 2112571, 164715, 165082, 658665, 180550, 323455, 165579, 164665, 282091, 164605, 164714, 626888, 165277, 164196)
                    OR i.field2
                     IN
                      (632569, 658869, 1253996, 2112571, 164715, 165082, 658665, 180550, 323455, 165579, 164665, 282091, 164605, 164714, 626888, 165277, 164196);

解释会显示它正在table1(i)上执行全表扫描。有没有办法改进查询,以便它不会进行全表扫描?

我知道我可以将它拆分为2并使用union,但我不愿意这样做,因为我的实际查询比这大得多,所以请建议其他方法。

2 个答案:

答案 0 :(得分:0)

SELECT
  *
FROM table1 i
  LEFT JOIN table2 k
    ON k.field1 = i.field2
WHERE EXISTS (subquery)

你想要那样的东西吗?注意空值!!

答案 1 :(得分:0)

SELECT
  *
FROM table1 i
  LEFT JOIN table2 k
    ON k.field1 = i.field2 AND  k.field3 IN
                   (632569, 658869, 1253996, 2112571, 164715, 165082, 658665, 180550, 323455, 165579, 164665, 282091, 164605, 164714, 626888, 165277, 164196)
    OR i.field2 IN
                   (632569, 658869, 1253996, 2112571, 164715, 165082, 658665, 180550, 323455, 165579, 164665, 282091, 164605, 164714, 626888, 165277, 164196);

尝试在ON子句中指定条件,而不是在WHERE中指定条件。如果JOIN列不存在,则在JOIN列上添加索引。结束注释,全表扫描并不总是最差的选项。

ALTER TABLE Table2 ADD INDEX (field1 , field3 );

这也可能加快速度。