当在 mysql 中插入或更新行时,索引会发生什么情况?
What happens with an index exactly when a row is inserted or updated in mysql?
索引是完全重建还是更新了?如果更新了,那么更新的到底是什么?
假设正在使用 InnoDB。
简而言之,您可以说在 innodb 中,每个索引都与聚集索引(通常称为主键)相关联,因此每当任何索引值更新时,它(更改的值)将再次与聚集索引相关联。
MySQL 中 table 的所有索引 "immediately" 已更新 ( 未 重建) 连续 INSERTed
变成 table。 DELETE
同上。在某些情况下,UPDATE
会导致索引更新。
"immediately",我的意思是您无法判断在控制权返回给您之前它是否已完成,或者是否正在进行某种形式的缓存。
MySQL 中的大多数索引都是 B 树。在少数情况下,存在 FULLTEXT、SPATIAL 或 HASH。
向 BTree 添加条目涉及向下钻取 "tree"(百万行约 3 个级别 table)并在叶节点中添加 'record'。这速度快到你都分不清是不是live了。
如果您有十几个索引,那么就有十几个 BTree(或其他)要更新。这表明您的索引不应超过您的需要。
在 InnoDB 中,PRIMARY KEY
是 "clustered"。也就是说,数据和 PRIMARY KEY
一起存在于单个 BTree 中,按 PRIMARY KEY
排序并包含所有数据。
在 InnoDB 中,二级 索引(也被构造为 BTree)中的每个 'record' 都包含 PRIMARY KEY
的副本。 (这可能就是 Zafar 所暗示的。)
BTree 索引对于
非常有效
- "Point queries" -- 查找一行,给定 'key'.
- "Range queries" -- 查找给定键范围的行(例如,
WHERE key BETWEEN 22 AND 44
)
索引是完全重建还是更新了?如果更新了,那么更新的到底是什么?
假设正在使用 InnoDB。
简而言之,您可以说在 innodb 中,每个索引都与聚集索引(通常称为主键)相关联,因此每当任何索引值更新时,它(更改的值)将再次与聚集索引相关联。
MySQL 中 table 的所有索引 "immediately" 已更新 ( 未 重建) 连续 INSERTed
变成 table。 DELETE
同上。在某些情况下,UPDATE
会导致索引更新。
"immediately",我的意思是您无法判断在控制权返回给您之前它是否已完成,或者是否正在进行某种形式的缓存。
MySQL 中的大多数索引都是 B 树。在少数情况下,存在 FULLTEXT、SPATIAL 或 HASH。
向 BTree 添加条目涉及向下钻取 "tree"(百万行约 3 个级别 table)并在叶节点中添加 'record'。这速度快到你都分不清是不是live了。
如果您有十几个索引,那么就有十几个 BTree(或其他)要更新。这表明您的索引不应超过您的需要。
在 InnoDB 中,PRIMARY KEY
是 "clustered"。也就是说,数据和 PRIMARY KEY
一起存在于单个 BTree 中,按 PRIMARY KEY
排序并包含所有数据。
在 InnoDB 中,二级 索引(也被构造为 BTree)中的每个 'record' 都包含 PRIMARY KEY
的副本。 (这可能就是 Zafar 所暗示的。)
BTree 索引对于
非常有效- "Point queries" -- 查找一行,给定 'key'.
- "Range queries" -- 查找给定键范围的行(例如,
WHERE key BETWEEN 22 AND 44
)