2017-07-25 79 views
0

我想與df2加入表df1。問題是,df2是一個非常長的表,有四千萬觀察值,而且在等待超過48小時後我無法在MySQL中獲得連接結果。所以我想問問是否有任何方法可以提高這種連接的效率。我已經爲兩個表格的標籤列添加了一個索引。如何提高MySQL連接效率?

DF1和DF2具有相同的結構,這裏有一個例子:

|Id  |Tag 
| -------- | -------------------------------------------- 
|1   |c# 
|1   |winforms 
|1   |type-conversion 
|1   |decimal 
|2   |.net 
|2   |decimal 
|3   |.net 
|3   |math 

兩個表有兩列,標識和標籤。但是,Id或Tag都不是唯一標識的密鑰。只有Id + Tag可以是唯一標識的密鑰。我需要的是在列標籤上省略df1與df2的連接。這裏是我的代碼:

CREATE TABLE matched_outcome AS 
SELECT df1.Id AS df1_Id, df2.Id AS df2_Id, COUNT(df2.Tag) AS overlapping 
FROM df1 
LEFT JOIN df2 ON df2.Tag=df1.Tag 
GROUP BY df1.Id, df2.Id; 
+1

在這些列上添加索引。這將有所幫助。在這之前,運行EXPLAIN PLAN並查找表掃描。如果你看到一個,你會知道添加索引將會有所幫助。 – duffymo

+0

@duffymo對不起,我忘了提及之前,我已經在兩個表格的標籤列上添加了一個索引。 – Xiaomeng

+0

4000萬行?你完蛋了。您需要在該大表上過濾以減小JOIN的大小。 – duffymo

回答

1

我會嘗試這兩個表上的(標籤,ID)組合索引的順序。

如果檢索到此索引,請使用執行計劃進行檢查。

標籤列上的分區表可能幫助,因爲分區內部創建多個較小的表。你

還應該運行這一點,並檢查您的過程中被卡住 SHOW FULL PROCESSLIST

這可能給你進一步的線索。

0

當你做JOIN...GROUP BY時會發生「充氣 - 放氣綜合徵」。它通常會導致聚合錯誤(高)值(COUNT,SUM等)。

我對查詢應該做什麼來幫助您重寫它感到困惑。你能詳細說明嗎?爲什麼LEFT?什麼是「重疊」?

有時候,解決辦法是做這樣的事情:

SELECT df1.some_stuff, 
     (SELECT COUNT(*) FROM df2 WHERE Tag = df1.Tag) AS overlapping 
    FROM df1; 

這是否甚至接近你想要什麼?

+0

我實際上想要做的是:https://stackoverflow.com/questions/45024037/how-to-merge-by-a-column-of-collection-using-python-pandas。最初,我試圖使用被接受的答案提出的Python熊貓。但是,最後一步(與df2匹配df1)存在問題。所以我決定用MySQL來完成最後一步。 – Xiaomeng

+0

''第三方軟件阻礙另一種情況? '' –