[英]Is this an inefficient query?
假设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
和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;
在两个表中的索引ID列上没有limit
子句的测试,在测试数据库中每个约920K行(在$work
),导致上面的查询超过一秒,通过union
大约17秒。
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自行查找。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.