Innodb学习

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时较合理;
原文地址:https://www.cnblogs.com/llaq/p/9467666.html