这是一个效率低下的查询吗?

时间:2013-03-27 20:37:11

标签: mysql

假设table1和table2都有大量的行(即数十万),以下是一个低效的查询?

编辑:按字段顺序添加。

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

4 个答案:

答案 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 allgroup 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为自己找到这个。