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

额外的内存池

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

MySQL--InnoDB 体系架构的更多相关文章

  1. InnoDB体系架构(二)内存

    InnoDB体系架构(二)内存 上篇文章 InnoDB体系架构(一)后台线程 介绍了MySQL InnoDB存储引擎后台线程:Master Thread.IO Thread.Purge Thread. ...

  2. InnoDB体系架构(一)后台线程

    InnoDB体系架构——后台线程 上一篇已经了解了MySQL数据库的体系结构 这一篇除了介绍InnoDB存储引擎的体系架构外,同时进一步了解InnoDB的后台线程. InnoDB存储引擎是多线程的模型 ...

  3. InnoDB体系架构

    MySQL支持插件式存储引擎,常用的存储引擎则是MyISAM和InnoDB,通常在OLTP(Online Transaction Processing 在线事务处理)中,我们选择使用InnoDB,所以 ...

  4. InnoDB体系架构(四)Master Thread工作方式

    Master Thread工作方式 在前面的文章:InnoDB体系架构——后台线程 说到:InnoDB存储引擎的主要工作都是在一个单独的后台线程Master Thread中完成.这篇具体介绍该线程的具 ...

  5. InnoDB体系架构(三)Checkpoint技术

    Checkpoint技术 前篇 InnoDB体系架构(二)内存 从缓冲池.缓冲池的管理.重做日志缓冲.额外内存缓冲这四个点介绍了InnoDB存储引擎的内存结构,而在将缓冲池的数据刷新到磁盘的过程中使用 ...

  6. 2.3 InnoDB 体系架构

    下图简单显示了InnoDB的存储引擎的体系架构,从图可见,InnoDB储存引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,负责如下工作: 维护所有进程/线程需要访问的多个内部数据结构 缓存磁 ...

  7. MySQL技术内幕 InnoDB存储引擎 之 InnoDB体系架构

    后台线程 1.Master Thread 2.IO Thread 3.Purge Thread 4.Page Cleaner Thread  内存 重做日志在以下三种情况下将重做日志缓存中的内容刷新到 ...

  8. MySQL内存体系架构及参数总结 ---图解

    http://www.cnblogs.com/kissdb/p/4009614.html 内存结构: Mysql 内存分配规则是:用多少给多少,最高到配置的值,不是立即分配 图只做大概参考 全局缓存包 ...

  9. 18、MySQL内存体系架构及参数总结

    内存结构: Mysql 内存分配规则是:用多少给多少,最高到配置的值,不是立即分配 图只做大概参考 全局缓存包括: global buffer(全局内存分配总和) =    innodb_buffer ...

  10. mysql的体系架构和存储引擎

    定义数据库和实例 数据库:物理操作系统的文件或其他形式文件类型的集合.在mysql数据库中,数据库文件可以是frm.MYD.MYI.ibd结尾的文件. 实例:MySQL数据库由后台线程以及一个共享内存 ...

随机推荐

  1. Spark技术学院-进去能学到啥?

    Spark技术学院是什么? 主要是浪尖,前腾讯现阿里的大神一起搞的知识分享基地,旨在帮助大家由入门到精通spark,hbase,kafka大数据重要的框架,还有给入门小白指点入门方法,分享入门资料,对 ...

  2. mysql 免安装版密码操作

    登录MySQL:mysql -u root -p 1.修改用户密码: mysql> GRANT ALL ON . TO ‘root’@’localhost’ IDENTIFIED BY ‘123 ...

  3. JavaWeb高级编程(下篇)

    Java标准标签库 JSP标签语法中包含一些简写可以帮助轻松编写JSP.这些简写中第一个就是taglib指令. <%@ taglib prefix="c" uri=" ...

  4. 剑指offer - 顺时针打印矩阵 - JavaScript

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下 4 X 4 矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印 ...

  5. Hibernate--起步

    1.配置对象 配置对象是你在任何 Hibernate 应用程序中创造的第一个 Hibernate 对象,并且经常只在应用程序初始化期间创造.它代表了 Hibernate 所需一个配置或属性文件.配置对 ...

  6. React 学习笔记(2) 路由和UI组件使用

    安装依赖 cnpm install react-router-dom -S // 或 yarn add react-router-dom 导入 // index.js import React fro ...

  7. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-font

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  8. 学习spring第五天 mybatis+spring的整合(maven多模块数据查询使用了分页和连接池),以及aop

    mybatis+spring的整合: 导入的依赖:1.数据库连接:mysql-connector-java 2.连接池:druid 3.servlet:javax.servlet-api 4.jstl ...

  9. 关于SI522替代FM17522和MFRC522的资料对比

    以下是SI522与FM17522.MFRC522的对比参数: SI522是完全PIN对PIN软硬件兼容MFRC522.CV520.FM17522,另外我们可提供一对一技术支持解决客户所遇到的问题: 1 ...

  10. oracle查询语句注意事项:

    我想查出datatype 不等于1的所有结果,包括空. '; //这条sql查不出datatype为空的数据 发现oracle需要使用  is  null  .is  not null查询空或非空 ' ...