繁体   English   中英

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

[英]SQL QUERY - UNION - multiple same tables takes long time

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

我解释了我的问题,我有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

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

首先,请勿使用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的数据量,这也可以加快处理速度。

UNION尝试从每个表中整理出所有不同的查询,从而使它们全部返回。 如果您确定没有重复项,则可以改用UNION ALL。

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

要获得真实的指示,请在工具箱中查看“估计的锻炼计划”。 单击此按钮,它将向您显示查询的哪个部分花费很长时间,并将提出改进建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM