浅谈innodb的索引页结构,插入缓冲,自适应哈希索引
发布时间 - 2026-01-11 00:25:02 点击率:次Physical Structure of an InnoDB Index

所有的innodb索引都是btree索引,索引记录保存在叶子上,默认的索引页大小是16K。当有新的记录插入时,innodb出于对将来的insert和update操作的考虑,会尝试留下1/16的空闲页大小。
如果索引记录是完全按照索引记录的大小顺序插入的,那么索引也将填满整个页大小的15/16,如果插入顺序完全随机,那么索引页基本上填充为1/2至15/16自建。如果填充因子低于1/2,innodb会尝试重建b-tree。
Mysql5.6以后,可以通过innodb_page_size参数设置当前实例下每个索引页的大小,一旦设定,无法再更改回来。推荐的配置一般是16K,8K或者4K。另外假如一个Mysql实例设置了不同于默认值的innodb_page_size A,那么将无法使用其他不同于A值的实例上的文件(比如做一个物理备份和恢复)
Insert Buffering
数据库应用通常按照主键顺序插入的,在这种情况下,因为聚集索引的顺序和这个主键值的顺序完全一致,insert操作将会减少很多的随机IO。
另一方面,二级索引通常不是唯一的,那么在二级索引中插入数据时是一个相对随机的顺序。同样的,delete和update操作在影响数据页时,涉及到索引的变更,在二级索引上也并不是紧挨着的。这就导致了大量的随机IO。
当插入一条记录,或者从非唯一的二级索引删除一条记录,innodb首先会去检查该二级索引页是否在缓冲池中。如果在缓冲池,innodb将会直接在内存中修改这个索引页。如果该索引也不在缓冲池,那么innodb将会将这个修改记录到插入缓冲,也就是insertbuffer。Insert buffer通常都比较小,所以能够保证全部在缓冲池中,并且更新非常频繁。这个修改的进程就是change buffering(通常情况下,它只会只作用于insert操作,所以也被称为insertbuffering,而该数据结构就是insert buffer)
Disk I/O for Flushing the Insert Buffer
那么插入缓冲如何减少随机IO的呢?每个一段时间,insert buffer会去合并在insertbuffer中的二级非唯一索引。通常情况下,它会合并N个修改到同一个btree索引的索引页中,从而节约了很多IO操作。经测试,insertbuffer可以提高15倍的插入速度。
在事务提交后,insert buffer可能还在合并写入。所以,假如当DB异常重启,reovery阶段,当有非常多的二级索引需要更新或插入时,insert buffer将可能花费很长时间,甚至几个小时。在这个阶段,磁盘IO将会增加,那么就会导致disk-bound类型的查询有显著的性能下滑。
Adaptive Hash Indexes
自适应哈希索引(AHI)使得innodb在缓冲池拥有足够的内存和某些工作负载下,看起来更像一个内存数据库,并且不会牺牲任何事务的特点和稳定性。这个特色由参数innodb_adaptive_hash_index控制,动态参数,默认为on表示打开自适应哈希索引,关闭AHI后内置哈希表将会被立马清空,而正常的操作依旧可以继续,只是直接通过访问B-TREE索引。重新使能AHI后哈希表又会被重建。
通过观察搜素模式,mysql会利用index key的前缀建立哈希索引,这个前缀可以是任意长度,并且它可能仅仅是B-tree上的某些值,而不是整个b-tree。哈希索引通过检测,会在经常被访问的index pages上建立哈希索引。
如果一个表几乎大部分都在缓冲池中,那么建立一个哈希索引能够加快等值查询,通过将btree的索引值转换成一个排序指针。Innodb有这个机制,可以监控索引的搜索情况,如果它注意到有些查询通过建立哈希索引可以优化查询,那么它会自动建立,所以说它是“自适应的”。
在某些工作负载下,通过哈希索引查找带来的性能提升价值远大于这个额外的监控索引搜索情况和保持这个哈希表结构所带来的开销。但某些时候,在负载较高的情况下,自适应哈希索引中添加的read/write 锁也会带来竞争,比如高并发的join操作。Like操作和%的通配符同样不适用于AHI。如果工作负载不适合AHI,建议将它关闭,以免带来不必要的性能开销。因为mysql内部很难预示在一个特定的场合下AHI到底是否合适,推荐做一个实际工作负载的压测(有无AHI两种情况)。在5.6及以后版本中将会考虑让越来越多的工作负载最好disable掉自适应哈希索引,尽管目前而言它默认还是开启的。
哈希索引的创建往往是基于现有的b-tree,innodb可以通过观察b-tree的搜索情况建立任意长度的b-tree索引前缀的方式建立哈希索引。一个哈希索引可以只是部分的,仅包括b-tree index中最经常被访问到的页。
你可以通过观察show engine innodb status结果中的SEMAPHORES部分来决定是否使用自适应哈希索引。如果你看到很多线程都在btr0sea.c文件上创建rw-latch上waiting,那么建议关闭掉自适应哈希索引。本人曾经碰到过的一个case截图如下,典型的高并发模式下AHI引起的竞争,需要关闭AHI
以上这篇浅谈innodb的索引页结构,插入缓冲,自适应哈希索引就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# mysql
# 自适应哈希索引
# MySQL InnoDB 锁的相关总结
# 如何区分MySQL的innodb_flush_log_at_trx_commit和sync_binl
# Mysql InnoDB的锁定机制实例详解
# Mysql技术内幕之InnoDB锁的深入讲解
# 修改MySQL数据库引擎为InnoDB的操作
# mysql innodb的重要组件汇总
# Mysql InnoDB和MyISAM区别原理解析
# 获取 MySQL innodb B+tree 的高度的方法
# MySQL MyISAM 与InnoDB 的区别
# MySQL创建数据表时设定引擎MyISAM/InnoDB操作
# MySQL Innodb关键特性之插入缓冲(insert buffer)
# 自适应
# 将会
# 都在
# 池中
# 可以通过
# 情况下
# 给大家
# 做一个
# 会去
# 它会
# 主键
# 都是
# 是一个
# 就会
# 如果你
# 也会
# 在这个
# 你可以
# 还在
# 很难
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
Python制作简易注册登录系统
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
Laravel如何处理文件下载请求?(Response示例)
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
微信小程序 wx.uploadFile无法上传解决办法
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
如何快速搭建支持数据库操作的智能建站平台?
js实现获取鼠标当前的位置
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
免费视频制作网站,更新又快又好的免费电影网站?
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
如何基于云服务器快速搭建网站及云盘系统?
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
Laravel如何配置任务调度?(Cron Job示例)
轻松掌握MySQL函数中的last_insert_id()
开心动漫网站制作软件下载,十分开心动画为何停播?
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
bootstrap日历插件datetimepicker使用方法
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
Android仿QQ列表左滑删除操作
北京专业网站制作设计师招聘,北京白云观官方网站?
如何挑选优质建站一级代理提升网站排名?
实例解析angularjs的filter过滤器
Laravel如何实现用户密码重置功能?(完整流程代码)
微信公众帐号开发教程之图文消息全攻略
高端建站三要素:定制模板、企业官网与响应式设计优化
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
如何用低价快速搭建高质量网站?
PHP 500报错的快速解决方法
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
Laravel如何处理和验证JSON类型的数据库字段
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
Laravel中的Facade(门面)到底是什么原理
如何利用DOS批处理实现定时关机操作详解
iOS UIView常见属性方法小结
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
html5的keygen标签为什么废弃_替代方案说明【解答】
js实现点击每个li节点,都弹出其文本值及修改
魔方云NAT建站如何实现端口转发?
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
JS弹性运动实现方法分析

