MySQL-数据缓冲池(Buffer Pool)

  • InnoDB存储引擎以 为单位管理存储空间,增删改查的本质就是访问页面。为提高查询效率,DBMS会占用内存作为缓冲池,在执行SQL之前,会将磁盘上的页 缓存到内存中的 缓冲池(Buffer Pool)后执行相关SQL语句。

1、缓冲池(Buffer Pool)

  • 在InnoDB存储引擎中有部分数据会放到内存中,缓冲池占该内存的大部分空间,用来存储各种数据的缓存,如下所示:
  • 缓冲池的重要性:消除CPU和磁盘之间的鸿沟,InnoDB存储引擎中会将完整页的数据全部加载到内存中将其缓存起来,省去磁盘IO
  • 缓冲原则:"位置 * 频次"原则,提高I/O访问效率进行优化,会优先对使用频次高的热数据进行加载
  • 预读特性:在读取数据的时候存在一个"局部性原理" 即 使用一些数据,大概率会使用它周围的数据,则会采用预读的机制提前加载,有效减少未来可能的磁盘I/O操作

2、查询缓存

  • 是指提前将 查询结果缓存 起来,后续不需要执行就能获取到结果。
  • 在MySQL的查询缓存并非缓存查询计划,而是查询对应的结果,只要数据表发生变化,查询缓存都会失效。
  • 与 缓冲池 的共同特点都是通过缓存的机制提高效率

3、缓冲池读取数据

  • 缓冲池管理器会尽量将经常使用的数据保存起来,在数据库进行读操作的时候,首先会判断该页面是否在缓存池中,如果存在直接读取,如果不存在就会通过内存或磁盘将页面放到缓冲池中再进行读取。
  • 缓存在数据库中的结构和作用如下所示:
  • 当对数据库中的记录进行修改时,首先会修改缓冲池中页里面的记录信息,然后数据库会以一定频率刷新到磁盘上。缓冲池会采用一种叫 checkpoint 的机制 将数据写入磁盘

4、查看和设置缓冲池的大小

  • MyISAM存储引擎,只缓存索引,不缓存数据,对应的键缓存参数为:key_buffer_size
  • InnoDB存储引擎,通过查看innodb_buffer_pool_size变量来查看缓冲池的大小,命令如下:
powershell 复制代码
mysql> show variables like '%innodb_buffer_pool_size';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (1.01 sec)
  • InnoDB存储引擎设置缓冲池大小,命令如下:
powershell 复制代码
mysql> set global innodb_buffer_pool_size=268435456;
Query OK, 0 rows affected (0.45 sec)

mysql> show variables like '%innodb_buffer_pool_size';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 268435456 |
+------------------------

5、多个缓冲池(Buffer Pool)实例

  • 缓冲池的本质就是 InnoDB向操作系统申请一块 连续的内存空间,在多线程环境下,访问Buffer Pool中的数据都需要加锁处理。
  • Buffer Pool 特别大并且多线程并发访问特别高时,可以将Buffer Pool 拆分成若干个小的Buffer Pool ,每个Buffer Pool称为一个实例
  • 每个实例都是独立的去申请内存空间,独立的管理各种链表。
  • 查看缓冲池的个数,执行命令如下:
powershell 复制代码
mysql> show variables like '%innodb_buffer_pool_instances%';
+------------------------------+-------+
| Variable_name                | Value |
+------------------------------+-------+
| innodb_buffer_pool_instances | 1     |
+------------------------------+-------+
1 row in set (0.00 sec)
  • 对Buffer Pool拆分,可以在配置文件中配置 具体启动选项,如:
powershell 复制代码
[root@rqtanc ~]# vim /etc/my.cnf

[server]
innodb_buffer_pool_instances=2
  • Buffer Pool的实例大小相关计算依据为:innodb_buffer_pool_size/innodb_buffer_pool_instances

6、缓冲池更新数据流程

相关推荐
哆啦A梦15882 小时前
Springboot整合MyBatis实现数据库操作
数据库·spring boot·mybatis
Zzzzmo_2 小时前
【MySQL】JDBC(含settings.xml文件配置/配置国内镜像以及pom.xml文件修改)
数据库·mysql
FirstFrost --sy3 小时前
MySQL内置函数
数据库·mysql
2401_879693873 小时前
将Python Web应用部署到服务器(Docker + Nginx)
jvm·数据库·python
reembarkation3 小时前
光标在a-select,鼠标已经移出,下拉框跟随页面滚动
java·数据库·sql
eggwyw3 小时前
MySQL-练习-数据汇总-CASE WHEN
数据库·mysql
星轨zb3 小时前
通过实际demo掌握SpringSecurity+MP中的基本框架搭建
数据库·spring boot·spring security·mp
treacle田4 小时前
达梦数据库-配置本地守护进程dmwatcher服务-记录总结
数据库·达梦数据库·达梦数据库local数据守护
wyt5314294 小时前
Redis的安装教程(Windows+Linux)【超详细】
linux·数据库·redis
CeshirenTester4 小时前
从数据库到结构化用例:一套可落地的测试智能体架构
数据库·架构