任何使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。
答
我的猜测是select * from TableA
不需要20毫秒。开始返回结果需要20毫秒。
虽然我要回答你的问题,你应该重新访问你的数据结构。使用相同布局的多个表通常是一个非常糟糕的主意。相反,你应该有一个包含所有行的单个表。
但是,你似乎没有。
尝试运行union all
没有括号:
select * from TableA union all
select * from TableB;
MySQL有物化子查询的习惯。我不确定它是否与union all
子查询做到了这一点,但考虑到您对问题的描述,可能会出现这种情况。
'DESCRIBE'和'EXPLAIN',请。 – bishop
如果你的表A有150万行,那么只有20ms才能返回所有这些行。如果你从5M到40M行的任何地方返回,它将花费很多时间 - 可能还有其他一些你可以优化的东西,比如检索数据的方法(使用游标,将所有内容返回等等)。 )。 – nos