一 简介:针对查询和事务的页在内存中的处理,是如何进行的
二 LRU算法
普通 : 实现的是末尾淘汰法,当整个链表已满时,淘汰尾部,将新的数据页加入头部
mysql_lru改进 : 分为两部分 1分为 yang和old,并不从LRU列表头部进行插入,而是从中间部位.对过期页实行末尾淘汰没有问题,
2 针对新插入的数据页需要做二次判断
1 如果数据页保持1S以上时间,则推进到yang头部
2 如果数据页不能保持1S,则依然保留到old区,等待被淘汰
改进优点:防止一次性的大查询读取的数据页污染整个LRU列表,影响整体的事务命中率
三 相关参数
1 innodb_old_blocks_time 控制着判断数据页保持时间,是加入yang还是保留在old区,默认1s,防止单次大量的全表扫描污染整个LRU
2 innodb_max_dirty_pages_pct 控制着页插入的位置,默认为50%, yang和old区的百分比
四 计算公式
innodb buffer pool命中率1 Innodb_buffer_pool_read_requests表示read请求的次数
2 Innodb_buffer_pool_reads表示从物理磁盘中读取数据的请求次数 innodb buffer的read命中率就可以这样得到:(Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100%。一般来讲这个命中率不会低于99%,如果低于这个值的话就要考虑加大innodb buffer pool。通过 innodb_buffer_pool_stats 可以直接查看命中率,并不需要计算
五 相关补充
Free List 数据库刚启动的时候,LRU 列表为空,此时需要用到的时候直接将Free列表中的页删除,在LRU列表中增加相应的页,维持页数守恒。
Flush List 当LRU列表中的页被修改后,称该页为脏页(dirty page),即缓冲池中的页和磁盘上的页数据产生了不一致。这时候数据库会通过checkpoint机制将脏页刷新回磁盘,而Flush 列表中的页即为脏页列表。注意脏页也存在于LRU列表中。
INNODB_BUFFER_POOL 构成 1 数据页 2 索引页 3 字典 4 锁信息 5 AHI 6 插入缓冲
六 相关监控
命令 show engine innodb status
相关参数
1 BUFFE POOL SIZE 整个innodb_buffer_pool 页的总数大小 计算总量X16K即可
2 Free buffers 当前Free列表中页的数量
3 Datebase pages LRU列表中数据页的个数
这里注意 通常 Datebase pages+Free buffers 并不等于 整个buffer_pool页的数量。因为还有其他需要页 (数据字典,锁)等,这部分是不归LRU列表进行维护的
4 Modified db pages 脏页的大小