2008-11-12 14 views
4

我想確定什麼情況下MySQL更新索引。說我有如下表:MySQL何時試圖更新列的索引?

CREATE TABLE MyTable (
    ID INT NOT NULL AUTO_INCREMENT, 
    MyIndexedColumn VARCHAR NOT NULL, 
    MyNonIndexedColumn VARCHAR, 
    PRIMARY KEY (ID), 
    INDEX MyNewIndex(MyIndexedColumn) 
) 

然後我運行下面的SQL插入一行:

INSERT INTO MyTable (MyIndexedColumn, MyNonIndexedColumn) 
VALUES ('MyTestValue', 'MyTestValue'); 

據我所知,這個查詢將某種混雜鍵添加到B樹索引在MySQL中爲值'MyTestValue'。

現在,如果我運行以下語句,是否會強制要更新B-Tree索引,即使我沒有更改列的值?

UPDATE MyTable SET MyIndexedColumn = 'MyTestValue', 
MyNonIndexedColumn = 'A New Value' WHERE ID = 1; 

MySQL是否足夠聰明地確定?或者只是將該列作爲更新語句的一部分,我是否告訴MySQL可能有某些更改,並且它應該執行更新索引的工作?

回答

2

如果運行在MySQL客戶端查詢時,您將看到類似

行相符:1,更新行:0

所以MySQL時,一行已經改變肯定知道否則 - 我會從那裏假設他們足夠聰明,不會從那裏更新索引。

+0

好的,所以我只是將更新更改爲「更新MyTable SET MyIndexedColumn ='MyTestValue',MyNonIndexedColumn ='新值'WHERE ID = 1;」這會改變你的答案嗎? – 2008-11-12 15:57:11

1

執行UPDATE時,MySQL會報告匹配的行數和更改的數量。運行您的示例查詢給出了輸出:

查詢OK,0行受到影響(0.00秒) 行匹配:1:0的警告:0

我會感到非常驚訝,如果MySQL並沒有再使用信息來確定是否更新索引。

7

不僅MySQL足夠聰明,如果該值沒有改變就不更新索引,它足夠聰明,不會重寫具有相同值的列值。

6

我對此做了一些測試,使用mysql 5.0.41,比較兩個相同的innodb表(7列,所有整數)的更新,除了一個表有5個索引(其中一些是2列),另一個表沒有索引。 (。每一個表有其主鍵索引,雖然)

這裏是我結束了(沒有索引的表是,帶有索引的表B):

10k updates of an indexed column with a new value: 
A: 76.8 seconds 
B: 126.7 seconds 

10k updates of a non-indexed column with a new value: 
A: 27.6 seconds 
B: 22.0 seconds 

10k updates of a random column with its same value: 
A: 1.4 seconds 
B: 1.2 seconds 

10k updates of a random column with an incremented value: 
A: 12.2 seconds 
B: 50.0 seconds 

10k updates of an indexed column=>same value, non-indexed column=>new value: 
A: 7.0 seconds 
B: 10.5 seconds 

我假設部分原因是相同的/遞增的值更快是因爲我必須在更新之前查找行,所以它會以某種形式在mysql中緩存。

這幾乎可以發現其他人在說什麼,但給出了一些有關索引影響多少的觀點。然而,在具體情況下,吉姆問道,它看起來可能會慢50%。