Innodb学习

mac2022-06-30  98

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 status\G   结果示例: ===================================== 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 status\G 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 status\G ----------------- 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

最新回复(0)