RDS MySQL Adaptive Hash Index (AHI)最佳实践

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: 本文介绍了AHI (Adaptive Hash Index)的使用场景以及为何建议默认关闭AHI。

背景

很多客户在使用MySQL时大部分只要语法执行没问题,一般来讲是不太会关注更多细节的。像MySQL的AHI就是其中一个细节。内存的延时是120ns,访问内存里的数据是比较快的。InnoDB监视对每个索引的使用情况,如果它注意到某些索引页经常被访问,并可以从建立AHI中受益,那它会自动为该索引在Buffer Pool里构建hash table。基于InnoDB观察到的搜索模式,它使用索引键的前缀来构建AHI。键的前缀可以是任何长度,而且可能只有B树中的一些值出现在AHI中。

是否使用AHI可以通过innodb_adaptive_hash_index控制。尽管InnoDB可以监控索引的访问,但直到现在也没有对AHI自己的稳定性监控,以至于在生产上遇到某些不适合的场景,需要人为判断要不要禁用AHI。从数据结构上来说,AHI并不适用于所有访问场景,本篇文章就来聊聊它的使用场景。

AHI的关键节点

  • MySQL从5.5版本AHI诞生

但只有一个hash table,只有一把锁,有时保护对AHI的读/写锁可能会在高负载(如多个并发连接)下成为瓶颈。

通过show engine innodb status看到的信息是:

-------------------------------------INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------Ibuf: size 1, free list len 0, seg size 2,0 merges
merged operations:insert0,delete mark 0,delete0discarded operations:insert0,delete mark 0,delete0Hash table size 50999503, node heap has 1 buffer(s)300220.95 hash searches/s,364993.48 non-hash searches/s
  • MySQL5.7里增加了innodb_adaptive_hash_index_parts

为了解决上述瓶颈问题,从5.7开始(RDS MySQL从5.6支持)对AHI特征进行了分区,分区由innodb_adaptive_hash_index_parts变量控制。MySQL通过取模将AHI锁打散到多个hash table上,也就意味着打散后的hash table越多,AHI锁就打得更散,锁的粒度就更细,并发查询时构建AHI的性能就更好。

通过show engine innodb status看到的信息是:

-------------------------------------INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------Ibuf: size 1, free list len 0, seg size 2,19164 merges
merged operations:insert135,delete mark 19087,delete33discarded operations:insert0,delete mark 0,delete0Hash table size 6375037, node heap has 1432 buffer(s)Hash table size 6375037, node heap has 2884 buffer(s)Hash table size 6375037, node heap has 1 buffer(s)Hash table size 6375037, node heap has 1 buffer(s)Hash table size 6375037, node heap has 1443 buffer(s)Hash table size 6375037, node heap has 1440 buffer(s)Hash table size 6375037, node heap has 1 buffer(s)Hash table size 6375037, node heap has 18606 buffer(s)1085.85 hash searches/s,0.24 non-hash searches/s

从上面的信息可以看到如果node heap has * buffer(s)不均衡的话,说明AHI有数据倾斜。hash searches/s 命中hash索引的次数,non-hash searches未命中hash索引的次数。

适合的场景

  • 只支持=和in

不适合的场景

AHI的工作流程参考MySQL内核月报的“AHI介绍”。在下面的访问不能使用AHI:

  • drop table、truncate table、alter table 、drop index分区等
  • like、regexp、<=>等
  • 任何范围查询
  • 有spatial索引
  • 排序

在DDL时打开AHI容易引起数据库卡顿的原因如下:

  • 在删除表时,需要先通过扫描LRU链表找到该表在AHI使用的数据页,将这些数据从AHI中删除。如果为MySQL实例配置较多的物理内存,扫描LRU链表可能会导致数据库性能异常甚至数据库Crash。
  • 删除AHI的操作正在执行,而InnoDB数据字典缓存dict_sys被独占锁定,进而影响正常业务获取MDL锁,阻塞正常业务。

关闭AHI

在实际的生产环境场景比较复杂,又很难事先预测AHI是否适合实际生产需要,对于不能从AHI受益的场景,通过SHOW ENGINE INNODB STATUS中SEMAPHORES可以部分监控AHI的使用情况,当看到许多线程在等待btr0sea.c中创建的RW-latch,可以考虑关闭AHI。

鉴于阿里云用户反馈的SQL执行慢或卡顿问题有很多跟打开AHI有关,所以阿里云RDS MySQL 5.6 & 5.7实例从2020-12-02 20:00之后 / 8.0版本从2021-05-22 17:05之后的新购实例默认关闭AHI。对于旧有版本还需要用户自行关闭。

具体操作可以参考下图:

总结

虽然在MySQL官方版本中每个版本都是把AHI默认打开,但根据实际生产中的表现来看却差强人意,InnoDB AHI只能在特定的、几乎是只读的场景中才能提高性能;而对于诸如:drop table、truncate table、alter table或drop index等场景表现不佳,甚至导致MySQL hung或极端场景下的数据损坏。此外,AHI会消耗Buffer Pool的空间,这可能会影响性能。当有上述语句执行时可以在执行之前把AHI关掉,执行完后再打开。但这一系列操作比较麻烦,稍有疏忽可能会影响业务,考虑打开AHI弊大于利,最好禁用AHI。

参考

https://bugs.mysql.com/bug.php?id=100512

https://bugs.mysql.com/bug.php?id=101667

https://bugs.mysql.com/bug.php?id=62018

https://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_adaptive_hash_index

https://jira.mariadb.org/browse/MDEV-20487


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
4月前
|
SQL 人工智能 关系型数据库
AI Agent的未来之争:任务规划,该由人主导还是AI自主?——阿里云RDS AI助手的最佳实践
AI Agent的规划能力需权衡自主与人工。阿里云RDS AI助手实践表明:开放场景可由大模型自主规划,高频垂直场景则宜采用人工SOP驱动,结合案例库与混合架构,实现稳定、可解释的企业级应用,推动AI从“能聊”走向“能用”。
1071 39
AI Agent的未来之争:任务规划,该由人主导还是AI自主?——阿里云RDS AI助手的最佳实践
|
10月前
|
人工智能 运维 关系型数据库
云服务API与MCP深度集成,RDS MCP最佳实践
近日,阿里云数据库RDS发布开源RDS MCP Server,将复杂的技术操作转化为自然语言交互,实现"对话即运维"的流畅体验。通过将RDS OpenAPI能力封装为MCP协议工具,用户只需像聊天一样描述需求,即可完成数据库实例创建、性能调优、故障排查等专业操作。本文介绍了RDS MCP(Model Context Protocol)的最佳实践及其应用,0代码,两步即可轻松完成RDS实例选型与创建,快来体验!
云服务API与MCP深度集成,RDS MCP最佳实践
|
存储 关系型数据库 MySQL
MySQL中为什么要使用索引合并(Index Merge)?
通过这些内容的详细介绍和实际案例分析,希望能帮助您深入理解索引合并及其在MySQL中的
670 10
|
关系型数据库 MySQL 数据库
MySQL数据库:基础概念、应用与最佳实践
一、引言随着互联网技术的快速发展,数据库管理系统在现代信息系统中扮演着核心角色。在众多数据库管理系统中,MySQL以其开源、稳定、可靠以及跨平台的特性受到了广泛的关注和应用。本文将详细介绍MySQL数据库的基本概念、特性、应用领域以及最佳实践,帮助读者更好地理解和应用MySQL数据库。二、MySQL
1006 5
|
关系型数据库 MySQL 测试技术
MySQL 报错 ERROR 1709: Index column size too large
MySQL 报错 ERROR 1709: Index column size too large
719 4
|
存储 C# 关系型数据库
“云端融合:WPF应用无缝对接Azure与AWS——从Blob存储到RDS数据库,全面解析跨平台云服务集成的最佳实践”
【8月更文挑战第31天】本文探讨了如何将Windows Presentation Foundation(WPF)应用与Microsoft Azure和Amazon Web Services(AWS)两大主流云平台无缝集成。通过具体示例代码展示了如何利用Azure Blob Storage存储非结构化数据、Azure Cosmos DB进行分布式数据库操作;同时介绍了如何借助Amazon S3实现大规模数据存储及通过Amazon RDS简化数据库管理。这不仅提升了WPF应用的可扩展性和可用性,还降低了基础设施成本。
418 0
|
关系型数据库 MySQL 数据库连接
绝对干货!从MySQL5.7平滑升级到MySQL8.0的最佳实践分享
绝对干货!从MySQL5.7平滑升级到MySQL8.0的最佳实践分享
2783 0
|
SQL 存储 关系型数据库
精通MySQL:从基础到高级应用与最佳实践
第一章:MySQL基础入门 1.1 MySQL概述 介绍MySQL的历史、发展、优势以及应用领域
1014 1
|
缓存 关系型数据库 MySQL
MySQL数据库——InnoDB引擎-架构-内存结构(Buffer Pool、Change Buffer、Adaptive Hash Index、Log Buffer)
MySQL数据库——InnoDB引擎-架构-内存结构(Buffer Pool、Change Buffer、Adaptive Hash Index、Log Buffer)
306 3
|
存储 关系型数据库 MySQL
MySQL数据库——索引(2)-B+Tree、Hash结构,索引分类(聚集索引、二级索引)
MySQL数据库——索引(2)-B+Tree、Hash结构,索引分类(聚集索引、二级索引)
352 1

相关产品

  • 云数据库 RDS MySQL 版
  • 云数据库 RDS
  • 推荐镜像

    更多