在mysql中插入或更新行时,索引会发生什么?

时间:2015-07-08 09:40:40

标签: mysql indexing innodb

索引是完全重建还是索引已更新?如果它已更新,那么究竟更新了什么?

假设正在使用InnoDB。

2 个答案:

答案 0 :(得分:1)

MySQL中表的所有索引都是"立即" 已更新重建),该行为INSERTed到该表中。同上DELETE。在某些情况下,UPDATE会导致索引更新。

"立即",我的意思是你无法判断它是否在控制权返回之前完成,或者是否存在某种形式的缓存。

MySQL中的大多数索引都是BTrees。在少数情况下,有FULLTEXT,SPATIAL或HASH。

向BTree添加条目涉及向下钻取"树" (百万行表约3个级别)并添加一个'记录'在叶节点中。这很快,你无法判断它是否已经完成。

如果你有十几个索引,那么有十几个BTree(或其他)需要更新。这表明你不应该拥有超过你需要的索引。

InnoDB 中,PRIMARY KEY是"群集"。也就是说,数据和PRIMARY KEY共同存在于一个BTree中,由PRIMARY KEY排序并包含所有数据。

在InnoDB中,每个'记录'在辅助索引(也构造为BTree)中包含PRIMARY KEY的副本。 (这可能是扎法所暗示的。)

BTree索引非常有效

  • "点查询" - 给出一行,给出了'。
  • "范围查询" - 查找给定关键范围的行(例如,WHERE key BETWEEN 22 AND 44

答案 1 :(得分:0)

简而言之,你可以说在innodb中,每个索引都与clustured index(通常称为主键)相关联,因此每当更新任何索引值时,它(更改的值)将再次与聚集索引相关联。