天天看点

MySQL InnoDB的内存管理

一、前言:数据库的引擎是整个mysql数据库的核心组件,mysql的存储引擎众多,MyISAM、InnoDB、Memory、Archive等,其中InnoDB是mysql里面支持事务类型的一个存储引擎最好的一个,雅虎、facebook、youtube、淘宝、谷歌用的mysql数据库都有用到InnoDB的存储引擎;

在此附上经典的mysql的架构图:

MySQL InnoDB的内存管理
二、通过了解mysql的系统架构之后,便可以初步的了解innodb存储引擎的架构模型了,接下来又是一张经典的innodb存储引擎的系统架构图
MySQL InnoDB的内存管理

从图上看可以清晰的看到innodb存储引擎可以分为三部分:内存、进程、数据文件(如果了解ORACLE的话,ORACLE的架构体系跟这个是很像的,在比较中学习总是很有一番趣味)

2.1 innodb的内存的作用大致如下:

  • 缓存磁盘上的数据,方便快速的读取;
  • 对磁盘文件的数据进行修改之前在这里缓存;
  • 应用所作的日志的缓存;
  • 内存结构自身的管理结构;

内存结构根据功能可以分成三部分:Innodb buffer pool、additional buffer pool、log buffer;

2.1.1 Innodb buffer pool:缓冲池,从图上可以看到buffer pool占用最大块的内存部分,主要用来各种数据的缓冲。innodb将数据文件按页(16K)读取到缓冲池,然后按最少使用(LRU)算法来保留缓存数据;数据文件修改时,先修改缓存池中的页(即脏页),然后按一定平率将脏页刷新到文件;

通过语句可以查看mysql各内存的分配情况:

mysql> show variables like 'innodb_%_size';

+---------------------------------------------------+------------------+

| Variable_name | Value |

+----------------------------------------------------+------------------+

| innodb_additional_mem_pool_size | 8388608    |

| innodb_buffer_pool_size                | 134217728 |

| innodb_log_buffer_size                  |     8388608 |

| innodb_log_file_size                       |     5242880 |

| innodb_purge_batch_size               |             20 |

+-------------------------------------------+-----------------+

5 rows in set (0.00 sec)

innodb_additional_mem_pool_size 的大小为8388608/1024/1024=8M

innodb_buffer_pool_size 的大小134217728/1024/1024=128M

innodb_log_buffer_size 的大小8388608/1024/1024=8M

运行脚本:show engine innodb status可以查看innodb_buffer_pool的运行情况;

mysql> show engine innodb status\G;

***********************************************************

Type: InnoDB

Name:

Status:

Total memory allocated 137363456; in additional pool allocated 0

Dictionary memory allocated 53307

Buffer pool size 8192

Free buffers 7784

Database pages 406

Old database pages 0

Modified db pages 0

*********************************************************************************************

红色的文字显示InnoDB存储引擎缓冲池的使用情况,这边的单位是buffer frame,每个buffer frame为16K,通过计算可以查看buffer pool的使用情况

  • Buffer pool size 8192×16k/1024=128M (跟上面的参数值是一致的)
  • Free buffers表示当前空闲的缓冲帧7784×16k/1024=121MB
  • Database pages表示已经使用的缓冲帧 406×16k/1024=6.34MB
  • Modified db pages 表示脏页的数量,当前显示为0;
  • Old database pages表示LRU列表中old sublist中的数据块数量

对上面的innodb buffer pool细看会发现,buffer pool的数据类型又可以分为:page cache、hash index、undo、insert buffer、explicit locks;

2.1.2 Log Buffer:日志缓冲池(功能跟oracle redo log buffer基本相似),将重做日志信息放入这个缓冲区,然后按一定频率将其刷新到重做日志文件。该值一般不需要设置很大,因为一般情况下每一秒钟就会将重做日志缓冲刷新到日志文件,因此我们只需要保证每秒产生的食物量在这个缓冲大小之内即可;

脚本: show variables like ' innodb_log_buffer_size ';   可以显示log buffer的大小;

2.1.3 additional buffer pool:额外缓冲池,mysql技术内部Innodb存储引擎上面是这样介绍的:

在innodb存储引擎中,对内存的管理是通过一种称为内存堆的方式进行的。在对一些数据结构本身分配内存时,需要从额外获得内存池中申请,当该区域的内存不够时,Innodb会从缓冲池中申请。但是每个缓冲池中的frame buffer还有对应的缓冲控制对象,这些对象记录了诸如LRU、锁、等待等方面的信息,而这个对象的内存需要从额外内存中申请。因此,当你申请了很大的Innodb缓冲池时,这个值也应该相应增加;

简单理解为:额外缓冲池用于管理缓冲池的内容的,所以缓冲池越大额外换池也需要越大;

继续阅读