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