4

假设 table1 和 table2 都有大量的行(即几十万),下面的查询是不是效率低下?

编辑:添加了按字段排序。

SELECT * FROM (
  SELECT title, updated FROM table1
  UNION
  SELECT title, updated FROM table2
) AS query
ORDER BY updated DESC
LIMIT 25
4

4 回答 4

2

这应该更快 - 但是我看不到 ORDER BY 那么你真正想要什么 25 条记录?

SELECT * FROM (
  SELECT title FROM table1 LIMIT 25
  UNION
  SELECT title FROM table2 LIMIT 25
) AS query
LIMIT 25
于 2013-03-27T20:39:55.187 回答
2

如果您绝对需要不同的结果,另一种可能性是使用union allandgroup by子句:

SELECT title FROM (
  SELECT title FROM table1 group by title
  UNION ALL
  SELECT title FROM table2 group by title
) AS query
group by title
LIMIT 25;

在测试数据库 (at) 中的两个表中的索引 ID 列上不使用该limit子句进行测试,每个表都有约 920K 行,$work导致上面的查询超过一秒,通过 a 大约 17 秒union

于 2013-03-27T20:48:12.460 回答
0

UNION必须进行额外的传递才能获取distinct记录,因此您应该使用UNION ALL.

于 2013-03-27T20:38:42.873 回答
0

是的,在内部查询中使用 order by 和 limits。

SELECT * FROM (
  (SELECT title FROM table1 ORDER BY title ASC LIMIT C)
  UNION
  (SELECT title FROM table2 ORDER BY title ASC LIMIT C)
) AS query
LIMIT 25

这只会通过 C 行而不是 N(数十万行)。ORDER BY 是必需的,并且应该在索引列上。

C 是一个启发式常数,应根据域进行调整。如果你只期望有几个重复,C=50-100 可能没问题。

您也可以使用 EXPLAIN 自己找出答案。

于 2013-03-27T20:49:50.150 回答