InnoDB储存引擎
2018-05-29 11:48:06 小德 MySQL 访问次数 519

一、InnoDB体系结构

  后台线程(*n):

            |           多线程模型负责处理不同任务:MasterThread :缓冲池数据异步刷新到磁盘,脏页刷新,合并插入缓冲,UNDO页回收;

            |           IO Thread :负责IO请求回调;

            |            Purge Thread:事物提交后undolog不需要了,用来回收undo页

            |            Page Cleaner Thread : 之前脏页的刷新单独线程完成,减轻Master Thread 用户查询进程的阻塞,提高InNoDB性能。

InnoDB存储引擎内存池

            |

            |

        文件(*n)


二、缓冲池

    由于CPU与磁盘速度的鸿沟,基于磁盘的数据库通常使用缓冲池来提高数据库性能,缓冲池大小直接影响到数据库的性能;

    缓冲池的数据页类型:索引页;数据页;undo页,插入缓冲 自适应哈希索引,InnoDB 锁信息、数据字典信息等;

    缓冲池管理算法:优化过的LRU(最近最少使用),新加入的数据不放在LRU的尾部而是mid位置,避免热点数据丢失;缓冲尺页大小16K

    脏页:LRU被修改了,缓冲池的页和磁盘的数据产生不一致,缓冲池数据比较新:checkPoint 机制将刷脏页至此盘.

    CheckPoint:事物提交时,先写重写日志,再修改页,避免数据丢失;Checkpoint的好处:缩短数据库恢复时间;缓冲池不够用时脏页刷新;重做日志不可用刷新脏页

    redo log buffer: 重做日志信息放入缓冲区,然后按一定频率刷至日志文件;触发场景:每个事物提交时;日志缓冲池剩余空间小于1/2;


三、Master THread

    日志缓冲总是刷新到磁盘,及时事务没有提交;合并插入缓冲;至多刷新100个InnoDB的缓冲池的脏页到磁盘(可能);

    如果当前用户没有活动,则切换到backgroup Loop (可能)


四、InnoDB关键特性

    插入缓冲:

            主键插入,顺序的,不需要磁盘随机读取,所以非常快;而非聚集索引,B+tree的特性决定了插入的离散性:先判断插入的非聚集索引页是否在缓冲池中,在,直接插入,若不在,则先放入一个Insert buffer ;然后在以一定频率进行Insert Buffer 和辅助索引叶子节点的merge ,将多个插入合并为一个操作,提高非聚集索引性能。

    两次写:           

             在缓冲池的脏页数据进行刷新时,不直接写入磁盘,而是通过memcpy函数将脏页先复制到内存中的doublewrite buffer,之后再分两次,每次1MB,顺序地写入共享表空间的物理磁盘

    自适应哈希:

            B+树的高度最多3-4层;根据特定的where 数据访问的频率自动地为特点数据建立哈希索引

    异步IO:

             用户可以在发送一个IO请求后继续发送,当所有IO全部发送完毕后,等待IO操作

    刷新邻接页:

            针对传统机械硬盘启用 该特性:刷新一个脏页时检查页所在区所有页,一起刷新;针对SSD可不启用


    

参考资料:

    《MySQL技术引擎内幕InnoDB存储引擎》 第二版 ---机械工业出版社