• innodb存储线程和缓冲池详解


    1.后台线程

    innodb存储引擎后台有10个进程,分别是:

    I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
    I/O thread 1 state: waiting for completed aio requests (log thread)
    I/O thread 2 state: waiting for completed aio requests (read thread)
    I/O thread 3 state: waiting for completed aio requests (read thread)
    I/O thread 4 state: waiting for completed aio requests (read thread)
    I/O thread 5 state: waiting for completed aio requests (read thread)
    I/O thread 6 state: waiting for completed aio requests (write thread)
    I/O thread 7 state: waiting for completed aio requests (write thread)
    I/O thread 8 state: waiting for completed aio requests (write thread)
    I/O thread 9 state: waiting for completed aio requests (write thread)

    一个insert buffer thread,一个log thread,4个read thread,4个write thread

    2.内存缓冲池

      innodb内存主要由以下几个部分组成:缓冲池、重做日志缓冲池、额外的内存池。分别由innodb_buffer_pool_size和innodb_log_buffer_size大小决定。通过show engine innodb status命令可以查看当前缓冲池的使用情况:

    Total memory allocated 137363456; in additional pool allocated 0
    Dictionary memory allocated 33650
    Buffer pool size 8192
    Free buffers 8010
    Database pages 182

      innodb缓冲池单位是页,相当于oracle中的块,每页大小为16k。

      日志缓冲池:将重做日志信息先放入到这个缓冲区中,然后会按照一定频率将缓冲区内容刷新到日志文件中,由于一般一秒钟刷新一次,所以该值不需要设置太大,能够承担一秒钟的事物量即可。

    3.innodb定时的操作:

    每1秒的操作:

      日志缓冲刷新到磁盘,即使这个事物还没有提交(总是)

      合并插入缓冲(可能)

      至多刷新100个InnoDB的缓冲池中的脏页到磁盘(可能)

      如果当前没有用户活动,切换到background loop(可能)

    每10秒的操作:

      刷新100个InnoDB的缓冲池中的脏页到磁盘(可能)

      合并最多5个插入缓冲(总是)

      日志缓冲刷新到磁盘(总是)

      删除无用的Undo页(总是)

      刷新100个或10个脏页到磁盘(总是)

      产生一个检查点(总是)

    background loop循环:

      删除无用的Undo页(总是)

      合并20个插入缓冲(总是)

      跳回主循环(总是)

      不断刷新100个页,直到符合条件(可能)

    4.插入缓冲

      插入缓冲的名字会让大家误以为是缓冲池的一部分,其实不然,innodb缓冲池有insert buffer信息确实没错,但是insert buffer和数据页一样,也是物里页的一个组成部分。

      我么知道,主键是行唯一的标识符,在应用程序中行记录的插入顺序是按照主键递增的顺序进行插入的。因此,插入聚集索引一般是顺序的,不需要磁盘的随机读取,比如我们按照下面的sql语句定义表结构:

    create table t(id int auto_increment,name varchar(30),primary key(id));

      id列是自增长的,这就意味着当执行插入操作时,id列会自动增长,页中行记录按id执行顺序存放,一般情况下

      

    5.两次写

      

    你将来想成为什么样子,就一定会成为什么样子,只要你努力坚持的去做!!!
  • 相关阅读:
    Java Web 网络留言板2 JDBC数据源 (连接池技术)
    Java Web 网络留言板3 CommonsDbUtils
    Java Web ConnectionPool (连接池技术)
    Java Web 网络留言板
    Java Web JDBC数据源
    Java Web CommonsUtils (数据库连接方法)
    Servlet 起源
    Hibernate EntityManager
    Hibernate Annotation (Hibernate 注解)
    wpf控件设计时支持(1)
  • 原文地址:https://www.cnblogs.com/kucha/p/4863812.html
Copyright © 2020-2023  润新知