博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL--InnoDB 体系架构
阅读量:5140 次
发布时间:2019-06-13

本文共 2453 字,大约阅读时间需要 8 分钟。

InnoDB 体系架构

后台线程

 

Master Thread

  Master Thread 是一个非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲、UNDO 页的回收等。

 

IO Thread

  在 InnoDB 存储引擎中大量使用了 AIO(Async IO)来处理写 IO 请求,这样可以极大提高数据库的性能。而 IO Thread 的主要工作是负责这些 IO 请求的回调处理。

  

   innodb_read_io_threads 、 innodb_write_io_threads :分别控制 read thread 和 write thread 数量。

 

Purge Thread

  事务被提交后,其所使用的 undolog 可能不再需要,因此需要 PurgeThread 来回收已经被使用并分配的 undo 页。

  用户可以在 MySQL 数据库的配置文件中添加如下命令来启用独立的 Purge Thread(默认是 Master Thread 来完成回收工作):

       innodb_purge_threads=n //innodb 支持多个 Purge Thread

 

Page Cleaner Thread

  作用是将之前版本中脏页的刷新操作都放入到单独的线程中来完成。目的是为了减轻原 Master Thread 的工作及对于用户查询线程的阻塞,进一步提高 InnoDB 存储引擎的性能。

 

内存

 

缓冲池

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

  对于数据库中页的修改操作,则首先修改在缓冲池中命中的页,然后再以一定的频率刷新到磁盘上。页从缓冲池刷新回磁盘的操作并不是在每次页发生更新时触发,而是通过 Checkpoint 的机制刷新回磁盘。同样,这也是为了提高数据库的整体性能。

   innodb_buffer_pool_size 设置缓冲池大小

  缓冲池中缓存的数据页类型有:索引页、数据页、undo 页、插入缓冲、自适应哈希索引、InnoDB 存储的锁信息、数据字典信息等。

  

  从 InnoDB 1.0.x 版本开始,允许有多个缓冲池实例。这样做的好处是减少数据库内部的资源竞争,增加数据库的并发处理能力。可通过下面的参数进行配置:

       innodb_buffer_pool_instances=n //该值默认为 1

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

 

LRU List、Free List 和 Flush List

  数据库的缓冲池是通过 LRU(Latest Recent Used,最近最少使用) 算法来进行管理的。即最频繁使用的页在 LRU 列表的前端,而最少使用的页在 LRU 列表的尾端。当缓冲池不能存放新读取到的页时,将首先释放 LRU 列表中尾端的页。

  在 InnoDB 存储引擎中,缓冲池中的页默认为 16KB。InnoDB 使用的并非是朴素的 LRU 算法。

   innodb_old_blocks_pct //控制新读取的页插入到 LRU 列表尾端的位置

   innodb_old_blocks_time //控制页读取到 mid 位置后需要等待多久才会被加入到 LRU 列表的热端

  

    当页从 LRU 列表的 old 部分加入到 new 部分时,称此时发生的操作为 page made young,而因为 innodb_old_blocks_time 的设置而导致页没有从 old 部分移动到 new 部分的操作称为 page not made young。

    Free buffers 表示当前 Free 列表中也的数量

    Database pages 表示 LRU 列表中页的数量

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

    youngs/s、non-youngs/s 表示每秒这两类操作的次数。

    Buffer pool hit rate 表示缓冲池命中率,通常该值不应该小于 95%。若发生小于 95% 这种情况,用户需要观察是否是由于全表扫描引起的 LRU 列表被污染的问题。

    Modified db pages 显示了脏页的数量。

  可以通过 INNODB_BUFFER_POOL_STATS 来观察缓冲池的运行状态。

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

 

重做日志缓冲

  InnoDB 存储引擎首先将重做日志信息先放入到这个缓冲区,然后按一定频率将其刷新到重做日志文件。

  重做日志文件一般不需要设置的很大,因为一般情况下每秒会将重做日志缓冲刷新到日志文件,因此用户只需要保证每秒产生的事务量在这个缓冲大小之内即可。

       innodb_log_buffer_size //默认为 8MB

 

额外的内存池

  在对一些数据结构本身的内存进行分配时,需要从额外的内存池中进行申请,当该区域的内存不够时,会从缓冲池中进行申请。

转载于:https://www.cnblogs.com/microcat/p/7404604.html

你可能感兴趣的文章
手机号脱敏处理
查看>>
CI控制器调用内部方法并载入相应模板的做法
查看>>
Hdu - 1002 - A + B Problem II
查看>>
HDU - 2609 - How many
查看>>
每天CookBook之Python-003
查看>>
每天CookBook之Python-004
查看>>
Android设置Gmail邮箱
查看>>
StringBuffer的用法
查看>>
js编写时间选择框
查看>>
PHP压缩文件操作
查看>>
Java数据结构和算法(四)--链表
查看>>
JIRA
查看>>
小技巧——直接在目录中输入cmd然后就打开cmd命令窗口
查看>>
深浅拷贝(十四)
查看>>
由级别和性格特征将程序员分类 ---看看你属于哪一种
查看>>
HDU 6370(并查集)
查看>>
BZOJ 1207(dp)
查看>>
PE知识复习之PE的导入表
查看>>
HDU 2076 夹角有多大(题目已修改,注意读题)
查看>>
洛谷P3676 小清新数据结构题(动态点分治)
查看>>