任何使UNION ALL运行速度更快的方法?

任何使UNION ALL运行速度更快的方法?

问题描述:

我有很多完全相同的表格。 TableA,TableB,TableC,TableD等,我想从中创建视图。 做select * from TableA需要20ms,做select * from tableB需要20ms,但做 (select * from TableA) union all (select * from TableB)需要20分钟。 这些表具有完全相同的列。 my.cnf中是否有需要更改的设置,或创建运行速度更快的视图的方法?所有的桌子都有1.5米到10米左右的排。解释任何使UNION ALL运行速度更快的方法?

PRIMARY TableA ALL     28808685  
UNION TableB ALL     15316215  
UNION RESULT <union1,2> ALL  Using temporary 

表结构的

结果: 10 VARCHAR(20)的,5倍无符号的INT。

+0

'DESCRIBE'和'EXPLAIN',请。 – bishop

+0

如果你的表A有150万行,那么只有20ms才能返回所有这些行。如果你从5M到40M行的任何地方返回,它将花费很多时间 - 可能还有其他一些你可以优化的东西,比如检索数据的方法(使用游标,将所有内容返回等等)。 )。 – nos

我的猜测是select * from TableA不需要20毫秒。开始返回结果需要20毫秒。

虽然我要回答你的问题,你应该重新访问你的数据结构。使用相同布局的多个表通常是一个非常糟糕的主意。相反,你应该有一个包含所有行的单个表。

但是,你似乎没有。

尝试运行union all没有括号:

select * from TableA union all 
select * from TableB; 

MySQL有物化子查询的习惯。我不确定它是否与union all子查询做到了这一点,但考虑到您对问题的描述,可能会出现这种情况。

+0

如果我有一个包含所有行的单个表,我将有250 + m行并且正在增长。 tableA和tableB的数据之间的区别在于tableA只有clientA的数据,而tableB只有clientB的数据。数据提供的专有工具从表中选择*然后处理数据并丢弃无用的工具。如果我们把它指向一张巨大的桌子,它会超时/耗尽内存并做各种愚蠢的事情。 – Dimi

+0

找出问题所在。这是第一个字节(或者它在mysql中的等同性)导致连接超时的时间。 Union ALL首先在服务器上生成该表,然后发送它。谢谢。 – Dimi