2016-08-19 24 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將每個要返回的列刪除它們。

如需真實指示,請在工具欄中查看估計執行計劃。點擊它,它會告訴你什麼部分的查詢需要很長時間,並會提出改進建議。