MySQL必知必会:用十一张图讲清楚,当你CRUD时BufferPool中发生了什么!以及BufferPool的优化!(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL必知必会:用十一张图讲清楚,当你CRUD时BufferPool中发生了什么!以及BufferPool的优化!(二)

六、配置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/


推荐阅读#


  1. 大家常说的基数是什么?(已发布)
  2. 讲讲什么是慢查!如何监控?如何排查?(已发布)
  3. 对NotNull字段插入Null值有啥现象?(已发布)
  4. 能谈谈 date、datetime、time、timestamp、year的区别吗?(已发布)
  5. 了解数据库的查询缓存和BufferPool吗?谈谈看!(已发布)
  6. 你知道数据库缓冲池中的LRU-List吗?(已发布)
  7. 谈谈数据库缓冲池中的Free-List?(已发布)
  8. 谈谈数据库缓冲池中的Flush-List?(已发布)
  9. 了解脏页刷回磁盘的时机吗?(已发布)
  10. 用十一张图讲清楚,当你CRUD时BufferPool中发生了什么!以及BufferPool的优化!(已发布)
  11. 听说过表空间没?什么是表空间?什么是数据表?(已发布)
  12. 谈谈MySQL的:数据区、数据段、数据页、数据页究竟长什么样?了解数据页分裂吗?谈谈看!(已发布)
  13. 谈谈MySQL的行记录是什么?长啥样?(已发布)
  14. 了解MySQL的行溢出机制吗?(已发布)
  15. 说说fsync这个系统调用吧! (已发布)
  16. 简述undo log、truncate、以及undo log如何帮你回滚事物! (已发布)
  17. 我劝!这位年轻人不讲MVCC,耗子尾汁! (已发布)
  18. MySQL的崩溃恢复到底是怎么回事? (已发布)
  19. MySQL的binlog有啥用?谁写的?在哪里?怎么配置 (已发布)
  20. MySQL的bin log的写入机制 (已发布)
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7天前
|
SQL 关系型数据库 MySQL
MySQL慢查询优化、索引优化、以及表等优化详解
本文详细介绍了MySQL优化方案,包括索引优化、SQL慢查询优化和数据库表优化,帮助提升数据库性能。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
MySQL慢查询优化、索引优化、以及表等优化详解
|
11天前
|
缓存 监控 关系型数据库
如何优化MySQL查询速度?
如何优化MySQL查询速度?【10月更文挑战第31天】
36 3
|
14天前
|
缓存 关系型数据库 MySQL
如何优化 MySQL 数据库的性能?
【10月更文挑战第28天】
37 1
|
15天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
77 1
|
16天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
47 0
|
8天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
22 4
|
6天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
19 1
|
1月前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
61 3
Mysql(4)—数据库索引
|
17天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
59 2
|
20天前
|
存储 关系型数据库 MySQL
MySQL vs. PostgreSQL:选择适合你的开源数据库
在众多开源数据库中,MySQL和PostgreSQL无疑是最受欢迎的两个。它们都有着强大的功能、广泛的社区支持和丰富的生态系统。然而,它们在设计理念、性能特点、功能特性等方面存在着显著的差异。本文将从这三个方面对MySQL和PostgreSQL进行比较,以帮助您选择更适合您需求的开源数据库。
80 4