(转载)innodb关键特性

innodb关键特性

插入缓冲(insert buffer)
两次写(Double write)
自适应哈希索引(adaptive hash index)
异步io(Async IO)
刷新领接页(Flush Neighbor Page)

1.插入缓冲

使用场景,即非唯一辅助索引的插入操作,因为不是顺序的,所以将这些插入操作,
存到插入缓冲中去,然后一段时间统一插入到真的索引中去,此时很有可能有几条 插入合并操作,
因为他们是对同一索引页进行的操作,这样就大大提高了效率。
关键就是将一些 离散的操作,缓存起来,然后找到一些对同一个索引页 进行 操作的 操作项 进行合并,这样提高了 效率。

2.两次写
提高了 数据页的可靠性。

在应用(apply)重做日志前,用户需要一个页的副本,当写入失效发生时,先通过页的副本来还原该页,再进行重做,这就是duble write 。
在这里插入图片描述

dublewrite组成
内存中的dublewrite buffer,大小2M,
物理磁盘上共享表空间中连续的128个页,即2个区(extend),大小同样为2M。
对缓冲池的脏页进行刷新时,不是直接写磁盘,而是会通过memcpy()函数将脏页先复制到内存中的doublewrite buffer,
之后通过doublewrite 再分两次,每次1M顺序地写入共享表空间的物理磁盘上,在这个过程中,因为doublewrite页是连续的,
因此这个过程是顺序写的,开销并不是很大。在完成doublewrite页的写入后,再将doublewrite buffer 中的页写入各个 表空间文件中,
此时的写入则是离散的。如果操作系统在将页写入磁盘的过程中发生了崩溃,在恢复过程中,innodb可以从共享表空间中的doublewrite
中找到该页的一个副本,将其复制到表空间文件,再应用重做日志。

3.自适应哈希索引
哈希(hash)是一种非常快的查找方法,在一般情况下这种查找的时间复杂度为O(1),即一般仅需要一次查找就能定位数据。
而B+树的查找次数,取决于B+树的高度,在生成环境中,B+树的高度一般3-4层,故需要3-4次的查询。

innodb会监控对表上个索引页的查询。如果观察到建立哈希索引可以带来速度提升,则建立哈希索引,称之为自适应哈希索引(Adaptive Hash Index,AHI)。

AHI有一个要求,就是对这个页的连续访问模式必须是一样的。
例如对于(a,b)访问模式情况:
where a = xxx
where a = xxx and b = xxx

访问模式一样指的是查询的条件一样,若交替进行上述两种查询,那么innodb不会对该页构造AHI,此外AHI还有如下的要求:
以该模式访问了100次
页通过该模式访问了N次,其中N=页中记录*1/16;

AHI启动后,读写速度提高了2倍,辅助索引的连接操作性能可以提高5倍。
AHI,是数据库自动优化的,DBA只需要指导开发人员去尽量使用符合AHI条件的查询,以提高效率。

4.异步IO

sync IO :同步IO 即每进行一次IO操作,此次操作结束才能继续接下来的操作。
但是如果用户发需要等待出一条索引扫描的查询,那么这条SQL查询语句可能需要扫描多个索引页,
也就是需要进行多次的IO操作。在每扫描一个页并等待期完成再进行下一次的扫描是没有必要的。

异步IO:
用户可以在发出一个IO请求后立即再发出另一个IO请求,当全部IO请求发送完毕后,等待所有IO操作的完成,这就是AIO。

AIO另一个优势可以将多个IO,合并为1个IO,以提高IO效率。例如:
用户需要访问3页内容,但这3页时连续的。同步IO需要进行3次IO,而AIO只需要一次 就可以了。

使用AIO的恢复速度 提高了75%

5.刷新领接页
工作原理:
当刷新一个脏页时,innodb会检测该页所在区(extent)的所有页,如果是脏页,那么一起进行刷新。
这样做,通过AIO将多个IO写入操作合并为一个IO操作。在传统机械磁盘下有着显著优势。
innodb_flush_neighbors 参数来控制是否开启。

转载参考自 https://www.cnblogs.com/Aiapple/p/5689634.html

猜你喜欢

转载自blog.csdn.net/weixin_39195030/article/details/88361504