我正在尝试确定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');据我所知,此查询将为MySQL中的值'MyTestValue‘向B树索引添加某种散列键。
现在,如果我运行以下语句,是否会强制更新B-Tree索引,即使我没有更改该列的值?
UPDATE MyTable SET MyIndexedColumn = 'MyTestValue',
MyNonIndexedColumn = 'A New Value' WHERE ID = 1;MySQL是否足够聪明,能够确定这一点?或者,通过将该列作为update语句的一部分,我是否告诉MySQL可能发生了一些变化,它应该执行更新索引的工作?
发布于 2008-11-12 15:52:33
如果在MySQL客户端中运行该查询,您将看到类似以下内容
行匹配数: 1,更新行数:0
所以MySQL肯定知道什么时候行发生了变化--我假设他们足够聪明,不会从那里更新索引。
发布于 2008-11-12 15:55:39
MySQL不仅足够聪明,可以在值没有改变的情况下更新索引,而且还足够聪明,不会用相同的值重写列值。
发布于 2008-11-13 19:00:31
我对此做了一些测试,使用mysql 5.0.41,将更新与两个相同的innodb表(7个cols,全部是整数)进行比较,除了一个表有5个索引(其中几个是2列的),而另一个表没有索引。(不过,每个表都有自己的主键索引。)
下面是我最终得到的结果(没有索引的表是A,有索引的表是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中缓存。
这一切都很好地说明了其他人所说的话,但也提供了一些关于指数对事情有多大影响的观点。然而,在Jim询问的特定情况下,它看起来可能会慢50%。
https://stackoverflow.com/questions/284365
复制相似问题