1

我对以下表格有一个缓慢的查询。

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 新手,但是否有更快的方法来进行此查询?

4

3 回答 3

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
)
于 2013-07-06T05:00:11.153 回答
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 查询将针对表的每一行运行,因此需要更多时间。加入查询将只运行一次。

于 2013-07-06T05:05:06.520 回答
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 表列表中排在第一位,因此可以有效地访问表,而不是相反,当索引视图结果必须对表的每一行进行表扫描时.

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

这个查询应该执行得很好。

于 2013-07-06T05:16:06.170 回答