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

相关推荐
好吃的肘子9 分钟前
MongoDB 应用实战
大数据·开发语言·数据库·算法·mongodb·全文检索
weixin_4723394617 分钟前
MySQL MCP 使用案例
数据库·mysql
lqlj22331 小时前
Spark SQL 读取 CSV 文件,并将数据写入 MySQL 数据库
数据库·sql·spark
遗憾皆是温柔2 小时前
MyBatis—动态 SQL
java·数据库·ide·sql·mybatis
未来之窗软件服务2 小时前
Cacti 未经身份验证SQL注入漏洞
android·数据库·sql·服务器安全
fengye2071613 小时前
在MYSQL中导入cookbook.sql文件
数据库·mysql·adb
拓端研究室TRL3 小时前
Python与MySQL网站排名数据分析及多层感知机MLP、机器学习优化策略和地理可视化应用|附AI智能体数据代码
人工智能·python·mysql·机器学习·数据分析
Ailovelearning3 小时前
neo4j框架:ubuntu系统中neo4j安装与使用教程
数据库·neo4j
_星辰大海乀4 小时前
表的设计、聚合函数
java·数据结构·数据库·sql·mysql·数据库开发
未来之窗软件服务5 小时前
solidwors插件 开发————仙盟创梦IDE
前端·javascript·数据库·ide·仙盟创梦ide