当前位置: 首页 > news >正文

MySQL系列—7.内存结构

目录

1.Buffer Pool

2.Redo Log Buffer

3.change buffer


InnoDB内存结构主要分为4个部分:

Buffer Pool

Change Pool #写缓存

Log Buffer #日志缓存

Adaptive Hash Index #自适应hash索引

1.Buffer Pool

也是B+树结构

1.当读一条数据时,会先检查是否在data pages中

        如果不在,那么去IO读InnoDB 表空间,读取到data pages后,再返回给client

        如果在,读取最新版本

然后进行操作,变成脏数据,再刷新到磁盘。

2.InnoDB对任何数据的读写都是基于内存的

3. 查看buffer pool的组成
 select page_type,sum(data_size)/1024/1024 as size_MB
 from information_schema.innodb_buffer_page
 group by page_type
 order by 2 desc;

Database pages #LRU List 列表

Modified db pages #脏页的个数,由于在进行update操作时首先会修改缓冲池中 的数据,在定时异步的将缓冲池的数据刷新到磁盘中(checkpoint技术),所以 缓冲池的数据与磁盘的数据会产生不一致,称为脏页。

Free buffers Free List页的个数

2.Redo Log Buffer

1.修改数据前先记录undo,修改后的数据在脏页,修改动作记录到redo

2.redo log buffer不用太大,由参数innodb_log_buffer_size控制,默认为8M

3.redo log 在下列三种情况下会从buffer中刷新到redo log file:

master thread每一秒刷新

每个事务提交时刷新

redo log buffer 剩余空间小于1/2时

3.change buffer

Change Buffer是一种用于缓存辅助索引页变化的区域,是buffer pool中一块独立的区域。

当需要修改的辅助索引页不在缓冲池中而在磁盘中时,会将这些索引页的变化缓存在change buffer中。

对索引的更新先缓存在change buffer中,然后由master thread做merge——将修改数据合并到 buffer pool,然后刷新到磁盘。

工作机制:

先判断要修改的非聚集索引页(辅助索引页)是否在buffer pool中

存在,则直接修改然后将结果临时存放在change buffer中

不存在,直接将更改缓存到change buffer中(注意,并不通过IO读入,而是直接将修改 缓存在change buffer)

参数:

innodb_change_buffer_max_size ,默认最大允许25%

innodb_change_buffering

基本上change buffer不用管。只需要控制max_size 不要设置太高就ok,innodb会自行适应。

为什么二级索引需要Change Buffer?

减少随机读取IO

对于聚集索引页,DML操作带来的数据磁盘读取和缓存修改往往是顺序的、集中的,这就很好 地利用了聚集索引的优点,但随着聚集索引页的顺序IO,各个二级索引页的读取和修改通常是随 机IO的。而Change buffer将分散的、未缓存的二级索引页的变化进行缓存而非直接从磁盘中读 取索引页,待到其他操作需要访问二级索引时,只需将change buffer中的变化缓存合并然后加 入缓冲池(buffer pool)就行了,这样就大大地减少了磁盘随机读取的IO。

定期批量写入索引变化

如何配置change buffer?

可以用innodb_change_buffering系统变量控制change buffer相关的行为。可以控制change buffer只对部分类操作生效。该变量的值和含义如下:

all

默认值,表示缓存所有DML语句和物理purge操作的索引页变化。

none

不对任何操作缓存,相当于禁用

inserts

只缓存insert

deletes

只缓存标记性delete操作

changes

只缓存写入和标记性delete

purges

只缓存后台物理删除操作

注意:

innodb_change_buffering参数可动态修改,只对修改后发生的操作生效,修改前已缓存的索引 页不受影响

可以用innodb_change_buffer_max_size变量控制change buffer区域的最大大小,表示占缓冲 池总大小的百分点数。默认为25。最大可以设置为50。

当DML语句量较多时,可以适当扩大innodb_change_buffer_max_size.反则反之。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ❤《实战纪录片 1 》原生开发小程序中遇到的问题和解决方案
  • AcWing算法基础课-786第k个数-Java题解
  • 论文速读|利用局部性提高机器人操作的样本效率
  • Peewee+Postgresql+PooledPostgresqlDatabase重连机制
  • 数据结构————栈、队列
  • Uniapp基础学习(二)
  • Anchor Alignment Metric来优化目标检测的标签分配和损失函数。
  • [数据集][目标检测]西红柿成熟度检测数据集VOC+YOLO格式3241张5类别
  • Ubuntu 修改IP
  • 发烧时眼睛胀痛的多种原因
  • 基于Netty框架的桩直连协议(云快充协议1.5)
  • C++相关概念和易错语法(32)(单例模式、类型转换)
  • leetcode:516 最长回文字序列 动态规划
  • C++基础(7.Stack_Quene_List)
  • Windows10上Nginx如何通过自签名证书方式发布Https服务(上)
  • CentOS从零开始部署Nodejs项目
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • Java IO学习笔记一
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • php的插入排序,通过双层for循环
  • Python 反序列化安全问题(二)
  • Rancher如何对接Ceph-RBD块存储
  • Sublime text 3 3103 注册码
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 测试开发系类之接口自动化测试
  • 缓存与缓冲
  • 讲清楚之javascript作用域
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 王永庆:技术创新改变教育未来
  • 消息队列系列二(IOT中消息队列的应用)
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • %check_box% in rails :coditions={:has_many , :through}
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (差分)胡桃爱原石
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (三) diretfbrc详解
  • (三)elasticsearch 源码之启动流程分析
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .gitignore
  • .Net Core中Quartz的使用方法
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点
  • .NET简谈设计模式之(单件模式)
  • ?
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • [.net] 如何在mail的加入正文显示图片
  • [012-1].第12节:Mysql的配置文件的使用
  • [2024-06]-[大模型]-[Ollama]- WebUI
  • [C#C++]类CLASS