六、配置Buffer Pool的大小#
buffer pool越大,MySQL的性能就越强悍。你可以像下面这样配置Buffer Pool的大小。
mysql> SET GLOBAL innodb_buffer_pool_size=402653184;
七、配置多个Buffer Pool的实例#
你可以为MySQL实例配置多个Buffer Pool,每个Buffer Pool各自负责管理一部分缓存页,并且有自己独立的LRU、Free、Flush链表。
当有多线程并发请求过来时,线程可以在不同的Buffer Pool中执行自己的操作,MySQL性能就会得到很大的提升
在my.d中进行配置
[server] innodb_buffer_pool_size = xxx innodb_buffer_pool_instances = 4
意思是将总容量为xxx的buffer pool划分成4个实例。每个实例都有 xxx/4 的容量。
参数innodb_buffer_pool_instances
的最大值为64,并且想让该参数生效,innodb_buffer_pool_size
容量至少是1G。
可以像下面这样查看你的MySQL的Buffer Pool实例状态。
八、揭秘BufferPool的真实结构#
现实中Buffer Pool动辄就占用好几G的内存,相对于直接申请几G的内存完成扩容,MySQL有更优雅的实现方式。
为了实现动态调整Buffer Pool的大小。MySQL设计了chunk 机制。
可以看上图脑补一下Buffer Pool 以及 Chunk长什么样。
总的来说:就是将每一个 Buffer Pool Instance 更加细力度化。将Buffer Pool拆分成更小的独立单元。
每个Buffer Pool划分成多个chunnk,每个chunk中维护一部分缓存页、缓存页的描述信息。同属于一个Buffer Pool的chunk共享该Buffer Pool的lru、free、flush链表。
块大小由参数innodb_buffer_pool_chunk_size
控制,默认值为 128M
该参数可以像下面这样修改:
shell> mysqld --innodb-buffer-pool-chunk-size=134217728
或者通过配置文件自定义
[mysqld] innodb_buffer_pool_chunk_size=134217728
九、看一看Buffer Pool相关的参数#
执行命令
> mysql show engine innodb status
十、如何规划你的Buffer Pool大小#
推荐将Buffer Pool的总大小设置为服务器内存的 50%~60%左右
BufferPool总大小 = (chunkSize * bufferPoolInstanceNum)*2
十一、Buffer Pool的预热机制#
这种机制实际上是想让重启后的MySQL快速适应大规模的流量请求。
InnoDB 在服务器关闭时为每个缓冲池保存一部分最近高频使用的页面,并在服务器启动时恢复这些页面。保存多大比例的缓存页由参数innodb_buffer_pool_dump_pct
控制。
在启动时还原缓冲池,实际上会缩短预热的时间。
你可以通过下面的方式配置该参数
# 通过命令 SET GLOBAL innodb_buffer_pool_dump_pct=40; # 通过文件 [mysqld] innodb_buffer_pool_dump_pct=40
参数innodb_buffer_pool_dump_at_shutdown
控制 MySQL关闭时保存缓冲池的状态,默认为on的状态。
启动参数--innodb-buffer-pool-load-at-startup
表示启动MySQL的时候恢复缓冲池中的状态,默认也是开启的。
参考:
https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool-resize.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-preload-buffer-pool.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-preload-buffer-pool.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool-resize.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-performance-midpoint_insertion.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-performance-read_ahead.html
https://dev.mysql.com/doc/refman/8.0/en/innodb-buffer-pool.html
https://lalitvc.wordpress.com/2016/11/03/mysql-architecture-and-components/
推荐阅读#
- 大家常说的基数是什么?(已发布)
- 讲讲什么是慢查!如何监控?如何排查?(已发布)
- 对NotNull字段插入Null值有啥现象?(已发布)
- 能谈谈 date、datetime、time、timestamp、year的区别吗?(已发布)
- 了解数据库的查询缓存和BufferPool吗?谈谈看!(已发布)
- 你知道数据库缓冲池中的LRU-List吗?(已发布)
- 谈谈数据库缓冲池中的Free-List?(已发布)
- 谈谈数据库缓冲池中的Flush-List?(已发布)
- 了解脏页刷回磁盘的时机吗?(已发布)
- 用十一张图讲清楚,当你CRUD时BufferPool中发生了什么!以及BufferPool的优化!(已发布)
- 听说过表空间没?什么是表空间?什么是数据表?(已发布)
- 谈谈MySQL的:数据区、数据段、数据页、数据页究竟长什么样?了解数据页分裂吗?谈谈看!(已发布)
- 谈谈MySQL的行记录是什么?长啥样?(已发布)
- 了解MySQL的行溢出机制吗?(已发布)
- 说说fsync这个系统调用吧! (已发布)
- 简述undo log、truncate、以及undo log如何帮你回滚事物! (已发布)
- 我劝!这位年轻人不讲MVCC,耗子尾汁! (已发布)
- MySQL的崩溃恢复到底是怎么回事? (已发布)
- MySQL的binlog有啥用?谁写的?在哪里?怎么配置 (已发布)
- MySQL的bin log的写入机制 (已发布)