2017-08-10 180 views
-2

我在MySQL數據庫中有3個表,我想寫一個連接這3個表的csv文件。一個是master_table,另外兩個是table1和table2。這是我的查詢加入三個表優化在MySQL中連接3個表的性能

USE db_test; 
SELECT 'feature1', 'feature2', 'feature3', 'feature4', 'feature5', 'feature6', 'feature7', 'feature8' 
UNION ALL 
SELECT master_table.feature1, master_table.feature2, master_table.feature3, master_table.feature4, master_table.feature5, table1.feature6, table1.feature7, table2.feature8 
FROM (master_table RIGHT JOIN table1 
ON master_table.feature1 = table1.feature11) 
LEFT OUTER JOIN table2 
ON table2.feature22 = master_table.feature2 
INTO OUTFILE 'datafile.csv' 
CHARACTER SET 'utf8' 
FIELDS TERMINATED BY '\t' 
LINES TERMINATED BY '\n'; 

此查詢工作正常。我在64GB RAM和8個內核的服務器上運行它。

問題 主表有大約35萬行。 table1有30萬行,而table 2有大約100行。運行此查詢並寫入一個csv文件需要將近一個小時。我希望有一些方法可以寫出比這更快的查詢。我無法相信對這一小部分數據的查詢需要在服務器上花費一個小時。

+1

你有'table1.feature11'上的索引嗎?你可以顯示查詢執行計劃嗎? – Thilo

+1

帶列標題的靜態行是一件很奇怪的事情。爲什麼不只給數據列一個友好的別名(或者將演示文稿留給客戶)呢? – Thilo

+1

重要的重新設計是需要的。任何時候你有名爲x1,x2,x3等的列,你都可以確定你的設計不是最優的。 – Strawberry

回答

1

您很可能缺少索引。如果您可以發佈SHOW CREATE TABLE master_table,SHOW INDEX FROM master_table,SHOW INDEX FROM table1,SHOW INDEX from table2,我們可以識別您發佈的查詢所需的缺失索引。我們也會盡快知道表中有多少行以及索引列的基數。
如果您還可以在您的原始問題中添加
的結果顯示全局狀態和顯示全局變量您的某些同行可能會檢查您的系統容量並檢查與配置改進相關的許多問題。

0

我想出了答案,它可能對像我這樣的數據庫初學者有幫助。尤其在MySQL中。

ANSWER上述評論幫助我研究了索引的核心,並從this tutorial索引了我的專欄。我索引我用作外鍵的所有列(在我的情況下有2列)feature1feature2。結果非常快。大約需要70 minutes的查詢花了差不多7 seconds這是1000X更快

0

祝賀您使用您的學術經驗加社區建議的地方看看。作爲後續,如果您還可以在您的原始問題中添加 顯示全局狀態和顯示全局變量的結果,您的某些同行可能會檢查您的系統容量,並檢查與配置改進相關的許多問題以減少7秒。按下,繼續學習。