MySQL45讲之更新缓存

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

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

查询过程

在唯一索引下,查询索引树,找到第一个匹配的行并返回

[En]

Under the unique index, query the index tree, find the first matching row and return

在普通索引下,查询索引树,找到第一个匹配的行,然后继续遍历直到第一个不匹配的行,然后返回。

[En]

Under a normal index, query the index tree, find the first matching row, and then continue to traverse until the first mismatched row, and then return.

即使匹配的行跨了数据页,但一个数据页默认 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的刷盘触发时机:

  • 数据库空闲时,会定期持久化。
    [En]

    when the database is idle, it will be persisted regularly.*

  • 数据库缓冲不够用时
  • 数据库正常关闭之前
  • 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里恢复。

接下来,分析这两个索引下的更新操作:

[En]

Next, analyze the update operations under the two indexes:

在唯一索引下,查询索引树,将对应的数据页加载到内存中,判断是否违反一致性约束,然后更新

[En]

Under the unique index, query the index tree, load the corresponding data page into memory, determine whether the consistency constraint is violated, and then update

普通索引,查询索引树,直接更新内存中的 Change Buffer

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

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

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

Original: https://www.cnblogs.com/flowers-bloom/p/mysql45-change-buffer.html
Author: flowers-bloom
Title: MySQL45讲之更新缓存

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/508173/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java 8的新特性还不了解?快进来!

    能坚持别人不能坚持的,才能拥有你想拥有的。关注 编程大道,让我们一起成长 哈喽,大家好,我是…

    数据库 2023年6月11日
    082
  • Redis学习

    Redis 因为没有指定配置文件 需配置 redis-server redis.windows.conf 之后自动启动 测试性能 redis-benchmark -p 6379 -…

    数据库 2023年6月16日
    078
  • MySQL之自关联查询

    假设要设计两张表,一张省份表(provinces),一张城市表(citys) 省份表结构 id ptitle 城市表结构 id ctitle proid(表示城市所属的省,对应着省…

    数据库 2023年5月24日
    0132
  • 得体的注释,让我总能想起TA

    作为一个技术TL,在排查生产问题时,我经常要周转于各个工程里。系统和服务多起来后,要我了解每一段代码具体的来龙去脉逐渐几乎不可能了。 例如,今天,我要查一下调用某个三方接口所配置的…

    数据库 2023年6月9日
    0173
  • 什么是字节

    字节(byte):是计算机中数据处理的基本单位,用大写的B表示 Original: https://www.cnblogs.com/Icy01/p/16311502.htmlAut…

    数据库 2023年6月11日
    0125
  • [spring]spring中java实现类代替注解开发

    9.使用javaconfig实现代替xml配置 The central artifacts in Spring’s new Java-configuration sup…

    数据库 2023年6月16日
    078
  • 数字加密

    java中使用数组对数字进行简单的加密。 数字加密 需求: 某系统的数字密码:比如1983,采用加密方式进行传输,规则如下:先得到每位数,然后每位数都加上5,再对10取余,最后将所…

    数据库 2023年6月16日
    0171
  • zabbix模板,角色,用户,权限管理

    用户管理 用户组 用户角色 用户 模板管理 模板组 模板 posted @2022-09-07 22:22 溜溜威 阅读(16 ) 评论() 编辑 Original: https:…

    数据库 2023年6月14日
    0107
  • SMBMS(超市订单管理系统)项目从零开始搭建

    如果需要完整的系统可以加我qq:1842329236 一、搭建一个maven web项目 新建一个maven,并且使用模板 maven的详细创建,及配置请看这篇文章https://…

    数据库 2023年6月16日
    081
  • 日月既往,不可复追,暑期实习结束!

    在从上海回南京的高铁上码下了这篇文章,心中感慨万千, 两个月弹指一挥间,初来时还略有不适,突然要走了竟然还生出一些留念,所谓 “天可补,海可填,南山可移,日月既往,不可…

    数据库 2023年6月6日
    0158
  • rsync

    rsync是什么 rsync特性 1)可以镜像保存整个目录树和文件系统。 2)可以很容易做到保持原来文件的权限、时间、软硬连接等。 3)无需特殊权限即可安装。 4)快速:第一次同步…

    数据库 2023年6月14日
    086
  • 号称能将STW干掉1ms以内的Java垃圾收集器ZGC到底是个什么东西?

    ZGC介绍 ZGC(The Z Garbage Collector)是JDK 11中推出的一款追求极致低延迟的实验性质的垃圾收集器,它曾经设计目标包括: 停顿时间不超过10ms; …

    数据库 2023年6月16日
    0134
  • Linux远程终端连接工具:SecureCRT

    SecureCRT SecureCRT是一款支持 SSH2、SSH1、Telnet、Telnet/SSH、Relogin、Serial、TAPI、RAW 等协议的终端仿真程序 Se…

    数据库 2023年6月11日
    0107
  • mysql安装及主从复制配置

    一、安装 mysql8.0 下载mysql 安装包http://mirrors.sohu.com/mysql/MySQL-8.0/ wget http://mirrors.sohu…

    数据库 2023年5月24日
    066
  • mybatisplus不支持sum,但支持这个

    我们知道,要对数据求和,写sql很简单:select sum(exp) from table_name我们在用mybatisplus做求和计算的时候,mybatisplus的Wra…

    数据库 2023年6月9日
    0236
  • 限流常见方案

    限流常见方案 我歌月徘徊,我舞影零乱。醒时相交欢,醉后各分散。 一、限流思路 常见的系统服务限流模式有:熔断、服务降级、延迟处理和特殊处理四种。 1、熔断 将熔断措施嵌入到系统设计…

    数据库 2023年6月14日
    094
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球