innodb 关键特性

  • 插入缓冲
  • 两次写
  • 自适应哈希索引
  • 异步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    |
+-------------------------------+-------+

你可能感兴趣的:(mysql)