假设 table1 和 table2 都有大量的行(即几十万),下面的查询是不是效率低下?
编辑:添加了按字段排序。
SELECT * FROM (
SELECT title, updated FROM table1
UNION
SELECT title, updated FROM table2
) AS query
ORDER BY updated DESC
LIMIT 25
假设 table1 和 table2 都有大量的行(即几十万),下面的查询是不是效率低下?
编辑:添加了按字段排序。
SELECT * FROM (
SELECT title, updated FROM table1
UNION
SELECT title, updated FROM table2
) AS query
ORDER BY updated DESC
LIMIT 25
这应该更快 - 但是我看不到 ORDER BY 那么你真正想要什么 25 条记录?
SELECT * FROM (
SELECT title FROM table1 LIMIT 25
UNION
SELECT title FROM table2 LIMIT 25
) AS query
LIMIT 25
如果您绝对需要不同的结果,另一种可能性是使用union all
andgroup 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
。
UNION
必须进行额外的传递才能获取distinct
记录,因此您应该使用UNION ALL
.
是的,在内部查询中使用 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 自己找出答案。