1

所以我有这个查询

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 并使用联合,但我宁愿不这样做,因为我的实际查询比这大得多,所以请建议替代方法。

4

2 回答 2

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 列不存在,还要在它们上添加索引。结束说明,全表扫描并不总是最糟糕的选择。

ALTER TABLE Table2 ADD INDEX (field1 , field3 );

这也可能加快速度。

于 2013-10-09T20:28:15.403 回答
0
SELECT
  *
FROM table1 i
  LEFT JOIN table2 k
    ON k.field1 = i.field2
WHERE EXISTS (subquery)

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

于 2013-10-09T20:26:53.737 回答