首页 > 数据库 >MySQL五:InnoDB线程模型

MySQL五:InnoDB线程模型

时间:2022-08-27 11:50:26浏览次数:127  
标签:线程 thread Thread MySQL InnoDB 刷新 innodb 磁盘

转载~

一、InnoDB线程模型的组成

在Innodb存储引擎中,后台线程的主要作用是「负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据」。此外它会将已经修改的数据文件刷新到磁盘文件中,保证在发生异常的情况下,Innodb能够恢复到正常的运行状态。

图片

「InnoDB存储引擎是多线程的模型,所以有多个不同的后台线程,负责处理不同的任务」。主要有:

Master Thread、IO Thread、Purge Thread、Page Cleaner Thread四种。图片

二 Master Thread

「Master thread是InnoDB的主线程,负责调度其他各线程,优先级最高」

  • 「主要作用」

    将缓冲池中的数据一步刷新到磁盘,保证数据的一致性。

  • 「主要工作」

    脏页的刷新(page cleaner thread)、undo页回收(purge thread)、redo日志刷新(log thread)、合并写缓冲等。

Master thread内部有两个主要处理时机,分别是每隔1秒和10秒处理。

  • 每隔1秒

    • innodb_max_dirty_pages_pct

    • innodb_io_capacity

      合并插入缓冲时,每秒合并插入缓冲的数量为 innodb_io_capacity值的5%,默认就是 200*5%=10

      在从缓冲区刷新脏页时,每秒刷新脏页的数量就等于innodb_io_capacity的值,默认200

    • 刷新日志缓冲区,刷到磁盘

    • 合并写缓冲区数据,根据IO读写压力来决定是否操作

    • 刷新脏页数据到磁盘,根据脏页比例达到75%才操作,此处涉及两个参数

      脏页比例通过innodb_max_dirty_pages_pct配置,innodb_max_dirty_pages_pct参数值保存在变量srv_max_buf_pool_modified_pct 里面,这是一个全局变量,初始值为 75.0

  • 每隔10秒

    • 刷新脏页数据到磁盘
    • 合并写缓冲区数据
    • 刷新日志缓冲区
    • 删除无用的undo页

三、 IO Thread

「为了提高数据库的性能,在InnoDB中使用了大量的AIO(Async IO)来做读写处理」

一共有4种总共10个IO Thread:

  • 「read thread」(4个)

    负责读取操作,将数据从磁盘加载到Buffer Pool的Page页。

  • 「write thread」(4个)

    负责写操作,将Buffer Pool的dirty page刷新到磁盘。

     show variables like "%innodb%io_threads%";
    

图片

  • 「log thread」(1个)

    负责将Log Buffer内容刷新到磁盘。

  • 「insert buffer thread」(1个)

    负责将Change Buffer内容刷新到磁盘。

    #查看当前IO线程的工作状态
    show engine innodb status;
    

图片

四 Purge Thread

事务提交之后,其使用的undo日志将不再需要,因此需要Purge Thread回收已经分配的undo 页。

早前的版本只支持一个Purge Thread,目前mysql 5.7版本支持多个Purge Thread,目的是为了进一步加快undo数据页的回收速度。

show variables like '%innodb_purge_threads%';

图片

五 Page Cleaner Thread

「作用是将脏数据放入到单独的线程中刷新到磁盘,脏数据刷盘后相应的redo log也就可以覆盖,即可以同步数据,又能达到redo log循环使用的目的」

减轻原来的Master Thread的工作,同时可以缓解用户查询线程的阻塞,进一步提高Innodb 存储引擎的性能。

 show variables like '%innodb_page_cleaners%';

图片

标签:线程,thread,Thread,MySQL,InnoDB,刷新,innodb,磁盘
From: https://www.cnblogs.com/yunlongn/p/16630214.html

相关文章

  • MySQL六:InnoDB数据文件
    转载~一、数据文件的组成innodb数据逻辑存储形式为表空间,而每一个独立表空间都会有一个.ibd数据文件,ibd文件从大到小组成:一个ibd数据文件-->Segment(段)-->Extent(区)-->P......
  • MySQL八:读懂MVCC多版本并发控制
    转载~mysql在并发的情况下,会引起脏读,幻读,不可重复读等一系列的问题,为解决这些问题,引入了mvcc的机制。本文就详细看看mvcc是怎么解决脏读,幻读等问题的。1、数据库事务1.......
  • MySQL九:MVCC能否解决幻读问题
    转载~幻读【前后多次读取,数据总量不一致】同一个事务里面连续执行两次同样的sql语句,可能导致不同结果的问题,第二次sql语句可能会返回之前不存在的行。事务A执行多次读......
  • MySQL十:索引基础知识回顾
    转载~1、索引简介1.1什么是索引索引是对数据库表中一列或多列的值进行排序的一种结构,可以大大提高MySQL的检索速度。索引在MySQL中也叫做key,当表中的数据量越来越大时,......
  • MySQL十一:索引基本原理
    转载~在上一篇《索引基础知识回顾》中提到索引按照存储结构划分有B-Tree索引、Hash索引、B+Tree索引类型,接下来就学习一下这几种索引结构以及在实际存储引擎中的使用情况......
  • 记一次血淋淋的MySQL崩溃修复案例
    摘要:今天给大家带来一篇MySQL数据库崩溃的修复案例本文分享自华为云社区《记一次MySQL崩溃修复案例,再也不用删库跑路了》,作者:冰河。问题描述研究MySQL源代码,调试并压......
  • MySQL MGR新增成员-xtrabackup
    4.6.在组复制中使用备份数据恢复失败的成员或增加新成员由于官方手册中使用了企业版的mysqlbackup做演示步骤,以下本节内容采用开源的percona-xtrabackup8.0.7版本演示对......
  • UnixBench跑分没有多线程数据的解决办法
    如图,只显示了单核的结果就退出了跑分第一种解决办法是找到UnixBench文件夹下的Run文件,编辑第110行的核数进行修改为自己的服务器核数然后再执行./Run  第二种办法如......
  • MySQL second_behind_master计算方式
    对于主从库主机时间不一致的情况,在I/O线程第一次启动时,会计算主从之间的主机时间差,在后续计算复制延迟时,会把这个时间差减掉,这样就可以保证正确获取到复制延迟时间,但是该时......
  • mysql的date类型:没有时分秒
    mysql的date类型:没有时分秒几种类型比较如下:日期时间类型占用空间日期格式最小值最大值零值表示DATETIME8bytesYYYY-MM-DDHH:MM:SS1000-01-0100:00:0......