mysql insert buffer 详解

The change buffer is a special data structure that caches changes to secondary index pages when affected pages are not in the buffer pool. The buffered changes, which may result from INSERT, UPDATE, or DELETE operations (DML), are merged later when the pages are loaded into the buffer pool by other read operations.

change buffer/insert buffer是缓存非唯一索索引insert、update、delete操作时的记录,在其他操作加载索引数据到缓冲区时合并。

innodb在对非唯一索引做修改变更时,把数据插入insert buffer让事务觉得数据已刷新到硬盘提升事务执行效率,在根据内部算法逐步刷新到索引页,这样将多次索引操作合并为一次操作提升效率。

insert buffer会先将辅助索引的记录缓存起来,其前提必须保证一个索引页中缓存的记录不会引起页的分裂,缓存的数据过多时会主动读取索引页进行合并操作,innodb引擎有个insert buffer bitmap页记录每个辅助索引页的剩余空间,当剩余空间小于内部定义的阈值就必须主动进行一次合并操作,而insert buffer bitmap只能追踪一个辅助索引页2KB的可用空间,所以insert buffer只能缓存一个辅助索引页的总大小只有2KB.

insert buffer可以直接看着一个B+tree的索引树,因为结构和B+tree索引类似,当一个索引页数据发生合并操作时,insert buffer的索引树同样需要做平衡操作,就会对整个insert buffer索引树持有X-latch,阻塞其他对insert buffer的操作,当然这个X-latch持有时间是很短的,对于合并多个辅助索引的操作效率提升还是很明显。

合并数据时insert buffer加锁流程为:

index leaf page x-latch->insert buffer tree x-latch->insert buffer page x-latch->fsp(模块)x-latch

insert buffer加锁拥有优先级,当持有某一层的锁时不能再持有上一层的锁,这样和B+tree索引持锁方式有所不同,在insert buffer高并发时可以避免死锁发生。

In memory, the change buffer occupies part of the InnoDB buffer pool. On disk, the change buffer is part of the system tablespace, so that index changes remain buffered across database restarts.

内存中change buffer存于innodb缓冲区中,硬盘上存于系统表空间中,所以数据库重启之后也可以做合并操作,不会丢失数据。

innodb_change_buffering控制buffer空间存储什么类型产生的数据,可配置项有:

all:默认值,缓存插入、标记删除和后台物理清理

none:不缓存任何操作产生的数据

inserts:缓存insert产生的数据

deletes:缓存标记删除对辅助索引产生的变化

changes:inserts和deletes的合并项

purges:内部物理清除所产生的数据

innodb_change_buffer_max_size:设置insert buffer空间大小,默认为25,最大为50,该值为innodb_buffer_pool_size的百分比

insert buffer状态可以查看INSERT BUFFER AND ADAPTIVE HASH INDEX对应的值:

mysql> show engine innodb status\G;

-------------------------------------

INSERT BUFFER AND ADAPTIVE HASH INDEX

-------------------------------------

Ibuf: size 1, free list len 0, seg size 2, 0 merges

merged operations:

insert 0, delete mark 0, delete 0

discarded operations:

insert 0, delete mark 0, delete 0

Hash table size 138389, node heap has 0 buffer(s)

Hash table size 138389, node heap has 0 buffer(s)

Hash table size 138389, node heap has 0 buffer(s)

Hash table size 138389, node heap has 0 buffer(s)

Hash table size 138389, node heap has 0 buffer(s)

Hash table size 138389, node heap has 0 buffer(s)

Hash table size 138389, node heap has 1 buffer(s)

Hash table size 138389, node heap has 0 buffer(s)

0.00 hash searches/s, 0.00 non-hash searches/s

也可以在INFORMATION_SCHEMA库下表中也可以查询到占用缓冲区数据页的情况

SELECT  
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
WHERE PAGE_TYPE LIKE ‘IBUF%‘
) AS change_buffer_pages,
(
SELECT COUNT(*)
FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
) AS total_pages,
(
SELECT ((change_buffer_pages/total_pages)*100)
) AS change_buffer_page_percentage;

+---------------------+-------------+-------------------------------+

| change_buffer_pages | total_pages | change_buffer_page_percentage |

+---------------------+-------------+-------------------------------+

|        41 |        32764 |          0.1251 |

+---------------------+-------------+-------------------------------+

时间: 2024-10-10 08:14:07

mysql insert buffer 详解的相关文章

MySQL数据库优化详解(收藏)

MySQL数据库优化详解 mysql表复制 复制表结构+复制表数据mysql> create table t3 like t1;mysql> insert into t3 select * from t1;mysql索引 ALTER TABLE用来创建普通索引.UNIQUE索引或PRIMARY KEY索引ALTER TABLE table_name ADD INDEX index_name (column_list)ALTER TABLE table_name ADD UNIQUE (colu

Mysql 三大特性详解

Mysql 三大特性详解 Mysql Innodb后台线程 工作方式 首先Mysql进程模型是单进程多线程的.所以我们通过ps查找mysqld进程是只有一个. 体系架构 InnoDB存储引擎的架构如下图所以,是由多个内存块组成的内存池,同时又多个后台线程进行工作,文件是存储磁盘上的数据. 后台线程 上面看到一共有四种后台线程,每种线程都在不停地做自己的工作,他们的分工如下: Master Thread: 是最核心的线程,主要负责将缓冲池中的数据异步刷新的磁盘,保证数据的一致性,包括脏页的刷新.合

MySQL配置文件mysql.ini参数详解、MySQL性能优化

MySQL配置文件mysql.ini参数详解.MySQL性能优化 my.ini(Linux系统下是my.cnf),当mysql服务器启动时它会读取这个文件,设置相关的运行环境参数. my.ini分为两块:Client Section和Server Section.   Client Section用来配置MySQL客户端参数.   要查看配置参数可以用下面的命令: show variables like '%innodb%'; # 查看innodb相关配置参数 show status like

如何查看mysql数据库的引擎/MySQL数据库引擎详解

一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看: 看你的mysql现在已提供什么存储引擎:mysql> show engines; 看你的mysql当前默认的存储引擎:mysql> show variables like '%storage_engine%'; 你要看某个表用了什么引擎(在显示结果里参数engine后面的就表示该表当前用的存储引擎):mysql> show create table 表名; MySQL数据库引擎详解 作为Java程序员,MySQL数据库

MySQL的binlog详解(转)

MySQL的binlog详解 什么是binlog binlog日志用于记录所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有语句.语句以"事件"的形式保存,它描述数据更改. binlog作用 因为有了数据更新的binlog,所以可以用于实时备份,与master/slave复制 和binlog有关参数 log_bin 设置此参数表示启用binlog功能,并指定路径名称 log_bin_index 设置此参数是指定二进制索引文件的路径与名称 binlog_

【mysql】mysql innodb 配置详解

MySQL innodb 配置详解 innodb_buffer_pool_size:这是InnoDB最重要的设置,对InnoDB性能有决定性的影响.默认的设置只有8M,所以默认的数据库设置下面InnoDB性能很差.在只有InnoDB存储引擎的数据库服务器上面,可以设置60-80%的内存.更精确一点,在内存容量允许的情况下面设置比InnoDB tablespaces大10%的内存大小. innodb_data_file_path:指定表数据和索引存储的空间,可以是一个或者多个文件.最后一个数据文件

MySQL主从架构详解

1.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置.从服务器接收

Mysql 配置参数详解以及优化配置

mysql有以下几种日志: 错误日志:   log-err 查询日志:   log 慢查询日志:  log-slow-queries 更新日志:   log-update 二进制日志: log-bin 要把日志生成在 /var/log 目录下(是系统日志存放的地方,只有 root 账号有写权限),需要 MySQL进程对这个目录有读写权限,一般是不这么做的,也考虑到安全问题,包括 MySQL 本身的数据安全,因为对 MySQL 的所有操作,都会记录到常规查询日志.MySQL的日志就不要用 /var

mysql触发器用法详解

MySQL触发器语法详解: 触发器 trigger是一种特殊的存储过程,他在插入(inset).删除(delete)或修改(update)特定表中的数据时触发执行,它比数据本身标准的功能更精细和更复杂的数据控制能力.触发器不是由程序调用,而是由某个事件来触发的.在有数据修改时自动强制执行其业务规则,经常用于加强数据的完整性约束和业务规则等.触发器可以查询其他表,而且包含复制的sql语句.触发器也可用于强制引用完整性.触发器可以强制比用check约束定义的约束更为复杂的约束. (一).CREATE