SQL QUERY - UNION - 多个相同的表需要很长时间

时间:2016-08-19 12:24:56

标签: mysql sql-server

我对数据库的查询存在很大问题。

我解释了我的问题,我有11个相同的表(备份)。表格完全相同,我需要从中提取数据,但这需要很长时间。

我正在使用这样的联合查询:

select id, name, ... from table_1 WHERE (...)
UNION
select id, name, ... from table_3 WHERE (...)
UNION 
select id, name, ... from table_2 WHERE (...)
... ORDER BY created DESC LIMIT 0,50

但只有查询大约需要16秒!数据库没有那么久的数据......

table_1 = 1.3k
table_2 = 17k
table_3 = 10k
table_4 = 10k 
...     = 10k
table_11= 140K

您能帮我优化此查询吗?非常感谢!

2 个答案:

答案 0 :(得分:4)

首先,不要使用UNION - 除非您想要产生删除重复项的开销。相反,请使用UNION ALL

select id, name, ... from table_1 WHERE (...)
UNION ALL
select id, name, ... from table_3 WHERE (...)
UNION ALL
select id, name, ... from table_2 WHERE (...)
...
ORDER BY created DESC
LIMIT 0, 50;

您还可以使用适用于WHERE子句的索引来提高性能。但是,您的问题没有足够的信息。

实际上,另一个优化是在联合之前从每个子查询获取前50行:

(select id, name, ... from table_1 WHERE (...) ORDER BY created DESC LIMIT 50)
UNION ALL
(select id, name, ... from table_3 WHERE (...) ORDER BY created DESC LIMIT 50)
UNION ALL
(select id, name, ... from table_2 WHERE (...) ORDER BY created DESC LIMIT 50)
...
ORDER BY created DESC
LIMIT 0, 50;

这会减少最终ORDER BY的数据量,这也应该加快速度。

答案 1 :(得分:0)

UNION尝试从每个表中挑选出所有不同的查询。如果您确定没有重复项,那么您可以使用UNION ALL。

如果您担心重复项,请使用UNION ALL将所有内容选择到临时表或子查询中,然后将GROUP BY返回到每个要删除的列。

要获得真实指示,请在工具栏中查看“估算执行计划”。单击此按钮将显示查询的哪个部分需要很长时间,并会建议进行改进。