zoukankan      html  css  js  c++  java
  • MySQL

    InnoDB体系架构

    后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。此外将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下InnoDB能恢复到正常运行状态。

    后台线程

    1. Master Thread

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

    2. IO Thread

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

    IO Thread分类:

    write io thread
    
    read io thread
    
    insert buffer io thread
    
    log io thread
    

    InnoDB 1.0版本之前共有4个IO Thread,分别是:writereadinsert bufferlog IO thread
    在Linux平台下,IO Thread的数量不能进行调整,但是在Windows平台下可以通过参数innodb_file_io_threads来增大IO Thread。

    从InnoDB 1.0.x版本开始,read threadwrite thread分别增大到了4个,并且不再使用innodb_file_io_threads参数,而是分别使用innodb_read_io_threadsinnodb_write_io_threads参数进行设置,如:

    Mysql语句

    # 查看read io和write io线程数量
    mysql> show variables like '%io_thread%';
    +-------------------------+-------+
    | Variable_name           | Value |
    +-------------------------+-------+
    | innodb_read_io_threads  | 4     |
    | innodb_write_io_threads | 4     |
    +-------------------------+-------+
    
    # 查看Innodb状态信息
    mysql> show engine innodb statusG;
    

    3. Purge Thread 后台清理

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

    2. InnoDB中delete所做删除只是标记为删除的状态,实际上并没有删除掉,因为MVCC机制的存在,要保留之前的版本为并发所使用。最终的删除由purge线程来决定的什么时候来真正删除文件的。

    调整线程数

    mysqld --innodb-purge-threads=#

    ps:Purge Thread默认每次清理大小为:300个page,可通过参数innodb_purge_batch_size调整。

    MySQL5.7启动参数说明地址

    4. Page Cleaner Thread

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

    mysql> show variables like '%cleaner%';
    +----------------------+-------+
    | Variable_name        | Value |
    +----------------------+-------+
    | innodb_page_cleaners | 1     |
    +----------------------+-------+
    
    # 查看缓冲池等待数据,如果数据过大则需要调整innodb_page_cleaners参数
    mysql> show status like '%wait_free';
    +------------------------------+-------+
    | Variable_name                | Value |
    +------------------------------+-------+
    | Innodb_buffer_pool_wait_free | 0     |
    +------------------------------+-------+
    

  • 相关阅读:
    use paramiko to connect remote server and execute command
    protect golang source code
    adjust jedi vim to python2 and python3
    install vim plugin local file offline
    add swap file if you only have 1G RAM
    datatables hyperlink in td
    django rest framework custom json format
    【JAVA基础】网络编程
    【JAVA基础】多线程
    【JAVA基础】String类的概述和使用
  • 原文地址:https://www.cnblogs.com/zhanghuizong/p/12626520.html
Copyright © 2011-2022 走看看