对多个子查询使用“OR”是否最佳?

时间:2013-07-06 04:57:53

标签: mysql

我对以下表单的查询速度很慢。

SELECT DISTINCT * FROM table e
WHERE e.eid in (select eid from view1)
OR e.eid in (select eid from view1)
OR e.eid in (select eid from view2)
OR e.eid in (select eid from view3)
OR e.eid in (select eid from view4)
OR e.eid in (select eid from view5)

我是MySQL的新手,但有更快的方法来进行此查询吗?

3 个答案:

答案 0 :(得分:1)

可能正在使用UNION这样:

SELECT DISTINCT * FROM table e
WHERE e.eid IN
(
    SELECT eid FROM view1
    UNION
    SELECT eid FROM view2
    UNION
    SELECT eid FROM view3
    UNION
    SELECT eid FROM view4
    UNION
    SELECT eid FROM view5
)

答案 1 :(得分:1)

您可以在查询中使用Union。

SELECT DISTINCT e.* 
FROM table e
INNER JOIN
(
SELECT eid FROM view1
UNION ALL
SELECT eid FROM view2
UNION ALL
SELECT eid FROM view3
UNION ALL
SELECT eid FROM view4
UNION ALL
SELECT eid FROM view5
) AS B ON e.eid = B.eid

您应该使用连接查询而不是使用IN查询。 IN查询将针对表的每一行运行,因此需要更多时间。加入查询只会运行一次。

答案 2 :(得分:1)

使用id IN (unioned subquery)通常效果不佳。

尝试在联合子查询上使用标准联接:

SELECT a.*
FROM (
  SELECT eid FROM view1
  UNION
  SELECT eid FROM view2
  UNION
  SELECT eid FROM view3
  UNION
  SELECT eid FROM view4
  UNION
  SELECT eid FROM view5
) e
JOIN table a ON a.id = e.eid

这里重要的是视图中的ID来自FROM表列表中的 first ,因此可以有效地访问该表,而不是在索引视图结果中具有相反的方式对每一行表进行表扫描。

另请注意,不需要DISTINCT,因为子查询中的UNION消除了重复项。

此查询应该可以很好地执行。