InnoDB关键特性-插入缓存,两次写,自适应hash索引,异步IO

1、插入缓存

作用:提高非聚集索引插入的性能

对于非聚集索引叶子节点的插入若不是顺序的,就需要离散地访问非聚集索引页,随机读取的存在会导致插入操作性能下降。

然而有了Insert Buffer后,对非聚集索引的插入或更新操作,不是每次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓存池中,若在,则直接插入,若不在,则先放在到一个Insert Buffer对象中。再以一定频率和情况进行Insert Buffer和辅助索引页子节点的merge操作,这就将多个插入合并到一个操作,大大提高了非聚集索引插入的性能

当下面几种情况Insert Buffer会merge到真正的辅助索引:

  1. 辅助索引页被读取到缓冲池时
  2. Insert Buffer Bitmap 页追踪到该辅助索引页已无可用空间时
  3. Master Thread

Insert Buffer Bitmap 页用来追踪每个辅助索引页的可用空间,Master Thread线程中每秒或每10秒会进行一次Merge Insert Buffer操作,不同的是merge的页的数量不同。

2、两次写

作用:提高数据页的可靠性,用来解决部分写失败

当正在写入某页到表,写到一半时,数据库发生了宕机,这就会导致数据丢失的情况。这时是因为重做日志记录的是对页的物理修改,如果页本身已经损坏,无法通过重做日志恢复的。
InnoDB关键特性-插入缓存,两次写,自适应hash索引,异步IO

doublewrite由两部分组成,一部分为内存中的doublewrite buffer,其大小为2MB,另一部分是磁盘上共享表空间(ibdata x)中连续的128个页,即2个区(extent),大小也是2M。

  1. 当一系列机制触发数据缓冲池中的脏页刷新时,并不直接写入磁盘数据文件中,而是先拷贝至内存中的doublewrite buffer中;
  2. 接着从两次写缓冲区分两次写入磁盘共享表空间中,每次写1MB;
  3. 待第二步完成后,再将doublewrite buffer中的脏页数据写入实际的各个表空间文件(离散写);

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

3、自适应哈希索引

作用: 提高等值查询速度

Innodb存储引擎会监控对表上二级索引的查找,如果发现某二级索引被频繁访问,二级索引成为热数据,通过建立哈希索引可以带来速度的提升。

经常访问的二级索引数据会自动被生成到hash索引里面去(最近连续被访问三次的数据),自适应哈希索引通过缓冲池的B+树构造而来,因此建立的速度很快。

特点:

  1. 无序,没有树高
  2. 降低对二级索引树的频繁访问资源
    (索引树高<=4,访问索引:访问树、根节点、叶子节点)
  3. 自适应

缺陷:
4. hash自适应索引会占用innodb buffer pool;
5. 自适应hash索引只适合搜索等值的查询,如select * from table where index_col=‘xxx’,而对于其他查找类型,如范围查找,是不能使用的;
6. 极端情况下,自适应hash索引才有比较大的意义,可以降低逻辑读。

4、异步IO

作用:提高磁盘操作性能

异步IO两个优势:

  1. 用户可以在发出一个IO请求不需要等待完成可立即再发另一个IO请求,当全部IO请求发送完毕后,等待所有IO操作的完成
  2. 可以将多个IO合并成一个IO,提高IOPS的性能

在InnoDB存储引擎,脏页的刷新即磁盘的写入操作则全部AIO完成。