INNODB整体学习
1 内存结构
组成部分:
缓冲池 buffer pool, 由innodb_buffer_pool_size配置
重做日志缓冲池 redo log buffer, 由innodb_log_buffer_size配置
额外内存池 additional memory pool, 由innodb_additional_mem_pool_size配置
1.1 buffer pool
是占最大块内存的部分,用来存放各种数据的缓存;
innodb将数据库文件按页(16K)读取到缓冲池,然后按最少使用(LRU)算法来保留缓存数据;数据文件修改时,先修改缓存池中的页(即脏页),然后按一定频率将脏页刷新到文件;
缓冲池中的数据页类型有:
索引页、数据页、undo页、插入缓冲(insert buffer)、自适应哈希索引(adaptive hash index)、锁信息(lock info)、数据字典信息(data dictionary)
查看buffer pool的使用情况
show engine innodb statusG
结果示例:
=====================================
120610 18:31:49 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 44 seconds
...
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 53657600; in additional pool allocated 0
Dictionary memory allocated 39802
Buffer pool size 3200
Free buffers 2790
Database pages 409
Old database pages 0
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 409, created 0, written 4
0.09 reads/s, 0.00 creates/s, 0.09 writes/s
Buffer pool hit rate 998 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s
LRU len: 409, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
...
分析
(1)Per second averages calculated from the last 44 seconds
show engine innodb status 显示的过去某个时间段内的使用情况
(2)Total memory allocated 53657600; in additional pool allocated 0
当前分配的memory大小和additional pool大小,单位byte
(3)接下来的pool中各项占的大小
Dictionary memory allocated 39802 数据字典内存区大小,单位byte
Buffer pool size 3200 总页数, 3200*16/1024=50M
Free buffers 2790 空闲的页数, 2790*16/1024=43M
Database pages 409 已使用的缓冲页数, 409*16/1024=6.3M
Old database pages 0
Modified db pages 0 表示脏页数
1.2 log buffer
作用
将重做日志先放入这个区,然后按一定频率将其刷新至重做日志文件,一般情况下每1秒就会刷新一次;
配置
一般不需配置很大;
1.3 额外内存池
作用:
innodb申请缓冲池(buffer pool),但每个缓冲池中的页缓冲有对应的缓冲控制对象(buffer control block),这些对象记录LRU、锁、等待等信息,这些对象的内存需要多额外内存池中申请;因此当buffer pool较大时,也需相应增大该值
====================================
2 innodb的后台线程
默认情况下,innodb有以下几类线程:
io thread,分为read thread和write thread;
master thread,1个
lock monit thread,1个
error monit thread,1个
3 io thread
包括以下几种:
read thread
write thread
insert buffer thread
log thread
配置设置:
read thread和write thread分别由innodb_read_io_threads和innodb_write_io_threads来配置;
log thread和insert buffer thread一般是1个;
查看
show variables like '%threads%';
show engine innodb statusG
4 master thread
完成的工作
主循环 loop
后台循环 background loop
刷新循环 flush loop
暂停循环 suspend loop
4.1 主循环 loop
该循环中完成的有两种操作,每秒一次的操作和每10秒一次的操作
每秒一次的操作:
a)日志缓冲刷新到磁盘,即使这个事务未提交(总是);
b)合并插入缓冲(可能),会根据前一秒内的io次数判断,如果小于5次,可以执行合并插入缓冲;
c)至多刷新100个脏页至磁盘(可能),通过判断脏页比例是否超过了innodb_max_dirty_pages_pct这个设置值来进行,未超过则不执行;
d)无用户活动,切换到background loop(可能);
每10秒一次的操作:
a)刷新100个脏页到磁盘(可能),如果过去10秒磁盘io操作小于200次,则执行本操作;
b)合并至多5个插入缓冲(总是);
c)日志缓冲刷新到磁盘(总是);
d)删除无用的undo页(总是);
e)刷新100个或10个脏页到磁盘(总是),判断缓冲池脏页比例,超过70%则刷新100个脏页,比例小于10%则刷新10个脏页;
f)产生一个检查点checkpoint(总是),注意此时并不是把所有脏页都刷新到了磁盘,只是将最老日志序列号的页写入磁盘;
4.2 后台循环 background loop
当没有用户活动或数据库关闭时,会切换到这个循环;
完成的操作
a)删除无用的undo页(总是);
b)合并20个插入缓冲(总是);
c)跳回到主循环(总是);
d)不断刷新100个页,直到符合条件(可能,跳转到flush loop中完成);
4.3 flush loop
由background loop跳转到此loop中完成刷新脏页的工作;
当flush loop中无事可做时会切换到suspend loop;
4.4 suspend loop
该loop将master thread挂起,等待事件发生;在启用了innodb引擎,但未使用innodb表时,master thread总是处于挂起状态;
4.5 查看示例
show engine innodb statusG
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 4 1_second, 4 sleeps, 0 10_second, 6 background, 6 flush
srv_master_thread log flush and writes: 4
说明
(1)主循环,每秒一次的操作有4次,每10秒一次的操作有0次;一般这两个比例在1:10时较合理;