MySQL · 特性分析 · innodb buffer pool相关特性
innodb buffer pool做为innodb最重要的缓存,其缓存命中率的高低会直接影响数据库的性能。因此在数据库发生变更,比如重启、主备切换实例迁移等等,innodb buffer poll 需要一段时间预热,期间数据库的性能会受到明显影响。
另外mysql 5.7以前innodb buffer pool缓存大小修改不是动态的,重启才能生效。因此innodb buffer pool的预热和innodb buffer pool大小的动态修改,对性能要求较高的应用来说是不错的特性,下面我来看看这两个特性的具体实现。
MySQL 5.6以后支持buffer pool预热功能。引入了以下参数, 参数具体含义参见官方文档。
innodb_buffer_pool_load_now innodb_buffer_pool_dump_now innodb_buffer_pool_load_at_startup innodb_buffer_pool_dump_at_startup innodb_buffer_pool_filename
buffer pool预热分为dump过程和load过程,均由后台线程buf_dump_thread完成。
比如用户发起set命令
set global innodb_buffer_pool_dump_now=on; set global innodb_buffer_pool_load_now=on;
set 命令会立刻返回,具体操作由buf_dump_thread来实现。
dump过程一般比较快,而load过程相对要慢些。
通过Innodb_buffer_pool_dump_status、Innodb_buffer_pool_load_status可查看dump/load的状态
另外5.7引入了performance_schema.events_stages_current来显示load进度,每load 32M会更新一条进度信息
select * from performance_schema.events_stages_current; THREAD_ID 19 EVENT_ID 1367 END_EVENT_ID NULL EVENT_NAME stage/innodb/buffer pool load SOURCE buf0dump.cc:619 TIMER_START 33393877311000 TIMER_END 33398961258000 TIMER_WAIT 5083947000 WORK_COMPLETED 0 WORK_ESTIMATED 1440 NESTING_EVENT_ID NULL NESTING_EVENT_TYPE NULL
WORK_ESTIMATED表示总page数
WORK_COMPLETED表示当前已load page数
dump文件的数据格式如下
#cat ib_buffer_pool |more
dump文件比较简单,我们可以编辑此文件来预加载指定page,比较灵活。
buffer pool 动态调整大小5.7 开始支持buffer pool 动态调整大小,每个buffer_pool_instance都由同样个数的chunk组成(chunks数组), 每个chunk内存大小为innodb_buffer_pool_chunk_size(实际会偏大5%,用于存放chuck中的block信息)。buffer pool以innodb_buffer_pool_chunk_size为单位进行动态增大和缩小。调整前后innodb_buffer_pool_size应一直保持是innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances的倍数。
同样的buffer pool动态调整大小由后台线程buf_resize_thread,set命令会立即返回。通过InnoDB_buffer_pool_resize_status可以查看调整的运行状态。
resize流程
从free_list中摘除待删chunk的page放入待删链表buf_pool- withdraw 如果待删chunk的page为脏页,则刷脏 重新加载LRU中要删除的页,从LRU中摘除,重新从free列表获取page老的page放入待删链表buf_pool- withdraw 释放buffer pool锁 如果需收缩的chunk pages没有收集全,重复2-6
释放buffer_pool,page_hash锁 如果改变/缩小超过2倍,会重启和buffer pool大小相关的内存结构,如锁系统(lock_sys_resize),AHI(btr_search_sys_resize), 数据字段(dict_resize)等
由上可以看出,扩大内存比缩小内存相对容易些。缩小内存时,如果遇到有事务一直未提交且占用了待收缩的page时,导致收缩一直重试,error log会打印这种重试信息,
包含可能引用此问题的事务信息。为了避免频繁重试,每次重试的时间间隔会指数增长。
以上步骤中resize阶段buffer pool会不可用,此阶段会锁所有buffer pool, 但此阶段都是内存操作,时间比较短。收缩内存阶段耗时可能会很长,也有一定影响,但是每次都是以instance为单位进行锁定的。
总的来说,buffer pool 动态调整大小对应用的影响并不大。
重新加载LRU中要删除的页的影响
search 过程中btr游标保存的page可能重新加载过,自适应哈希保存的root page也可能重新加载过, 都需要重新读取。
buffer pool 预热 和buffer pool 动态调整大小,这两功能相辅相承的。buffer pool 动态调整大小只适用于实例在主机本地升级的情况,如果用户修改buffer pool大小,同时涉及跨机迁移,那么buffer pool 预热功能就排上用场了。
另外buffer pool 动态调整尽量在业务低锋时进行。
MySQL Buffer pool里的change buffer是啥? change buffer是一种特殊的数据结构,当这些页面不在缓冲池中时,这些高速缓存会将更改缓存到辅助索引页面。可能由INSERT,UPDATE或DELETE操作(DML)导致的缓冲更改将在以后通过其他的读取操作将页加载到缓冲池中时合并。
MySQL - InnoDB特性 - Buffer Pool漫谈 缓存管理是DBMS的核心系统,用于管理数据页的访问、刷脏和驱逐;虽然操作系统本身有page cache,但那不是专门为数据库设计的,所以大多数数据库系统都是自己来管理缓存。由于几乎所有的数据页访问都涉及到Buffer Pool,因此buffer pool的并发访问控制尤为重要,可能会影响到吞吐量和响应时间,本文主要回顾一下MySQL的buffer Pool最近几个版本的发展(若有遗漏,欢迎评论补充), 感受下最近几年这一块的进步 MySQL5.5之前 只能设置一个buffer pool, 通过innodb_buffer_pool_size来控制, 刷脏由master线程承担,扩展性差。
db匠 rds内核团队秘密研发的全自动卖萌机. 追加特效: 发数据库内核月报. 月报传送: http://mysql.taobao.org/monthly/
相关文章
- Mysql超大分页优化处理
- MySQL单列索引和组合索引的选择效率与explain分析
- MySQL · 最佳实践 · RDS 只读实例延迟分析
- MySQL Explain中key_len的计算
- mysql修改表结构
- MySQL内核月报 2015.03-MySQL · 答疑释惑· 并发Replace into导致的死锁分析
- MySQL · 特性分析 · 优化器 MRR & BKA
- MySQL · BUG分析 · Rename table 死锁分析
- MySQL创建联合索引,字段的先后顺序,对查询的影响分析
- MySQL优化union查询
- MySQL · 特性分析 · innodb 锁分裂继承与迁移
- mysql索引的使用傻瓜教程
- Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析
- Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析
- 〖Python 数据库开发实战 - MySQL篇㉞〗- 综合案例 - 新闻管理系统数据库设计的基本属性
- 实战解析丨如何对Mysql连接请求的tcpdump内容进行分析
- mysql的事务是什么 mybatis框架中的事务配置 mybatis中的自动提交事务和手动提交事务 深入理解mybatis事务源码 通过对象的地址来理解mysbaits中的会话 对象的首地址
- 详解mysql的explain,并分析id,select_type,table,type,possible_keys, Key,key_len,ref,rows,filtered,Extra的含义
- 如何测试mysql是否安装成功
- mysql中的联合查询(内联、左联、外联、右联、全联)
- Mysql 中source命令详解
- MySQL远程连接报错2003-cant connection to mysql server on ‘IP’(10061 unknown error)
- Jmeter——MySQL数据库性能分析以及计划书模板(六)
- MySQL 性能分析 show profile