《InnoDB引擎‍》 MySQL缓存池

Posted DATA数据猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《InnoDB引擎‍》 MySQL缓存池相关的知识,希望对你有一定的参考价值。

mysql缓存池

  InnoDB存储引擎是基于磁盘存储的,并将其中记录按照页的方式进行管理。因此可以将其视为基于磁盘的数据库

  在数据库系统中,由于CPU速度和磁盘速度之间的鸿沟,基于磁盘的数据库系统通常使用缓冲池技术来提高数据库整体性能

  缓冲池简单点说就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。

  数据库中读取页的操作流程是:首先将从磁盘读到的页存放在缓冲池中,这个过程称为将页"FIX"在缓冲池中。下一次再读相同页的时候,首先判断该页是否存在缓冲池中。如在缓冲池中,称该页在缓冲池中被命中,直接读取该页。否则,读取磁盘上的页。

  数据库中修改操作流程是:首先修改在缓冲池中的页,然后以一定频率刷新到磁盘上。需要注意的是,页从缓冲池刷新回到磁盘的操作并不是每次页发生更新时触发,而是通过一种称为CheckPoint的机制刷新回到磁盘。同样,也是为了提高数据库的整体性能。

  对于InnocentDB存储引擎而言,缓冲池的配置通过参数innodb_buffer_pool_size来设置。

mysql> show variables like 'innodb_buffer_pool_size'\\G;
*************************** 1. row ***************************
Variable_name: innodb_buffer_pool_size
        Value: 134217728
1 row in set (0.00 sec)

  具体来看,缓冲池中缓存的数据页类型有:索引页、数据页、undo页、插入缓存(insert buffer)、自适应哈希索引(adaptive hash index)、InnoDB存储的锁信息(lock info)、数据字典信息(data dictionary)等。不能简单的认为,缓冲池只是缓存索引页和数据页,他们只是占缓冲池很大一部分而已。

  从InnoDB 1.0.x版本开始,允许有多个缓冲池实例。每个页根据哈希值平均分配到不同缓冲池实例中。这样做的好处是减少数据库内部的资源竞争,增加数据库的并发处理能力。可通过innodb_buffer_pool_instances进行配置,默认为1。

mysql> show variables like 'innodb_buffer_pool_instances'\\G;
*************************** 1. row ***************************
Variable_name: innodb_buffer_pool_instances
        Value: 1
1 row in set (0.00 sec)

  在配置文件中将innodb_buffer_pool_instances设置为大于1的值就可以得到多个缓冲池实例。需要注意的是,当配置多个缓冲池实例时,仅当innodb_buffer_pool_size大小设置为1GB或更大的时候,此选项才生效。指定的总大小将分配给所有缓冲池。为了获得最佳效率,指定组合innodb_buffer_pool_instancesinnodb_buffer_pool_size,使得每个缓冲池实例至少是1GB。再通过命令show engine innodb status即可观察。

mysql> show engine innodb status\\G;
*************************** 1. row ***************************
  Type: InnoDB
  Name:
Status:
=====================================
2022-11-16 14:51:11 0x7f7f6005a700 INNODB MONITOR OUTPUT
=====================================
......
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 137428992
Dictionary memory allocated 117329
Buffer pool size   8191
Free buffers       7622
Database pages     566
Old database pages 228
Modified db pages  0
Pending reads      0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 532, created 34, written 36
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
Buffer pool hit rate 407 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 566, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
......

  从MySQL 5.6版本开始,还可以通过information_schema架构下的表Innodb_buffer_pool_stats来观察缓存状态

mysql> use information_schema;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> select pool_id,pool_size,free_buffers,database_pages
    -> from innodb_buffer_pool_stats\\G;
*************************** 1. row ***************************
       pool_id: 0
     pool_size: 8191
  free_buffers: 7652
database_pages: 536
1 row in set (0.00 sec)

以上是关于《InnoDB引擎‍》 MySQL缓存池的主要内容,如果未能解决你的问题,请参考以下文章

Mysql高级知识总结

Mysql高级知识总结

Mysql高级知识总结

Mysql高级知识总结

MySQL - Innodb存储引擎整理

Mysql Innodb体系结构