2016-08-19 23 views
0

我对数据库的查询有一个很大的问题。SQL QUERY - UNION - 多个相同的表需要很长时间

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

问题可能是在完整结果结束时的顺序。你有多少数据回来? –

+0

如果您正在使用,请避免使用任何内部查询。使用加入而不是。 – dhS

回答

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,这也应该加快速度。

+0

非常感谢,它的工作原理。 - 从16秒开始0.0205秒 –

+0

你还在吗?我无法在所有查询中使用限制。我使用分页器,我需要所有相关数据。不是每个表格只有50个,再次我有11秒完成查询 –

+0

@СергейПетров。 。 。您的问题中的查询只显示一个限制。第二种解决方案不适用于分页。但事实上,如果这是你想要做的事,你应该把所有的数据放在一个表中。这将简化查询并使其更易于优化。 –

0

UNION尝试从每个表中将所有不同的查询整理回来。如果你确定没有重复,那么你可以使用UNION ALL。

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

如需真实指示,请在工具栏中查看估计执行计划。点击它,它会告诉你什么部分的查询需要很长时间,并会提出改进建议。