假设table1和table2都有大量的行(即数十万),以下是一个低效的查询?
编辑:按字段顺序添加。
SELECT * FROM (
SELECT title, updated FROM table1
UNION
SELECT title, updated FROM table2
) AS query
ORDER BY updated DESC
LIMIT 25
答案 0 :(得分:2)
这应该更快 - 但是我看到没有ORDER BY那么你真正想要的是25条记录?
SELECT * FROM (
SELECT title FROM table1 LIMIT 25
UNION
SELECT title FROM table2 LIMIT 25
) AS query
LIMIT 25
答案 1 :(得分:2)
如果您绝对需要不同的结果,另一种可能性是使用union all
和group 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;
在测试数据库(limit
)中,每个行数约为920K的两个表中的索引ID列上没有$work
子句的情况下对此进行测试,导致上面的查询超过一秒通过union
约17秒。
答案 2 :(得分:0)
UNION
必须额外通过才能获取distinct
条记录,因此您应该使用UNION ALL
。
答案 3 :(得分: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为自己找到这个。