MySQL学习笔记-数据库内存

时间:2024-01-14 19:06:02
数据库内存

InnoDB存储引擎内存由以下几个部分组成:缓冲池(buffer pool)、重做日志缓冲池(redo log buffer)以及额外的内存池(additional memory pool),分别由配置文件中的参数innodb_buffer_pool_size和innodb_log_buffer_size的大小决定。
缓冲池中缓存的数据也类型有:索引页(index page)、数据页(data page)、插入缓冲(insert buffer)、自适应哈希索引(adaptive hash index)、InnoDB存储的锁信息(lock info)、数据字典信息(data dictionary)undo页等。
MySQL学习笔记-数据库内存

缓冲池

缓冲池是占内存最大的部分,用来存放各种数据的缓存。因为InnoDB的存储引擎的工作方式总是将数据库文件按页(每页16K)读取到缓冲池,然后按最近最少使用(LRU)的算法来保留在缓冲池中的缓存数据。如果数据库文件需要修改,总是首先修改在缓冲池中的页(发生修改后,该页即脏页),然后再按照一定的频率将缓冲池的脏页刷新(flush)到文件。

通过命令查看缓冲池(innodb_buffer_pool)的具体使用情况,如下所示:
  1. show variables like 'innodb_buffer_pool_size' \G;

MySQL学习笔记-数据库内存

通过命令查看重做日志缓冲池(innodb_log_buffer_size)的具体使用情况,如下所示:

  1. show variables like 'innodb_log_buffer_size' \G;
MySQL学习笔记-数据库内存

通过命令查看额外内存池(innodb_additional_mem_pool_size)的具体使用情况,如下所示:
  1. show variables like 'innodb_additional_mem_pool_size' \G;
MySQL学习笔记-数据库内存

通过命令SHOW ENGINE INNODB STATUS来查看innodb_buffer_pool的具体使用情况,如下所示:
  1. show engine innodb status \G;
MySQL学习笔记-数据库内存

日志缓冲

日志缓冲将重做日志信息(redo log)先放入这个缓冲区,然后按一定的频率将其刷新到重做日志文件。该值一般不需要设置为很大,因为一般情况下每一个秒钟就会将重做日志缓冲刷新到日志文件,因此只需要保证每秒产生的事务量在这个缓冲大小之类即可。注:对于《cache 与 buffer》在另外的篇章中有较为着重对说明,请仔细关注。

额外内存池

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