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.两次写