我对数据库的查询存在很大问题。
我解释了我的问题,我有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
您能帮我优化此查询吗?非常感谢!
答案 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返回到每个要删除的列。
要获得真实指示,请在工具栏中查看“估算执行计划”。单击此按钮将显示查询的哪个部分需要很长时间,并会建议进行改进。