mysql inoodb merge_MySQL--InnoDB 关键特性

插入缓冲

Insert Buffer

对于非聚集索引的插入或更新操作,不是每一次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,若在,则直接插入;若不在,则先放入到一个 Insert Buffer 对象中。

Insert Buffer 的使用需要同时满足以下两个条件:

索引是辅助索引

索引不是唯一的

4bd79c0cdf0d3b4e9bfe59f58f75dbcf.png

size: The number of pages used within the change buffer. Change buffer size is equal to seg size - (1 + free list len). The 1 + value represents the change buffer header page.

free list len: The number of pages free within the change buffer.代表了空闲页的数量

seg size: The size of the change buffer, in pages. 插入缓冲的大小为241 *16KB

merges: The total number of change buffer merges.表示合并次数

Change Buffer

InnoDB 从 1.0.x 版本开始导入了 Change Buffer,可将其视为 Insert Buffer 的升级。从这个版本开始,InnoDB 存储引擎可以对 DML 操作都进行缓冲,他们分别是 Insert Buffer、Delete Buffer、Purge Buffer。

Change Buffer 使用的对象时非唯一的辅助索引。

对一条记录进行 UPDATE 操作可能分为两个过程:

将记录标记为已删除

真正的将记录删除

Delete Buffer 对应 UPDATE 操作的第一个过程,即将记录标记为删除。

Purge Buffer 对应 UPDATE 操作的第二个过程,即将记录真正的删除。

innodb_change_buffering // 开启 buffer 的选项 [inserts|deletes|purges|changes|all|none] 默认为 all。

innodb_change_buffer_max_size // 控制 Change Buffer 最大使用内存的数量,默认值是 25,最大有效值为 50(使用缓冲池内存空间百分比)

3b42a376ad92dceb696f2c95312382d4.png

merged operations - insert: The number of inserted records merged.merged插入的记录数

merged operations - delete mark: The number of deleted records merged.merged删除记录数

merged operations - delete: The number of purge records merged.merged清除记录数

discarded operations - insert: The number of insert merge operations discarded.

discarded operations - delete mark: The number of delete merge operations discarded.

discarded operations - delete: The number of purge merge operations discarded.

两次写

在应用重做日志前,用户需要一个页的副本,当写入失效发生时,先通过页的副本来还原该页,再进行重做,这就是 Double Write。

double write 由两部分组成,一部分是内存中的 double write buffer,大小为 2MB,另一部分是物理磁盘上共享表空间中连续的 128 个页,即 2 个区,大小同样为 2MB。在对缓冲池的脏页进行刷新时,并不直接写磁盘,而是会通过 memcpy 函数将脏页复制到内存中的 double write buffer,之后通过 double write buffer 再分两次,每次 1MB 顺序地写入表空间的物理磁盘上,然后马上调用 fsync 函数,同步磁盘,避免缓冲写带来的问题。

可以通过以下命令观察到 double write 运行的情况:

show global status like 'innodb_dblwr%';

1cbc164da3c46349731f47da5e78a8d3.png

如果发现系统在高峰时的 Innodb_dblwr_pages_written : Innodb_dblwr_writes 远小于 64 : 1,那么可以说明系统写入的压力并不是很高。

如果操作系统在将页写入磁盘的过程中发生了崩溃,在恢复过程中,InnoDB 存储引擎可以从共享表空间中的 double write 中找到该页的一个副本,将其复制到表空间文件,再应用重做日志。

show global status like 'innodb_buffer_pool_pages_flushed'; 当前从缓冲池中刷新到磁盘页的数量。该变量应该和 Innodb_dblwr_pages_written 一致。

自适应哈希索引

InnoDB 存储引擎会监控对表上各索引页的查询。如果观察到建立哈希索引可以带来速度提升,则建立哈希索引,称之为自适应哈希索引(Adaptive Hash Index,AHI)。AHI 是通过缓冲池的 B+ 树页构造而来,因此建立的速度很快,而且不需要对整张表构件哈希索引。InnoDB 存储引擎会自动根据访问的频率和模式来自动地为某些热点页建立哈希索引。

哈希索引是数据库自优化的,无需人为调整。

哈希索引只能用来进行搜索等值的查询。

d4fcd2d30fe840212c25d7ce7d27ed15.png

hash searches : non-hash searches 可以大概了解使用哈希索引后的效率。

AHI 默认为开启状态,用户可以通过 innodb_adaptive_hash_index 来禁用启用此特性。

异步 IO

为了提高磁盘操作性能,当前的数据库系统都采用异步 IO(Asynchronous IO,AIO)的方式来处理磁盘操作。InnoDB 存储引擎亦是如此。

AIO 可以进行 IO Merge 操作。

innodb_use_native_aio 控制是否启用 Native AIO。在 Linux 操作系统下默认为 ON。

在 InnoDB 存储引擎中,read ahead 方式的读取都是通过 AIO 完成,脏页的刷新,即磁盘的写入操作则全部由 AIO 完成。

刷新邻近页

当刷新一个脏页时,InnoDB 存储引擎会检测该页所在区的所有页,如果是脏页,那么一起刷新。这样做的好处显而易见,通过 AIO 可以将多个 IO 写入造作合并为一个 IO 操作,故该工作机制在传统磁盘下有着显著的优势。但是需要考虑到下面两个问题:

是不是可能将不怎么脏的页进行写入,而该页之后又很快变成脏页

固态硬盘有着较高的 IOPS,是否还需要这个特性

innodb_flush_neighbors 控制是否启用刷新邻近页特性。

对于传统机械硬盘建议启用该特性,而对于固态硬盘有着超高的 IOPS 性能的磁盘,则建议将该参数设置为 0,即关闭此特性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值