MySQL InnoDB的4个特性

insert buffer

Double write

adaptive hash index 自适应哈希索引

read-ahead

insert buffer

对于为非唯一索引,辅助索引的修改操作并非实时更新索引的叶子页,

而是把若干对同一页面的更新缓存起来做合并为一次性更新操作,

转化随机IO 为顺序IO,提高写性能。

Double write

提高可靠性,主要用来解决部分写失败(partial page write)

doublewrite有两部分组成,

一部分是内存中的doublewrite buffer,大小为2M,

另外一部分就是物理磁盘上的共享表空间中连续的128个页,即两个区,大小同样为2M。

当缓冲池的作业刷新时,并不直接写硬盘,而是通过memcpy函数将脏页先拷贝到内存中的doublewrite buffer,

之后通过doublewrite buffer再分两次写,每次写入1M到共享表空间的物理磁盘上,然后马上调用fsync函数,同步磁盘。

查看doublewrite的使用 情况

show global status like ‘innodb_dblwr%’

slave上可以通过设置skip_innodb_doublewrite参数关闭两次写功能来提高性能

master上一定要开启此功能,保证数据安全

自适应哈希索引

监控表上索引的查找,如果观察到建立哈希索引可以提升速度,则建立哈希索引,所以称之为自适应(adaptive)的。

通过缓冲池的B+树构造而来,因此建立的速度很快。需要将整个表都建哈希索引,自动根据访问的频率

限制

1.只能用于等值比较,例如=, <=>,in

2.无法用于排序

3.有冲突可能

4.自动管理,无法人为干预。

预读 read-ahead

提供两种预读的方式,

一种是 Linear read ahead,由参数innodb_read_ahead_threshold控制,

当连续读取一个 extent 的 threshold 个 page 的时候,会触发下一个 extent 64个page的预读。

另外一种是Random read-ahead,由参数innodb_random_read_ahead控制,当连续读取设定的数量的page后,会触发读取这个extent的剩余page。

预读由后台线程异步完成的。启动innodb_read_io_threads个后台线程,


分享到:


相關文章: