2016-05-10 94 views
0

我有一個大的主表,TableA有1200萬條記錄。它的核心是:在特定情況下更快更新:使用等於或小於等於或大於等於>加入大於等於< - 並且<=

表A: | --FieldA-- | --FieldP-- | --FieldS-- | --FieldH-- | --ValueField-- | --FieldX- - |

我創建的兩個子表:

表B基於FIELDA,FieldP,領域,我也推高值,因爲我並不需要FieldX約500萬唯一的記錄。我

表B: | --FieldA-- | --FieldP-- | --FieldS-- | --FieldH-- | --ValueField

表C約20萬人,其中記錄拉到上併爲每個獨特FieldH,FieldP,場下的值字段:

表C: | --FieldP-- | --FieldS-- | --FieldH-- | --MaxValue-- | --MinValue- - |

我忽略了最初將FieldH推入TableB中,並且在此期間做了大量工作,因此無法重做該步驟。

沒有辦法,我來測試性能,因此只是問以下問題希望這是足夠的信息:

與它開始與FieldH數據更新表B TableA中我有兩個選擇:

Update TableB as T1 
Inner Join TableA as T2 
On T1.FieldA=T2.FieldA 
And T1.FieldP=T2.FieldP 
And T2. FieldS=T2.FieldS 
Set T1.FieldH=T2.FieldH 

我在每個選擇字段上都有索引。

這似乎是一個巨大的加入我。

我的另一種選擇是使用範圍,並做了較小的加入更多的計算:

Update TableB as T1 
Inner Join TableC as T2 
On T1.ValueField>=T2.MinValue 
And T1.ValueField<=T2.MaxValue 
Set T1.FieldH=T2.FieldH 

我對值字段的索引以及。

顯然在後一種情況下,優點是它是一個更小的連接,但另一方面,我將數字計算添加到每條記錄。我對於索引,連接或計算的內部工作知之甚少,甚至不知道哪個更好。

我希望我在這裏提供了一個清晰的圖片。試着不要添加更多並且過度複雜的問題,如果有任何添加數據會幫助我很樂意提供/詳細說明。

+0

您是否嘗試過「複雜」連接?看起來真的很難爲db –

+0

@JuanCarlosOropeza複雜你的意思是計算?到目前爲止,我還沒有嘗試各種各樣的加入都花了相當長的時間,所以讓任何一個rip變成一個猜謎遊戲。它從你的評論看來,但我可能高估了開銷> = <=將要添加。 – user3649739

+0

哦,我現在看到它。你想用'表A'或'表C'更新'表B'。我想你害怕使用一個1200萬行「表A」。首先你的意思是「不能測試性能」?你應該可以運行'EXPLAIN ANALYSE' [** MySQL **](http://dba.stackexchange.com/questions/15371/how-do-i-get-the-execution-plan-for-a-查看)這是你可以比較兩個查詢之間的性能的唯一方法 –

回答

0

我將把你這個問題(這是我最後回答):

Faster Update in specific case: Join Large with equals or smaller with >- and <=

這是這一次的產物。我意識到這不是> = < =但是我的索引本身,特別是我需要創建一個複合索引並讓MySql選擇它。所以解決了這個問題。長話短說,因爲我需要連接兩個帶連接的varchar字段的大表,我製作了一箇中間表,並使用這些ID來連接。如果您需要詳細信息,請參閱上面的鏈接。

最後,即使使用> = < =,它的工作效果也很好,實際上它最終在500萬條記錄上做了52k次更新,超過一分鐘(這是每個記錄需要10秒鐘的時間)前)。