首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql-innodb关键特性

mysql-innodb关键特性

作者头像
用户1433289
发布2018-03-14 16:51:40
1.4K0
发布2018-03-14 16:51:40
举报
文章被收录于专栏:hhhh

一、insert buffer

1.插入缓冲(insert buffer):数据页一样,是物理页的一个组成部分,其数据结构是一棵B+树,存放在ibdata1(共享表空间)中

注:并不是所有的主键插入都是顺序的,若主键是UUID,则插入和辅助索引一样,同样是随机的

对于非聚集索引的插入或更新操作,不是每一次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,若在,则直接插入;若不在,则先放入一个insert buffer对象中,然后再以一定频率和情况进行insert buffer和辅助索引页子节点的merger(合并)操作。

使用insert buffer的条件:

索引是辅助索引;

索引不是唯一的。

2.change buffer

对于insert buffer的升级,可以对DML操作—insert、delete、update都进行缓冲,change buffer使用的对象是非唯一的辅助索引,可以通过innodb_change_buffer_max_size来控制 change buffer最大使用内存的数量,默认值为25即最多使用1/4的缓冲池内存空间,该参数最大有效值为50

3.insert buffer的内部实现

insert buffer 数据结构是一棵B+树且全局只有一棵,负责对所有的表的辅助索引进行insert buffer,存放在共享表空间中(ibdata1中)。试图通过独立表空间ibd文件恢复表中数据中,会导致check table失败。(由于表的辅助索引中的数据可能还在insert buffer中,所以通过ibd文件恢复后,还需要进行repair table来重建表上所有的辅助索引)

insert buffer由叶节点和非叶节点(search key 键值)组成。

非叶节点的search key如图:

说明:space (占用4字节)表示待插入记录所在表的表空间ID(每张表都有一个唯一的space id);market(占用1字节)用来兼容老版本insert buffer;offset(占用4字节)t表示页所在的偏移量。

过程:当辅助索引要插入到页时,如果这个页不在缓冲池中,那么innodb会先构造一个search key,接下来查询insert buffer这棵B+树,然后将这条记录插入到insert buffer B+树的叶节点中

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档