返回顶部
首页 > 资讯 > 数据库 >怎么理解MySQL的Insert buffer
  • 195
分享到

怎么理解MySQL的Insert buffer

2024-04-02 19:04:59 195人浏览 泡泡鱼
摘要

本篇内容介绍了“怎么理解Mysql的Insert buffer”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成

本篇内容介绍了“怎么理解Mysql的Insert buffer”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

 我们知道在进行插入操作时,数据页的存放还是按主键id的执行顺序存放, 但是对于非聚集索引,叶子节点的插入不再是顺序的了。
例如,对于如下表结构进行insert操作
create table tab ( 
  id int auto_increment, 
  name varchar(30),
  primary key (id),
  key(name)
 ) engine=innodb  default charset=utf8;
nanme 为非唯一字段,这时就需要离散地访问非聚集索引页,插入性能在这里变低了。然而这并不是这个name字段上索引的错误,因为B+树的特性决定了非聚集索引插入的离散性。
为了解决非聚族索引的随机写性能差,InnoDB 存储引擎开发了 innsert-buffer pool (5.5 中做了加强,称之为 change buffer pool)

一 什么是 innsert-buffer pool
innodb使用insert buffer"欺骗"数据库:对于为非唯一索引,辅助索引的修改操作并非实时更新索引的叶子页,而是把若干对同一页面的更新缓存起来做合并为一次性更新操作,转化随机io 为顺序IO,这样可以避免随机IO带来性能损耗,提高数据库的写性能。
1.1 原理:
   a 先判断要更新的这一页在不在内存中。
   b 如果不在,则读取index page 存入Insert Buffer,按照Master Thread的调度规则来合并非唯一索引和索引页中的叶子结点.

1.2 Master Thread的调度规则
  a 主动merger[innodb主线程定期完成,用户线程无感知]
    主动merger:
    原理:主动merge通过innodb主线程(svr_master_thread)判断:若过去1s之内发生的I/O小于系统I/O能力的5%,
        则主动进行一次insert buffer的meger操作。meger的页面数为系统I/O能力的5%,读取采用async io模式。
        每10s,必定触发一次insert buffer meger操作。meger的页面数仍旧为系统 I/O能力的5%。
    步骤:
        1.主线程发出async io请求,async读取需要被meger的索引页面
        2.I/O handler 线程,在接受到完成的async I/O之后,进行merger
  b 被动merge[用户线程完成,用户能感受到meger操作带来的性能影响]
    被动merge:
      情况一:
      insert操作,导致页面空间不足,需要分裂(split)。由于insert buffer只针对单个页面,不能buffer page split[页已经在内存里],因此引起页面的被动meger。同理,update操作导致页面空间不 足;purge导致页面为空等。总之:若 当前操作引起页面split or merge,那么就会导致被动merge。
      情况二:
      insert操作,由于其它各种原因,insert buffer优化返回false,需要真正读取page时,要进行被动merge。与一不同的是,页在disk上,需要读取到内存里。
      情况三:
      在进行insert buffer操作,发现insert buffer太大,需要压缩insert buffer,这时需要强制被动merge,不允许 insert 操作进行。

二 为什么要求是非唯一索引呢?
因为
  1 主键是行唯一的标示符,当app 写入行时,是按照主键递增的顺序进行插入的,异常插入聚族索引一般也顺序的,不需要随机IO。
  2 写唯一索引要检查记录是不是存在,所以在修改唯一索引之前,必须把修改的记录相关的索引页读出来才知道是不是唯一,这样Insert buffer就没意义了,反正要读出来(读带来随机IO),所以只对非唯一索引有效。

三 如何查看insert buffer  
我们可以通过show engine innodb status \G 来查看插入缓冲的信息
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 2920 merges
merged operations:
 insert 23858, delete mark 0, delete 0
discarded operations:
 insert 0, delete mark 0, delete 0

seg size显示了当前插入缓冲的大小为2 *16KB,大约为32KB,free list len代表了空闲列表的长度,size代表了已经合并记录页的数量。merges 表示合并次数。
merged operations:
Inserts代表插入的记录数,delete mark delete 次数均为0.

四 insert buffer 增强之 change buffering
    change buffering 是mysql5.5加入的新特性,change buffering是insert buffer的加强,insert buffer只针对insert有效,change buffering对insert、delete、update(delete+insert)、purge都有效。当修改一个索引块(secondary index)时的数据时,索引块在buffter pool中不存在,修改信息就会被cache在change buffer中,当通过索引扫描把需要的索引块读取到buffer pool时,会和change buffer中修改信息合并,再择机写回disk。目的还是为了减少随机IO带来性能损耗,说明白了:把随机IO尽量变成顺序IO。

“怎么理解Mysql的Insert buffer”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

您可能感兴趣的文档:

--结束END--

本文标题: 怎么理解MySQL的Insert buffer

本文链接: https://lsjlt.com/news/66752.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么理解MySQL的Insert buffer
    本篇内容介绍了“怎么理解MySQL的Insert buffer”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2024-04-02
  • 怎么理解MySQL change buffer
    本篇内容介绍了“怎么理解MySQL change buffer”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2024-04-02
  • 怎么理解Oracle Buffer
    这篇文章主要介绍“怎么理解Oracle Buffer”,在日常操作中,相信很多人在怎么理解Oracle Buffer问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解Or...
    99+
    2024-04-02
  • 如何理解MySQL的Buffer Pool
    本篇内容介绍了“如何理解MySQL的Buffer Pool”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前...
    99+
    2024-04-02
  • 怎么理解Oracle中的buffer cache
    本篇内容主要讲解“怎么理解Oracle中的buffer cache”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解Oracle中的buffer cache...
    99+
    2024-04-02
  • 怎么理解Linux的Cache和Buffer
    本篇文章给大家分享的是有关怎么理解Linux的Cache和Buffer,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先说明,本文讨论的cache指的是Linux中的page ...
    99+
    2023-06-16
  • MySQL的join buffer原理
    一、MySQL的join buffer 在MySQL对于join操作的处理过程中,join buffer是一个重要的概念,也是MySQL对于table join的一个重要的优化手段。虽然这个概念实现并不复杂,但是这...
    99+
    2022-05-19
    MySQL join buffer
  • 怎么理解Node.js中的Buffer模块
    这篇文章主要讲解了“怎么理解Node.js中的Buffer模块”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Node.js中的Buffer模块”吧!...
    99+
    2024-04-02
  • mysql的Buffer Pool存储及原理解析
    目录一、前言1、buffer pool是什么2、buffer pool的工作流程3、buffer pool缓冲池和查询缓存(query cache)二、buffer pool的内存数...
    99+
    2024-04-02
  • MySQL insert会阻塞update怎么解决
    这篇文章主要介绍“MySQL insert会阻塞update怎么解决”,在日常操作中,相信很多人在MySQL insert会阻塞update怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,...
    99+
    2023-07-05
  • MySQL Buffer pool里的change buffer是什么
    小编给大家分享一下MySQL Buffer pool里的change buffer是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一...
    99+
    2024-04-02
  • 怎么解决php insert mysql乱码问题
    本篇内容介绍了“怎么解决php insert mysql乱码问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php insert mysq...
    99+
    2023-06-22
  • 怎么理解DB BUFFER LRU列表的latch等待
    这篇文章主要介绍“怎么理解DB BUFFER LRU列表的latch等待”,在日常操作中,相信很多人在怎么理解DB BUFFER LRU列表的latch等待问题上存在疑惑,小编查阅了各式资料,整理出简单好用...
    99+
    2024-04-02
  • 怎么理解Linux内存管理中Buffer和Cache
    本篇内容介绍了“怎么理解Linux内存管理中Buffer和Cache”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学...
    99+
    2024-04-02
  • MySQL中的insert ignore into讲解
    最近工作中,使用到了insert ignore into语法,感觉这个语法还是挺有用的,就记录下来做个总结。 insert ignore into : 忽略重复的记录,直接插入数据。 包括两种场景: 插入的数据是主键冲突时 insert i...
    99+
    2023-10-04
    mysql
  • MySQL insert命令怎么使用
    在MySQL中,INSERT命令用于将新数据插入到数据库表中。它的基本语法如下:```sqlINSERT INTO table_na...
    99+
    2023-09-27
    MySQL
  • MySQL insert语句怎么使用
    MySQL的INSERT语句用于向数据库表中插入新的行。以下是使用INSERT语句的一般语法: INSERT INTO table_...
    99+
    2023-10-23
    MySQL
  • mysql怎么获取insert数据
    在 mysql 中获取插入数据的方法包括:使用 last_insert_id() 函数获取最近插入行的 id。使用 select ... returning 语句在插入时检索插...
    99+
    2024-05-30
    mysql
  • 图解MySQL | [原理解析] MySQL insert 语句的磁盘写入之旅
    一条 insert 语句在写入磁盘的过程中到底涉及了哪些文件?顺序又是如何的?下面我们用两张图和大家一起解析 insert 语句的磁盘写入之旅。 图 1:事务提交前的日志文件写入 旅途过程: 首先 insert 进入 server ...
    99+
    2016-05-10
    图解MySQL | [原理解析] MySQL insert 语句的磁盘写入之旅
  • MySQL 中 INSERT INTO 的使用详解
    前言 MySQL 是一个非常流行的关系型数据库管理系统,具有高效和可扩展性等特点。在 MySQL 数据库中,INSERT INTO 是一种用于将新行插入表中的 SQL 命令。它是 MySQL 最基本、最常用的语句之一,也是许多应用程序的核心...
    99+
    2023-09-02
    数据库 mysql java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作