【问题标题】:how is consistency ensured when using indexes?使用索引时如何保证一致性?
【发布时间】:2021-12-19 14:25:59
【问题描述】:

对于像这样的选择语句

select * from table where indexed_col='abc';

sql 会去索引表并获取行地址并返回所需的。 但是像 dml 这样的语句呢

update table set indexed_col='abc' where condition;

如何保证表和索引表的一致性?

【问题讨论】:

  • 由 dbms 管理。

标签: mysql sql indexing


【解决方案1】:

当您更新列时,MySQL 会更新包含列 indexed_col 的所有索引。

它当然必须更新聚集索引(又名主键索引)。给定行的列存储在聚集索引的叶节点中,因此更改任何列都需要更新该索引。

同一表中包含更新列的其他唯一索引必须同时更新。换句话说,当您执行 UPDATE 时,执行该语句所需的时间包括更新聚集索引的时间以及包含 indexed_col 列的任何唯一索引。

对于非唯一二级索引,MySQL 的默认存储引擎 InnoDB 使用 change buffer,这是对这些索引的待处理更改的临时列表。当您更新列indexed_col 时,MySQL 会为该列所属的每个索引向更改缓冲区添加一个条目。然后它调用你的 UPDATE done 的执行,并将控制权返回给客户端。

如果您随后执行 SELECT 查询,MySQL 会检查表的索引更改缓冲区。该索引的更改缓冲区中的任何条目都具有优先权,因为它们反映了最近的更改。

最终,MySQL 会运行一个后台线程来将更改缓冲区条目合并到相应的索引中。

【讨论】:

  • MySQL 为该列所属的每个索引添加一个条目到更改缓冲区 -> 所以,每一列都包含它所属的索引列表?
  • 是的,它是表元数据的一部分:列、数据类型、索引、约束等。
猜你喜欢
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-10
  • 2020-05-14
  • 1970-01-01
  • 2013-01-26
相关资源
最近更新 更多