MySQL InnoDB的内存管理

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

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

 

二、通过了解mysql的系统架构之后,便可以初步的了解innodb存储引擎的架构模型了,接下来又是一张经典的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缓冲池时,这个值也应该相应增加;

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

 

总结:了解数据库的内存结构,为深入学习innodb奠定一个良好的理论基础;工作中很多人都不愿意学习理论性的基础,就像在学习数据库的时候,大部分人更倾向于学习一些sql语句修改:比如扩大表空间、修改数据文件。个人在学习的时候从来不记录这些语句的,毕竟需要用的时候网上搜索一箩筐,而是更喜欢记录一些原理性的东西,做到每个操作都胸有成竹;

........................................................................................................................................................................

本文作者:JOHN,某上市公司DBA,业余时间专注于数据库的技术管理,从管理的角度去运用技术。

技术博客:猎人笔记               数据库技术群:367875324 (请备注ORACLE管理 ) 

........................................................................................................................................................................

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。