2017-02-21 38 views
0

我有很多完全相同的表格。 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

回答

1

我的猜測是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