我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL45讲之更新缓存 - flowers

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL45讲之更新缓存 - flowers

MySQL45讲之更新缓存 - flowers

本文介绍MySQL的更新缓存Change Buffer,以及唯一索引和普通索引如何选择。

前言

本文介绍MySQL的更新缓存Change Buffer,以及唯一索引和普通索引如何选择。

唯一索引和普通索引的选择

查询过程

唯一索引下,查询索引树,找到第一条匹配的行就返回;
普通索引下,查询索引树,找到第一条匹配的行之后,继续往下遍历,直到第一条不匹配的行为止,再返回。

即使匹配的行跨了数据页,但一个数据页默认16KB,每行只存储一个key且是整数,可以存储近千个。那么普通索引下,最多也是多加载一次数据页。所以唯一索引和普通索引的查询效率基本相同。

更新过程

首先介绍下MySQL的更新缓存Change Buffer,它使用的是MySQL Buffer Pool的存储空间,可以设置Change BufferBuffer Pool中的占比,MySQL5.6默认为25%,最多可以开到50%

顾名思义,Change Buffer就是用来存储更新操作的,使得更新操作不需要加载对应的数据页,直接更新到内存。当对Change Buffer中的行进行查询时,就会将原始数据页加载到内存,并将缓存应用到原始数据页,这个就是merge过程。Change Buffermerge触发时机:

  • 当原始数据页加载到Buffer Pool
  • 后台线程定期merge
  • 数据库正常关闭时

Change Buffer的刷盘触发时机:

  • 数据库空闲时,会定时持久化
  • 数据库缓冲不够用时
  • 数据库正常关闭之前
  • redo log写满时

你或许会疑问“万一在刷盘之前数据库宕机了,那之前的更新不就丢失了么?”

答案是否。简单分析是,因为将更新操作写到Change Buffer后,还会将更新操作写到redo log并持久化到磁盘,数据库宕机重启之后,会将之前的更新缓存数据恢复到内存。

具体分析如下:
(1)change buffer写入,redo log虽然做了fsync但未commit,binlogfsync到磁盘,这部分数据丢失

(2)change buffer写入,redo log写入但没有commit,binlog以及fsync到磁盘,先从binlog恢复redo log,再从redo log恢复change buffer

(3)change buffer写入,redo logbinlog都已经fsync.那么直接从redo log里恢复。

接下来分析两种索引下的更新操作:
唯一索引下,查询索引树,加载对应的数据页到内存,判断是否违反一致性约束,再更新;
普通索引,查询索引树,直接更新内存中的Change Buffer

因为唯一索引需要判断更新操作是否违反一致性约束,所以必须加载数据页,也就用不到Change Buffer,即Change Buffer只用于普通索引。

从上面的分析可见,在更新多于读取操作的情况下,普通索引的更新操作效率要高于唯一索引。但如果是更新之后就有查询的场景,那么Change Buffer不但没有起到提效作用,反而占用的缓冲空间。所以,这种情况下,一般会关闭Change Buffer来避免它的副作用。

总结

总结来说,如果业务需要数据库来对数据进行唯一性约束,那么优先还是考虑唯一索引;否则,如果是更新远多于读取操作的业务场景,比如归档,日志等,考虑用普通索引代替唯一索引,可以提高内存命中率和提高更新效率。但如果是更新之后就有查询的场景,则建议关闭Change Buffer,来避免它的副作用。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL45讲之更新缓存 - flowers

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL45讲之更新缓存 - flowers

本文介绍MySQL的更新缓存Change Buffer,以及唯一索引和普通索引如何选择。 前言本文介绍MySQL的更新缓存Change Buffer,以及唯一索引和普通索引如何选择。唯一索引和普通索引的选择查询过程唯一索引下,查询索引树,找到第一条匹配的
MySQL45讲之更新缓存 - flowers
2018-03-28

MySQL45讲之幻读 - flowers

本文介绍什么是幻读,幻读存在的问题和解决方式,以及间隙锁带来的困扰。 前言本文介绍什么是幻读,幻读存在的问题和解决方式,以及间隙锁带来的困扰。什么是幻读什么是幻读,有两个条件:必须是“当前读”情况下才可能发生,“快照读”不会出现只有插入操作才算幻读,更新
MySQL45讲之幻读 - flowers
2018-06-06

MySQL45讲之count操作 - flowers

本文介绍 MyISAM 和 InnoDB 如何执行 count 操作,如果是一个需要使用 count 进行大量计数的场景,应该如何设计实现,以及不同 count 操作的效率。 前言本文介绍 MyISAM 和 InnoDB 如何执行 count 操作,如果
MySQL45讲之count操作 - flowers
2021-05-25

MySQL45讲之order工作原理 - flowers

本文介绍 order 的三种排序方式,全字段排序、rowid 排序和索引树排序,以及每种排序方式具体是如何工作的。 前言本文介绍 order 的三种排序方式,全字段排序、rowid 排序和索引树排序,以及每种排序方式具体是如何工作的。当使用 explai
MySQL45讲之order工作原理 - flowers
2017-04-04

MySQL45讲之前缀索引 - flowers

本文介绍字符串的前缀索引优缺点,以及字符串区分度不高情况下,可以考虑如何建立索引。 前言本文介绍字符串的前缀索引优缺点,以及字符串区分度不高情况下,可以考虑如何建立索引。前缀索引对于像SELECT * FROM t WHERE email = "xxxx
MySQL45讲之前缀索引 - flowers
2020-06-03

MySQL45讲之表空间回收 - flowers

本文介绍为什么删除了一部分表数据后,表文件大小不变,以及有哪些表空间回收的方式。 前言本文介绍为什么删除了一部分表数据后,表文件大小不变,以及有哪些表空间回收的方式。为什么删除表数据后,表文件大小不变MySQL 采用的是标记删除,需要等待后台 purge
MySQL45讲之表空间回收 - flowers
2014-09-02

MySQL45讲之InnoDB加锁规则 - flowers

本文介绍 MySQL InnoDB 的加锁规则,以及分析加锁时,一些需要注意的点。 前言本文介绍 MySQL InnoDB 的加锁规则,以及一些需要注意的点。总结两个原则,两个优化,一个 bug:原则1:加锁的基本单位是 next-key 锁,是一个前开
MySQL45讲之InnoDB加锁规则 - flowers
2018-08-28

MySQL45讲之IO性能提升 - flowers

本文介绍 MySQL 的 binlog 和 redo log 写入机制和刷盘策略,以及如何提升 MySQL 的 IO 性能。 前言本文介绍 MySQL 的 binlog 和 redo log 写入机制和刷盘策略,以及如何提升 MySQL 的 IO 性能。
MySQL45讲之IO性能提升 - flowers
2015-04-27

MySQL45讲之用户关注案例 - flowers

本文介绍 MySQL45 讲中提到的一个用户关注的案例,并记录下可行的处理方案。 前言本文介绍 MySQL45 讲中提到的一个用户关注的案例,并记录下可行的处理方案。业务背景业务上有这样的需求,A、B两个用户,如果互相关注,则成为好友。存在两个表,关系(
MySQL45讲之用户关注案例 - flowers
2016-04-14

MySQL45讲之InnoDB刷脏策略 - flowers

本文介绍 InnoDB 的刷脏控制策略,它是如何控制刷脏速率的,以及一些相关参数。 前言本文介绍 InnoDB 的刷脏控制策略,它是如何控制刷脏速率的,以及一些相关参数。意义了解 MySQL 的刷脏策略有什么意义?当一条正确的 SQL 执行时偶尔延迟较高
MySQL45讲之InnoDB刷脏策略 - flowers
2018-05-10

MySQL45讲之保证高可用 - flowers

本文主要介绍 MySQL 主备延迟,延迟产生的原因和主备切换策略。 前言本文主要介绍 MySQL 主备延迟,延迟产生的原因和主备切换策略。主备延迟主备同步过程中时间点主要有三个:主库A执行完成一个事务,写入binlog,我们把这个时刻记为T1;之后传给备
MySQL45讲之保证高可用 - flowers
2017-08-07

MySQL45讲之查询慢或者阻塞 - flowers

本文介绍锁表和执行慢的例子,以及发生锁表时的排查方法。 前言本文介绍锁表和执行慢的例子,以及发生锁表时的排查方法。锁表1. 等MDL锁比如像 select * from t where id=1; 长时间不返回,可能是因为等 MDL 锁而阻塞。排查方法:
MySQL45讲之查询慢或者阻塞 - flowers
2014-12-08

MySQL45讲之主备数据一致性 - flowers

本文主要介绍 MySQL 主备数据同步的重要日志 binlog 的三种格式,和双 M 结构的循环复制问题。 前言本文主要介绍 MySQL 主备数据同步的重要日志 binlog 的三种格式,和双 M 结构的循环复制问题。binlog三种格式1. state
MySQL45讲之主备数据一致性 - flowers
2019-06-13

MySQL45讲之随机查询和临时表 - flowers

本文介绍 MySQL 随机查询的工作流程、优化随机查询的方式、和临时表。 前言本文介绍 MySQL 随机查询的工作流程、优化随机查询的方式、和临时表。工作流程根据下表结构建立 words 表,并通过过程插入 10000 条模拟数据。CREATE TABL
MySQL45讲之随机查询和临时表 - flowers
2021-03-30

MySQL45讲之优化器选错索引 - flowers

本文简要介绍优化器选择索引的依据有哪些,有什么办法人为引导优化器选择更优的执行方案。 前言本文简要介绍优化器选择索引的依据有哪些,有什么办法人为引导优化器选择更优的执行方案。为什么会出现选错索引可能是统计索引基数信息错误,导致优化器错选索引,也可能是My
MySQL45讲之优化器选错索引 - flowers
2022-03-28

MySQL45讲之备库并行复制策略 - flowers

本文主要介绍 MySQL 备库的并行复制策略。 前言本文主要介绍 MySQL 备库的并行复制策略。为什么备库需要并行复制如果主库有大量更新操作,因为主库可以并发写入,而备库只能单线程执行的话,那么备库的同步延迟会不断累加,即备库越来越追不上主库。所以,后
MySQL45讲之备库并行复制策略 - flowers
2020-10-10

MySQL45讲之生产环境下的性能问题 - flowers

本文介绍一些常见的性能问题,以及在生产环境下应该如何解决。 前言本文介绍一些常见的性能问题,以及在生产环境下应该如何解决。1. 短连接风暴当由于大量短连接造成数据库性能低时,首先考虑一些无损安全的解决方案,如果是必须立刻提升一些数据库性能,那么可以考虑下
MySQL45讲之生产环境下的性能问题 - flowers
2017-08-20

MySQL45讲之函数转换导致不使用索引 - flowers

本文介绍三种因为函数转换导致不使用索引的问题。 前言本文介绍三种因为函数转换导致不使用索引的问题。注意,不使用索引指的是不使用树搜索,而是全表扫描索引树。显式使用函数比如 select count(*) from tradelog where month
MySQL45讲之函数转换导致不使用索引 - flowers
2022-02-20

编程热搜

目录