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、缓冲池更新数据流程

相关推荐
库库林_沙琪马33 分钟前
Redis 持久化:从零到掌握
数据库·redis·缓存
牵牛老人2 小时前
Qt中使用QPdfWriter类结合QPainter类绘制并输出PDF文件
数据库·qt·pdf
卡西里弗斯奥4 小时前
【达梦数据库】dblink连接[SqlServer/Mysql]报错处理
数据库·mysql·sqlserver·达梦
温柔小胖4 小时前
sql注入之python脚本进行时间盲注和布尔盲注
数据库·sql·网络安全
杨俊杰-YJ5 小时前
MySQL 主从复制原理及其工作过程
数据库·mysql
一个儒雅随和的男子5 小时前
MySQL的聚簇索引与非聚簇索引
数据库·mysql
独泪了无痕7 小时前
MySQL查询优化-distinct
后端·mysql·性能优化
V+zmm101347 小时前
基于微信小程序的家政服务预约系统的设计与实现(php论文源码调试讲解)
java·数据库·微信小程序·小程序·毕业设计
roman_日积跬步-终至千里7 小时前
【分布式理论14】分布式数据库存储:分表分库、主从复制与数据扩容策略
数据库·分布式
hadage2338 小时前
--- Mysql事务 ---
数据库·mysql