[英]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.