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

MySQL--Insert Buffer的更多相关文章

  1. 【mysql】Innodb三大特性之insert buffer

    一.什么是insert buffer insert buffer是一种特殊的数据结构(B+ tree)并不是缓存的一部分,而是物理页,当受影响的索引页不在buffer pool时缓存 secondar ...

  2. 全网最清楚的:MySQL的insert buffer和change buffer 串讲

    目录 一.前言 二.问题引入 2.1.聚簇索引 2.2.普通索引 三.change buffer存在的意义 四.再看change buffer 五.change buffer 的限制 六.change ...

  3. innodb insert buffer 插入缓冲区的理解

    今天在做一个大业务的数据删除时,看到下面的性能曲线图 在删除动作开始之后,insert buffer 大小增加到140.对于这些状态参数的说明 InnoDB Insert Buffer 插入缓冲,并不 ...

  4. InnoDB关键特性之insert buffer

    insert buffer 是InnoDB存储引擎所独有的功能.通过insert buffer,InnoDB存储引擎可以大幅度提高数据库中非唯一辅助索引的插入性能. 数据库对于自增主键值的插入是顺序的 ...

  5. innodb 关键特性(insert buffer)

    一.insert buffer 性能改善 insert buffer和数据页一样,也是物理页的一个组成部分. 在innodb存储引擎中,主键是行唯一的标识符.通常应用程序中行记录的插入顺序是按照主键递 ...

  6. MySQL Index--Change Buffer

    Change Buffer功能 当执行INSERT/DELETE/UPDATE三类DML操作需要修改二级索引上数据时,如果需要修改的二级索引页未存在于当前Buffer Pool中,可以先将该" ...

  7. MySql 缓冲池(buffer pool) 和 写缓存(change buffer) 转

    应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存(cache)里,避免每次都去访问数据库. 操作系统,会有缓冲池(buffer pool)机制,避免每次访问磁盘,以加速数据的访问. M ...

  8. InnoDB Insert Buffer(插入缓冲 转)

    一,插入缓冲(Insert Buffer/Change Buffer):提升插入性能 只对于非聚集索引(非唯一)的插入和更新有效,对于每一次的插入不是写到索引页中,而是先判断插入的非聚集索引页是否在缓 ...

  9. 使用 xlrd 模块实现对excel 的读取、excel转json 、excel 转 mysql insert 语句

    #-*- coding:utf-8 -*- # 处理 excel 中的 area 为 Mysql insert 语句 import xlrd, json, codecs, os # data = xl ...

  10. (转载)如何优化MySQL insert性能

    (转载)http://blog.csdn.net/tigernorth/article/details/8094277 对于一些数据量较大的系统,面临的问题除了是查询效率低下,还有一个很重要的问题就是 ...

随机推荐

  1. Python学习笔记1环境搭建

    1.在浏览器输入https://www.python.org/psf/,点击download下载python3.7.2(https://www.python.org/)   https://www.p ...

  2. css样式之input输入框默认样式

    帮朋友写个简单的课程设计,后面会贴出来,项目刚开始就遇到一个坑(给input输入框设定样式,但是,点击后会出现蓝色边框),之前写其他的项目时也遇到过,百度一下资料解决了,现在又碰到了,写一下,留着备用 ...

  3. python 修改的函数装饰器

    把好的代码记录下来 方便以后学习 修改的函数参数装饰器 from functools import wraps import time import logging def warn(timeout) ...

  4. Vue 获取元素样式 元素高度

    看到这个问题我第一时间想的竟然是JS 不知道你是怎么想的 不过昨天有一个小哥哥 问我一个Vue的 哈哈哈 get了 我当时问他为什么不用JS获取 他说 这个性能更高 那我们来看看这个高性能的获取元素高 ...

  5. 记录在Ubuntu 18.04系统中安装Apache, MySQL和PHP环境

    虽然我们在Linux VPS.服务器安装WEB环境比较方便,可以选择面板或者一键包,但是有些我们需要深入学习的网友不会选择一键安装,而是会尝试编译安装.这样可以学到一些内在的技术.一般我们较为习惯选择 ...

  6. windows下SVN服务器搭建--VisualSVN与TortoiseSVN的配置安装

    在讲解之前,我们来思考两个问题: 1.什么是版本控制 2.为什么要用版本控制工具 ----------------------------------------------------- 版本控制工 ...

  7. form表单上传图片文件

    import os def upload(request): if request.method == 'GET': img_list = models.Img.objects.all() retur ...

  8. 如何判断Linux是32位还是64位

    getconf LONG_BIT

  9. SHELL脚本学习-练习写一个脚本3

    #通过ping命令测试192.168.1段的所有主机是否在线,如果在线就显示is up并显示蓝色,如果不在线就显示is down. #!/bin/bash #Program Description: ...

  10. ConcurrentDictionary

    ConcurrentDictionary ConcurrentDictionary一大特点是线程安全,在没有ConcurrentDictionary前 在多线程下用Dictionary,不管读写都要加 ...