Home > Database > Mysql Tutorial > MySQ LInno DB体系架构之内存_MySQL

MySQ LInno DB体系架构之内存_MySQL

WBOY
Release: 2016-06-01 13:04:30
Original
1063 people have browsed it

先上图

\

1.缓冲池

InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。通常使用缓冲池来提高数据库的整体性能。缓冲池简单说就是一块内存,通过内存的速度弥补磁盘速度较慢对数据库性能的影响。在数据库中进行读操作时,首先将从磁盘读到的页存放在缓冲池中,下一次读取相同的页时,首先判定是否存在缓冲池中,如果有就是被命中直接读取,没有的话就从磁盘中读取。在数据库进行改操作时,首先缓冲池中的页,然后在以一定的频率刷新到磁盘上。这里的刷新机制不是每页在发生变更时触发。而是通过一种checkpoint机制刷新到磁盘的。可以通过innodb_buffer_pool_size(单位块)参数来设置缓冲池的大小。缓冲池中的数据库类型有:索引页、数据页、undo页、插入缓存页(insert buffer)、自适应hash(adaptive hash index)、innodb存储的锁信息(lock info)、数据字典信息(data dictionary)。通过参数innodb_buffer_pool_instances设置允许有多个缓冲池实例,每个页根据哈希值平均分配到不同的实例中,以减少数据库内部资源的竞争,增加数据库的并发处理能力。

2.LRU List、Free List和Flush List

innoDB存储引擎的缓冲池是通过LRU算法来进行管理的,即最频繁使用的页在LRU列表(管理已经读取到的页)的前段,最少使用的页在LRU列表的尾端。缓冲池中每页大小16K。但是它对LRU算法做了一些优化,加入了midpoint位置。新获取的数据放入midpoint,而不是放入列表头部。通常midpoint在LRU列表的5/8处。可以通过innodb_old_blocks_pct参数来设置。把midpoint之后的列表称为old列表,之前的称为new列表。为什么在innoDB存储引擎采用midpoint呢?这是因为如直接将读取到的也放入LRU的首端,某些SQL操作导致缓冲池中的页被刷出,从而影响缓冲池的效率。可以通过参数innodb_old_blocks_time设置页读取到midpoint位置后需要等待多久才会加入LRU的new列表。

当数据库刚启动时,LRU列表是空的,这时所有的页都放在Free列表中的。当需要从缓冲池中分配页时,首先从Free列表中查看是否有空闲的空闲页,若有则从Free列表中删除然后加入到LRU列表中。否则根据LRU算法,淘汰LRU列表末尾的页,将该内存空间分配给新的页。当页从LRU的old部分加入到new部分,此时发生的操作是page made young,而因为innodb_old_blocks_time参数的设置导致页没有从old加入到new的操作称为page not made young。从InnoDB存储引擎1.0.X版本开始支持压缩页的功能。即将原来16K的页压缩为1K、2K、4K和8K,由于页的大小发生变化,LRU列表页有相应的变化,对于非16K的页时通过unzip_LRU列表进行维护。在LRU列表中的页被修改后,该页称为脏页(dirry page),这时数据库通过checkpoint机制将脏页刷回磁盘。而Flush列表中的页就是脏页列表。脏页即存在于LRU列表页存在于Flush列表。LUR列表用来管理缓冲池中页的可用性,Flush列表用来管理将也刷回磁盘。可以通过show engine innodb status命令来查看LRU列表和Free列表的使用情况和运行状态。
\
由图可以看出:

Buffer pool size总共有8191个页(8191*16k);

Free buffers表示当前Free列表中的页的数量;

Datebase pages表示LRU列表中页的数量。可能Free buffers和Database pages之和不等于Buffer pool size。这是因为缓冲池中的也还可能会被分配给自适应哈希索引、lock信息、insert buffer等页。而这部分是不需要LRU算法维护的,因此不在LRU列表中。

page made young表示LRU列表中页移动到前段的次数。

Buffer pool hit rate表示缓冲池的命中率,该值不能小于95%。

LRU len表示LRU列表中有多少页。

unzip_LRU len表示压缩的页数;其中LRU len包含unzip_LRU len。Modified db pages表示当前脏页的数量。

还可以通过 information_schema.INNODB_BUFFER_PAGE_LRU表来观察LRU列表中每个页的具体信息。

3.重做日志缓冲(redo log buffer)

innoDB存储引擎首先将重做日志信息放入这个缓冲区,然后按照一定的频率将其刷入重做日志文件中。重做日志缓冲区一般不需要很多,只要保证每秒产生的事务量在这个缓冲大小之内即可。可以通过innodb_log_buffer_size参数设置大小。

4.额外的内存池

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

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template