2011-01-13 76 views
5

讓我們假設我有兩列A和B.表上有一列的索引,但不能在B列 我要發出數百萬查詢:MySql更新優化?

UPDATE t1 SET b=b1 WHERE a=a1; 
UPDATE t1 SET b=b2 WHERE a=a2; 
.... 

有從任何地方1至100,000行對應於每個唯一值a。平均而言,這是100左右

有關行的平均60%的每個更新語句不會爲這些行b因爲改變已經擁有所需的值。對於30%的更新,沒有匹配的行將被更改。

是否有意義使用這樣的語句?

UPDATE t1 SET b=b1 WHERE a=a1 AND b<>b1; 

將通過消除不必要的回寫到磁盤加速過程還是Mysql的5聰明地認識到,什麼都沒有改變,也沒有必要寫回磁盤?

回答

4

在這兩種情況下,MySQL將要讀的行內容(無論是在磁盤上還是在緩存/緩衝池中)。無論哪種情況,MySQL都會使用您的索引a作爲起點。在任何一種情況下,如果MySQL已經具有b的目標值,MySQL將不更新該行。因此,我不認爲MySQL可以通過b<>b1條款獲益。

可以說,這取決於工作負載和數據集(在它與b<>b1)查詢威力的好處,如果你改變你的a指數上ab(按順序)的化合物指標。在這種情況下,它不必打開磁盤(或檢查緩存/緩衝池),以找出哪些行需要更新(即,您將利用所提及的30%和60%)具體爲。話雖如此,現在你的索引將需要在每個b更新的更新,所以有成本的,雖然我懷疑的權衡可能是值得的。

0

您應該添加額外的過濾器。如果Mysql相同,Mysql足夠聰明,無需更新值,但最好消除此檢查。您可以通過查看有多少行受到查詢「影響」來確認。

0

我一直在想用CASE

update t1 
set b= 
    case a 
    when a=a1 then b1 
    when a=a2 then b2 
    when a=a3 then b3 ... 
    end; 

希望這個有用的多次更新到單個更新結合起來,如果它可怕的慢,請包括交代