mysql 原理 ~ change buffer
一 简介:今天咱们来聊聊mysql的change buffer
二 详细说明
1 +-change Buffer和数据页一样,也是物理页的一个组成部分,数据结构也是一颗B+树,这棵B+树放在共享表空间中,默认ibdata1中。change buffer 写入系统表空间机制应该和普通表的脏页刷新到磁盘是相同的机制--Checkpoint机制
2 具体查看
show engines inndo status 过滤
Ibuf: size 1, free list len 14316, seg size 14318, 466174 merges(已经合并的meregs数量)
merged operations: insert 547399(插入记录被merge的次数), delete mark 42008(删除操作被merge的次数), delete 32055(更新操作被merge了多少次)
如果merges/merged的值等于3/1,则代表插入缓冲对于非聚集索引页的IO请求大约降低了3倍
三 具体过程
通用操作
1 判断目标数据页是否在内存中 -> 在, 直接操作数据页(更新,插入)
-> 不在,将操作缓冲到change buffer中>在下次进行操作这个数据页时,数据页读入内存,进行操作数据页(更新,插入)->写事务日志
2 merge 触发条件 >定期刷新 change buffer到ibdata中进行物理保存
1 当目标数据页被读取到内存时进行操作
2 master thread 每隔10s会进行操作
3 当mysql关闭时会触发进行操作
3 change buffer备份
change buffer虽然是内存的空间,也会定期刷新到磁盘,保证数据安全
4 change buffer目标
插入更新删除操作的辅助索引数的维护操作
补充:为何要非唯一性索引,因为唯一性索引需要确定唯一性,就必然要从硬盘读取数据页,那么change buffer也失去了自己的作用
5 change buffer的相关参数
1 innodb_change_buffering 默认是all支持所有DML操作
2 innodb_change_buffer_max_size,默认是25,即缓冲池的1/4。最大可设置为50,采用默认即可
6 目的
减少了从内存读取硬盘的随机读IO(数据页)操作,redo log减少了随机写log操作
四 现实例子
1 举个现实中的例子来做说明,我们去图书馆还书,对应图书馆来说,他是做了insert(增加)操作,管理员在1小时内接受了100本书,这时候他有2种做法把还回来的书归位到书架上
1)每还回来一本书,根据这本书的编码(书柜区-排-号)把书送回架上
2)暂时不做归位操作,先放到柜面上,等不忙的时候,再把这些书按照书柜区-排-号先排好,然后一次性归位
用方法1,管理员需要进出(IO)藏书区100次,不停的登高爬低完成图书归位操作,累死累活,效率很差。
用方法2,管理员只需要进出(IO)藏书区1次,对同一个位置的书,不管多少,都只要爬一次楼梯,大大减轻了管理员的工作量。
所以图书馆都是按照方法2来做还书动作的。而且如果暂时不归还,需要相应的柜子进行保存,相当于数据库的insert buffer
2 为什么对于非聚集索引(非唯一)的插入和更新有效?
还是用还书的例子来说,还一本书A到图书馆,管理员要判断一下这本书是不是唯一的,他在柜台上是看不到的,必须爬到指定位置去确认,这个过程其实已经产生了一次IO操作,相当于没有节省任何操作。
所以这个buffer只能处理非唯一的插入,不要求判断是否唯一。聚集索引就不用说了,它肯定是唯一的,mysql现在还只能通过主键聚集。
3 前面说到管理员图书归位的时候,他会选择在“不忙的时候”再去做,优先处理前台退书操作,这个在MYSQL里面是这样体现的:
1)每1秒,如果IO次数小于5,合并插入缓冲。
2)每10秒,IO次数小于200,合并最多5个插入缓冲。
五 适用场景
事务进行操作后不会立刻查看的场景(写多读少),因为如果立刻查看会频繁的触发merge
六 补充
1 看完了上面的优化措施,我们应当明白了一点,为什么mysql不提倡建立很多无用的索引,因为每个辅助索引都需要成本来维护,虽然有了change buffer,还应该尽量避免建立无序索引
2 对于innodb的恢复机制应该加上change buffer 最后为 change buffer+redo log+binlog
mysql 原理 ~ change buffer的更多相关文章
- MySQL:change buffer
1. 概念 Innodb维护了一个缓存区域叫做Buffer Pool,用来缓存数据和索引在内存中.其大小通过参数 innodb_buffer_pool_size 控制: change buffer 是 ...
- 全网最清楚的:MySQL的insert buffer和change buffer 串讲
目录 一.前言 二.问题引入 2.1.聚簇索引 2.2.普通索引 三.change buffer存在的意义 四.再看change buffer 五.change buffer 的限制 六.change ...
- MySql 缓冲池(buffer pool) 和 写缓存(change buffer) 转
应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存(cache)里,避免每次都去访问数据库. 操作系统,会有缓冲池(buffer pool)机制,避免每次访问磁盘,以加速数据的访问. M ...
- MySQL -- Innodb中的change buffer
change buffer是一种特殊的数据结构,当要修改的辅助索引页不在buffer pool中时,用来cache对辅助索引页的修改.对辅助索引页的操作可能是insert.update和delete操 ...
- Mysql InnoDB三大特性-- change buffer
Mysql InnoDB三大特性-- change buffer
- 【MySQL 5.7 Reference Manual】15.4.2 Change Buffer(变更缓冲)
15.4.2 Change Buffer(变更缓冲) The change buffer is a special data structure that caches changes to se ...
- MySQL 5.7 Reference Manual】15.4.2 Change Buffer(变更缓冲)
15.4.2 Change Buffer(变更缓冲) The change buffer is a special data structure that caches changes to se ...
- mysql小特性:change buffer
change buffer是在其他数据库中没有的一个概念,说白了就是一块系统表空间分配的空间,针对的对象是辅助索引的叶子节点(为什么不是主键索引?因为主键索引是聚集索引,在磁盘上的排列是有序的,磁盘的 ...
- 《Mysql - 索引(唯一索引和普通索引的选择)Change Buffer 》
一:概述 - 如果业务代码已经保证了不会写入重复的身份证号. - 从性能的角度考虑,你会为这个身份证号,选择唯一索引还是普通索引呢?选择的依据是什么呢? - 这就要从他们的执行过程看起. 二:唯一索引 ...
随机推荐
- Luogu3676 小清新数据结构题(树链剖分+线段树)
先不考虑换根.考虑修改某个点权值对答案的影响.显然这只会改变其祖先的子树权值和,设某祖先原子树权值和为s,修改后权值增加了x,则对答案的影响为(s+x)2-s2=2sx+x2.可以发现只要维护每个点到 ...
- Spring的编程式事务和声明式事务
事务管理对于企业应用来说是至关重要的,当出现异常情况时,它也可以保证数据的一致性. Spring事务管理的两种方式 spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务使用Transa ...
- mysql test== 坑
错误 <if test="status == '1'"> 正确 <if test="status == '1'.toString()">
- emwin之窗口关闭按钮用法
@2018-07-27 [小记] 使用函数 FRAMEWIN_AddCloseButton() 实现关闭当前窗口的功能时,调用其窗口的父窗口必须处于打开状态,否则将导致假死(当前窗口死了,系统还在工作 ...
- 【AGC010D】Decrementing
Solution 日常博弈论做不出来. 首先,数值全部为1的局面先手必败. 在接下来的过程中,我们只关注那些大于1的数值. 按照官方题解的思路,首先想一个简化版的问题:没有除的操作,其余相同.那么局面 ...
- luogu1600 [NOIp2016]天天爱跑步 (tarjanLca+dfs)
经过部分分的提示,我们可以把一条路径切成s到lca 和lca到t的链 这样就分为向上的链和向下的链,我们分开考虑: 向上:如果某一个链i可以对点x产生贡献,那么有deep[x]+w[x]=deep[S ...
- poj 1236(强连通分量分解模板题)
传送门 题意: N(2<N<100)个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输. 问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都 ...
- saltstack 基本操作
一.常用操作 ①.模块查看 #查看全部模块 [root@k8s_master ~]# salt '*' sys.list_modules # "*"为所有node节点 (此处可以写 ...
- 原生ajax中get和post请求
后台代码: class AjaxHanlder(tornado.web.RequestHandler): def get(self): print(self.get_argument('type',N ...
- centos6.5环境下安装zk
第一步:先下载安装包,解压. 第二步:进去根目录,创建data文件夹 mkdir data 第三步:进去conf文件夹,修改 zoo_sample.cfg 的名字 mv zoo_sam ...