• MySQL--Insert Buffer



    在进行数据插入时,需要将数据插入到聚集索引和非聚集索引中,而对于非聚集索引,需要先确定数据要插入的索引页,再将索引页加载到内存中进行修改,而在业务上很难保证插入数据在非聚集索引上也是连续的,因此插入操作会引入大量随机IO操作。

    Innodb存储引擎引入Insert Buffer Pool特性来对插入操作进行优化,在INSERT操作是,对非唯一索引的更新没有实时更新,而是将更新操作进行缓存,在一定条件下再触发操作将更新操作应用到索引上。
    操作原理:
    插入数据时判断索引页是否存于内存中:
    1、索引页存在于内存中,直接更新索引页
    2、索引页不存在于内存中,且满足将更新操作放入Insert Buffer Pool操作条件,将更新操作信息和索引页信息放入到Insert Buffer Pool中。

    虽然"更新操作"可以被暂时缓存到Insert Buffer Pool中,但最终还是需要将"更新操作"应用到索引页上,即Merge操作,Merge操作根据触发方式分为两种:
    1、主动Merge,由Innodb主线程定期后台进行,采用异步IO进行操作读取索引页面,然后进行merge。
    A) 对于每秒执行一次主线程,如果过去1s之内发生的I/O小于系统I/O能力的5%,则触发一次Merge操作,merge的页面数为系统I/O能力的5%
    B) 对于每10秒执行一次得主线程,必定触发一次merge操作,merge的页面数为系统I/O能力的5%

    2、被动Merge,由用户操作触发:
    A) Insert操作导致目标索引页的空间不足,需要进行页拆分操作,Insert Buffer只能处理单个页面,不能缓存需要拆分的索引页。
    B) 当前Insert Buffer太大,需要强制进行merge操作。
    C) 由于特殊原因,将"更新操作"放入Insert Buffer时出错,需要将"更新操作"直接应用到索引页上。
    D) 用户操作需访问索引页,将索引页从磁盘中加载到内存,将Inser Buffer中缓存的"更新操作"进行merge。


    ##====================================================##
    Insert Buffer优点:
    1、在INSERT操作能快速返回,提高插入效率
    2、在进行Merge时,可以将多个连续的页面一次读取到内存中进行merge,减少随机IO带来的性能损耗,将随机IO转换为顺序IO

    ##====================================================##
    Insert Buffer的相关知识点
    1、Innodb存储引擎使用Insert Buffer Bitmap来跟踪每个非聚集索引页的使用情况,从而推断出是否会发生页拆分的情况。
    2、非聚集唯一索引无法使用Insert Buffer,因为需要在插入时需要读取索引页来确定插入数据是否唯一。
    3、在MySQL 5.5中,对Insert Buffer进行增强,引入Change Buffer特性,能对INSERT/DELETE/UPDATE操作的修改信息进行缓存。
    ##====================================================##

  • 相关阅读:
    2018.4.5课堂笔记
    黑白染色——封锁阳光大学
    末日游戏——杨辉三角+搜索
    dilworth定理+属性排序(木棍加工)
    伯努利错装信封问题
    zhx'code1
    字符串-----KMP竟然是18禁
    Presto Event Listener开发
    Presto安装完成之后需要做的
    Apache Calcite 论文学习笔记
  • 原文地址:https://www.cnblogs.com/TeyGao/p/9236193.html
Copyright © 2020-2023  润新知