首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL何时尝试更新列的索引?

问MySQL何时尝试更新列的索引?
EN

Stack Overflow用户
提问于 2008-11-12 15:48:23
回答 4查看 8.8K关注 0票数 5

我正在尝试确定MySQL更新索引的情况。假设我有下表:

代码语言:javascript
复制
CREATE TABLE MyTable (
  ID INT NOT NULL AUTO_INCREMENT,
  MyIndexedColumn VARCHAR NOT NULL,
  MyNonIndexedColumn VARCHAR,
  PRIMARY KEY (ID),
  INDEX MyNewIndex(MyIndexedColumn)
)

然后,我运行以下SQL来插入一行:

代码语言:javascript
复制
INSERT INTO MyTable (MyIndexedColumn, MyNonIndexedColumn) 
VALUES ('MyTestValue', 'MyTestValue');

据我所知,此查询将为MySQL中的值'MyTestValue‘向B树索引添加某种散列键。

现在,如果我运行以下语句,是否会强制更新B-Tree索引,即使我没有更改该列的值?

代码语言:javascript
复制
UPDATE MyTable SET MyIndexedColumn = 'MyTestValue', 
MyNonIndexedColumn = 'A New Value' WHERE ID = 1;

MySQL是否足够聪明,能够确定这一点?或者,通过将该列作为update语句的一部分,我是否告诉MySQL可能发生了一些变化,它应该执行更新索引的工作?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-11-12 15:52:33

如果在MySQL客户端中运行该查询,您将看到类似以下内容

行匹配数: 1,更新行数:0

所以MySQL肯定知道什么时候行发生了变化--我假设他们足够聪明,不会从那里更新索引。

票数 2
EN

Stack Overflow用户

发布于 2008-11-12 15:55:39

MySQL不仅足够聪明,可以在值没有改变的情况下更新索引,而且还足够聪明,不会用相同的值重写列值。

票数 7
EN

Stack Overflow用户

发布于 2008-11-13 19:00:31

我对此做了一些测试,使用mysql 5.0.41,将更新与两个相同的innodb表(7个cols,全部是整数)进行比较,除了一个表有5个索引(其中几个是2列的),而另一个表没有索引。(不过,每个表都有自己的主键索引。)

下面是我最终得到的结果(没有索引的表是A,有索引的表是B):

代码语言:javascript
复制
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%。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/284365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档