【发布时间】:2021-12-19 14:25:59
【问题描述】:
对于像这样的选择语句
select * from table where indexed_col='abc';
sql 会去索引表并获取行地址并返回所需的。 但是像 dml 这样的语句呢
update table set indexed_col='abc' where condition;
如何保证表和索引表的一致性?
【问题讨论】:
-
由 dbms 管理。
对于像这样的选择语句
select * from table where indexed_col='abc';
sql 会去索引表并获取行地址并返回所需的。 但是像 dml 这样的语句呢
update table set indexed_col='abc' where condition;
如何保证表和索引表的一致性?
【问题讨论】:
当您更新列时,MySQL 会更新包含列 indexed_col 的所有索引。
它当然必须更新聚集索引(又名主键索引)。给定行的列存储在聚集索引的叶节点中,因此更改任何列都需要更新该索引。
同一表中包含更新列的其他唯一索引必须同时更新。换句话说,当您执行 UPDATE 时,执行该语句所需的时间包括更新聚集索引的时间以及包含 indexed_col 列的任何唯一索引。
对于非唯一二级索引,MySQL 的默认存储引擎 InnoDB 使用 change buffer,这是对这些索引的待处理更改的临时列表。当您更新列indexed_col 时,MySQL 会为该列所属的每个索引向更改缓冲区添加一个条目。然后它调用你的 UPDATE done 的执行,并将控制权返回给客户端。
如果您随后执行 SELECT 查询,MySQL 会检查表的索引和更改缓冲区。该索引的更改缓冲区中的任何条目都具有优先权,因为它们反映了最近的更改。
最终,MySQL 会运行一个后台线程来将更改缓冲区条目合并到相应的索引中。
【讨论】: