首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确保在使用索引时的一致性?

问如何确保在使用索引时的一致性?
EN

Stack Overflow用户
提问于 2021-11-05 14:27:08
回答 1查看 88关注 0票数 1

对于select语句,如

代码语言:javascript
复制
select * from table where indexed_col='abc';

sql将转到索引表,获取行地址并返回所需的数据。但是dml语句呢?

代码语言:javascript
复制
update table set indexed_col='abc' where condition;

如何确保表和索引表之间的一致性?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-05 14:42:19

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

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

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

对于非唯一的辅助索引,MySQL的默认存储引擎InnoDB使用变化缓冲器,这是对这些索引进行挂起的更改的临时列表。更新列indexed_col时,MySQL为该列所属的每个索引添加一个条目到更改缓冲区。然后,它调用已完成的更新的执行,并将控制返回给客户端。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69854814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档