INNODB存储引擎第二版读书笔记1
===================================================
1、INNODB 状态查看 : show engine innodb status\G;
2、IO THREAD INNODB中默认有4个READ IO THREAD和4个WRITE IO THREAD,还有1个LOG IO THREAD和1个插入缓存(INSERT BUFFER THREAD)
可以通过 innodb_read_io_threads 和 innodb_write_io_threads进行调整,这个要根据磁盘IO承载和数据库压力来调整。
3、可以为 undolog 处理的 Purge Threads 单独配置一个进程,,配置为 innodb_purge_threads 设置
4、可以通过innodb_page_cleaners配置增加INNODB 脏页FIX到磁盘的工作线程,让脏页刷新对查询减少阻塞(MYSQL 5.7)
5、关于缓冲池,缓冲池参数 innodb_buffer_pool_size 调整整个缓冲池的大小,这个参数需要根据机器配置来设置,一般为机器总内存的1/3,
6、innodb_buffer_pool_instances 来配置缓冲池切分为多个缓冲池
7、INNODB缓冲池是使用LRU算法来进行管理的,缓冲池中的页大小为16KB,INNODB中LRU算法有所修改,最新访问的数据会被移动到midpoint位置,通常在整个列表的5/8处,可以通过 innodb_old_blocks_pct进行控制,show variables like 'innodb_old_blocks_pct'\G 的单位为 百分比,标示距离列表尾端的百分比。
8、参数 innodb_old_blocks_time 设置了当数据在LRU中被访问时,需要过多久才把这个页从MID 位置放到LRU 热端。
9、show engine innodb status 命令中的 buffer pool hit rate 表示缓冲池命中率,这个值如果低于95%,则要注意是不是因为全表扫描导致LRU列表被污染问题。
10、可以通过 INNODB_BUFFER_POOL_STATUS 查看缓冲池状态
11、通过INNODB_BUFFER_PAGE_LRU查看 LRU列表的状态
12、重做日志 redo log 的缓冲池大小通过参数 innodb_log_buffer_size 设置,当MAST THREAD发现redo log 的缓冲池大小小于1/2的时候,就会将redo log buff 刷新到重做日志文件中
13、关于缓冲池中的脏页,INNODB 有一套checkpoint 机制来管理,http://hedengcheng.com/?p=88
14、master thread 对于将脏页刷新到磁盘,根据 innodb_max_dirty_pages_pct 这个参数来判断,这个值最佳为 75-80,如果脏页超过这个百分比,则刷新100个脏页。innodb 1.1 以后根据 innodb_adaptive_flushing 来更改是不是自适应刷新,buf_flush_get_desired_flush_rate来自动判断一次刷新多少个脏页合适。
15、非主键(聚族索引)和唯一索引,MYSQL会把辅助索引使用 insert buffer,insert buffer 默认最大只能占用 innodb_buffer_pool 1/2的大小,Innodb 1.1 以后增加了change buffer,分别是 insert buffer, delete buffer, purge buffer,可以通过 innodb_change_buffering 进行配置开启的类型,通过 innodb_change_buffer_max_size 控制change buffer 的大小。
16、Insert buffer 内部的实现为一颗B+TREE,INNODB 1.1以后整个数据库只有一颗INSERT BUFFER B+TREE
17、innodb 1.1 以后通过innodb_use_native_aio 参数开启对 Native AIO的支持
18、关于启动与恢复,innodb_fast_shutdown 参数来控制启动的时候MYSQL是否需要刷新脏页回磁盘,还有innodb_force_recovery参数判断是否启动的时候需要回滚日志。