对于select语句,如
select * from table where indexed_col='abc';sql将转到索引表,获取行地址并返回所需的数据。但是dml语句呢?
update table set indexed_col='abc' where condition;如何确保表和索引表之间的一致性?
发布于 2021-11-05 14:42:19
更新列时,MySQL更新包含列indexed_col的所有索引。
当然,它必须更新聚集索引(也就是主键索引)。给定行的列存储在聚集索引的叶节点中,因此更改任何列都需要更新该索引。
同一表中包含更新列的其他唯一索引必须同时更新。换句话说,执行UPDATE时,执行该语句所需的时间包括更新聚集索引的时间以及包含列indexed_col的所有唯一索引。
对于非唯一的辅助索引,MySQL的默认存储引擎InnoDB使用变化缓冲器,这是对这些索引进行挂起的更改的临时列表。更新列indexed_col时,MySQL为该列所属的每个索引添加一个条目到更改缓冲区。然后,它调用已完成的更新的执行,并将控制返回给客户端。
如果随后如您所示执行SELECT查询,MySQL将检查表的索引和更改缓冲区。该索引的更改缓冲区中的任何条目都具有优先级,因为它们反映了最近的更改。
最后,MySQL运行一个后台线程,将更改缓冲区条目合并到相应的索引中。
https://stackoverflow.com/questions/69854814
复制相似问题