- 插入缓冲
- 两次写
- 自适应哈希索引
- 异步IO
- 刷新邻接页
插入缓冲
innodb存储引擎对于非聚集索引的插入或更新操作,不是每一次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池,若在,则直接插入;不在,则先放在一个insert buffer对象中。数据库这个非聚集的索引已经插到叶子节点,而实际并没有,知识存放在另一个位置。然后再以一定的频率和情况进行insert buffer和辅助索引页子节点的merge操作,这样就把多次插入操作合并为一个。
insert buffer使用条件:
- 索引为辅助索引
- 索引不是唯一的
使用命令show engine innodb status查看插入缓冲信息
mysql>show engine innodb status\G;
......
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 33, seg size 35, 2118 merges
merged operations:
insert 2296, delete mark 0, delete 0
discarded operations:
insert 0, delete mark 0, delete 0
......
seg size显示当前insert buffer的大小为35*16KB;
free list len表示空闲列表的长度;
size代表已经合并记录页的数量
merges合并次数
merged operations和discarded operations显示change buffer中每个操作的次数
merged operations合并操作
merged operations insert插入的记录数
merged operations delete mark删除的记录数
merged operations delete清除记录数
discarded operations表示发生merge操作时,表已删除。
discarded operations insert表示取消的合并操作数
。。。
change buffer
innodb从1.0.x开始引入change buffer。innodb可以对DML操作都进行缓冲。
通过参数innodb_change_buffering开启各种buffer选项。可选值:inserts、deletes、purges、changes、all、none。changes表示启用inserts和deletes,all表示启用全部,none表示都不启用。默认all。
mysql> show variables like 'innodb_change_buffering';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| innodb_change_buffering | all |
+-------------------------+-------+
通过参数innodb_change_buffer_max_size控制change buffer最大内存使用数量。默认25,表示最多使用1/4的缓冲池内存空间。该参数最大有效值50.
mysql> show variables like 'innodb_change_buffer_max_size';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| innodb_change_buffer_max_size | 25 |
+-------------------------------+-------+