全网最清楚的 MySQL的insert buffer和change buffer 串讲

本文详细介绍了MySQL的change buffer和insert buffer,旨在帮助读者理解这两个概念及其优化作用。文章首先回顾了聚簇索引和普通索引的基本知识,接着探讨了change buffer存在的意义,指出它用于优化非唯一二级索引的DML操作,减少随机磁盘IO。内容还涵盖了change buffer的限制、相关参数设置以及如何查看change buffer状态。最后,通过一个灵魂拷问引发思考,讨论了change buffer在实际操作中的影响行数计算问题。
摘要由CSDN通过智能技术生成

一、前言

终于《为研发同学同学定制的MySQL面试指南》第30篇更新来啦~

说来话长,都说百度是养老厂,结果偏偏干出了pdd的感觉。最近工作确实比较忙,然后周六日又想放松一下接连好多周六日都和同学出去游玩。

立个flag吧!后续的更新进度做到每周至少一更。欢迎关注白日梦,干货分享不断~

好!开始啦,做了这么久研发的你,有没有听别人说过、或者在哪里见过insert bufferchange buffer呢?这篇文章我们一起闲聊一下MySQL的insert bufferchange buffer,彻底揭开这两个名词的面纱!

二、问题引入

在白日梦看来,如果你想更好的理解 insert buffer、change buffer。首先你的先掌握一些前置的知识,比如MySQL索引的相关知识。所以不要着急,我们一点点展开话题,从你数据的知识过度到insert buffer、change buffer上去,你会发现豁然开朗。

2.1、聚簇索引

首先我们回顾一下MySQL的聚簇索引,这个东西大家肯定不陌生吧!我打赌在做的各位面试前都会背一背什么是聚簇索引。

大家可以看下面这张图,它就是对B+tree的抽象。它有很多特性,在这篇文章中只需要知道如下几个就好了

  1. 它是一个B+tree。
  2. 我们管这棵树的叶子结点叫做数据页
  3. 叶子结点中存储的数据行是一个全集,怎么解释这个全集呢?比如数据表就3列,id、name、age。所谓的全集就是说:每行数据都有id、name、age这3列。
  4. 我们管非叶子结点叫做索引页

而且我跟大家讲哦,这棵B+tree是会被存储在Disk中的。如果你不能很好的理解的话,可以读一下下面的两端话:

比如一条update sql想修改id = 999的数据行,那它会怎么操作数据页呢?简单来说就是:首先会检查一下buffer pool中有没有包含这条数据的数据页。如果有的话,直接update。如果没有的话进行一次磁盘IO把该数据页加载进内存,然后将其update。然后这时的数据页也就变成了脏页。等后续其它机制将该数据页刷新回Disk。完成内存和数据。

读上面的这段话,你要重点感受一下:数据页从磁盘到Buffer Pool中的这个过程(最终会被挂载在B+tree的叶子结点上)

其实你类比着数据页来看,对于B+tree的非叶子结点来说也是一样的。上面我说了,我们管非叶子结点叫做索引页。为啥这样说呢?其实本质上非叶子结点也是数据页,只不过它里面存储的数据是索引数据。而且和普通的数据页一样,当你需要它而且它还不在内存中时,进行磁盘操作将其读取内存中。

2.2、普通索引

普通的索引也就是我们常说的二级索引、联合索引等等。

比如我们将name列设置成index的话,那么MySQL就会为我们这个索引单独创建一个B+Tree。(是的!它是独立于主键索引之外的另一颗B+Tree)。而且你注意一下如下几点:

  1. 和聚簇索引一样的是,我们管它的非叶子结点叫做:索引页
  2. 它的叶子结点中存储的并不是所有的列的全集。比如我们对name列创建索引,那么它的叶子节点中存储的就是id、name两列。并会按照name排序。

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值