AHI对MySQL性能的影响

MySQL中出现很多latch锁,而这个很大程度上和MySQL自适应hash索引有关。

在这里插入图片描述

AHI概述

MySQL InnoDB存储引擎的自适应哈希(Adaptive Hash Index,下简称AHI)功能

若用户的访问模式基本都是类似KV操作的点查询(point select),则InnoDB存储引擎会自动创建哈希索引。

在有了哈希索引后,查询无需走B+树搜索,而直接通过hash就能直接定位查询的数据。

因此,通过AHI功能,MySQL的查询性能就能得到大幅提升。

查询能提升多少呢?对于写入操作又是否有影响呢?AHI有什么副作用么?

AHI对读写性能影响
查询压测

[root@VM-16-10-centos ~]# sysbench /usr/share/sysbench/oltp_point_select.lua --mysql-host=10.0.16.10 --mysql-port=3307 --mysql-user=cjr --mysql-password=cjr --mysql-db=sysbench --db-driver=mysql --tables=1 --table-size=10000000 --report-interval=1 --threads=2 --rand-type=uniform --max-requests=1000000 run >sysbench_off.log
[root@VM-16-10-centos ~]# sysbench /usr/share/sysbench/oltp_point_select.lua --mysql-host=10.0.16.10 --mysql-port=3307 --mysql-user=cjr --mysql-password=cjr --mysql-db=sysbench --db-driver=mysql --tables=1 --table-size=10000000 --report-interval=1 --threads=2 --rand-type=uniform --max-requests=1000000 run >sysbench_on.log

从下图可以看到,在AHI的加持下,主键查询可以达到2540的QPS:
在这里插入图片描述

但若当我们通过参数 innodb_adaptive_hash_index 关闭AHI功能后,主键查询的性能下跌了最高只达到2371QPS:
在这里插入图片描述

set global innodb_adaptive_hash_index =off;

DML压测

对于写入操作,开启和关闭AHI功能对性能的影响都没有太大的区别。

这是因为当DML测试时, MySQL 的瓶颈主要是在磁盘写入。

具体可以通过 sysbench 的 oltp_update_index.lua 基准测试进行观察。

sysbench /usr/share/sysbench/oltp_update_index.lua --mysql-host=10.0.16.10 --mysql-port=3307 --mysql-user=cjr --mysql-password=cjr --mysql-db=sysbench --db-driver=mysql --tables=1 --table-size=10000000 --report-interval=1 --threads=2 --rand-type=uniform --max-requests=1000000 run >sysbench_off.log
sysbench /usr/share/sysbench/oltp_update_index.lua --mysql-host=10.0.16.10 --mysql-port=3307 --mysql-user=cjr --mysql-password=cjr --mysql-db=sysbench --db-driver=mysql --tables=1 --table-size=10000000 --report-interval=1 --threads=2 --rand-type=uniform --max-requests=1000000 run >sysbench_on.log

打开AHI的情况
在这里插入图片描述

关闭AHI的情况
在这里插入图片描述

可以观察不管是否打开AHI,TPS都差不多

AHI的副作用

作为一个几乎透明的功能,其实一般用户无需关心,基本可以认为AHI是即开即用的功能。

默认AHI参数的设置也是比较合理的,例如参数 innodb_adaptive_hash_index_parts 设置为 8 。

然而,AHI存在一个副作用:当删除大表,且缓冲池(Buffer Pool,下简称BP)比较大,如超过32G,则MySQL数据库可能会有短暂被hang住的情况发生。

这时会对业务线程造成一定影响,从而导致业务系统的抖动。

产生这个问题的原因是在删除表的时候,InnoDB存储引擎会将该表在BP中的内存都淘汰掉,释放可用空间。

这其中包括数据页、索引页、自适应哈希页等。

当BP比较大是,扫描BP中flush_list链表需要比较长的时间,因此会产生系统的抖动。

因此在海量的互联网并发业务中,删除表操作需要做精细的逻辑控制,如:

  1. 业务低峰期删除大表;

  2. 删除表前禁用AHI功能;

  3. 控制脏页链表长度,只有长度小于一定阈值,才发起删除操作;

  4. 删除表后启用AHI功能;

不过呢,所有这么麻烦的处理在 MySQL 8.0.23 版本之后,就都不再需要了。

因为官方已经彻底修复了这个问题:

注意,截至目前最新的 MySQL 5.7.34 版本并没有进行修复,所以 5.7 还需要用户自己做控制。

总结

AHI真的是一个InnoDB的好功能,这才是真正的AI数据库该有的样子。

但InnoDB存储引擎在2001年发布时,就支持了这个功能,创始人Heikki Tuuri真可谓具有卓越的远见。

但在使用时,要特别注意删除大表可能产生的hang住问题。

这会对业务产生一定的影响,对于较高要求的业务来说,或许是不能接受的。

不过,若升级到 MySQL 8.0.23 版本后,这些问题将不复存在。

本文参考https://zhuanlan.zhihu.com/p/379683912

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/757986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

es bulk批量操作简单实例

(1)定义 bulk允许在单个步骤中进行多次create、index、update或delete请求。 bulk与其他的请求体格式稍有不同,如下所示: { action: { metadata }}\n { request body }\n { action: { metadata }}\n { request body …

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+HLS图像缩放+多路视频拼接,提供4套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博主所有FPGA工程项目-->汇总目录本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收OSD动态字符叠加输出应用本方案的SDI接收HLS…

【CSS】html滚动条相关

1.滚动条样式 ::-webkit-scrollbar {width: 10px;height: 10px;z-index: 101; } ::-webkit-scrollbar-thumb {border-radius: 5px;background: #cecece; } ::-webkit-scrollbar-track {// background: #f5f5f5be;background: rgba(33, 85, 163, 0); } ::-webkit-scrollbar-but…

python汽车租赁系统的设计与实现flask-django-php-nodejs

困扰公司的许多问题当中,汽车租赁管理一定是公司不敢忽视的一块。但是管理好汽车租赁又面临很多麻烦需要解决,例如有几个方面:第一,公司往往汽车数量都比较多,如何保证能够管理到每一汽车;第二,如何在工作琐碎,记录繁多的情况下将汽车租赁的当前情况反应给公司领导相关部门决策…

Python之Web开发中级教程----ubuntu中下载安装Postman

Python之Web开发中级教程----ubuntu中下载安装Postman PostMan 是一款功能强大的网页调试与发送网页 HTTP 请求的 Chrome 插件,可以直接去对我们写出来的路由和视图函数进行调试,作为后端程序员是必须要知道的一个工具。 查看ubuntu系统中是否已经安装了…

常用小知识点总结

1. pc可以跑通,但是安卓编译死循环,可能是函数声明了返回类型,但是没有真正返回 2. ubuntu下根据关键词杀死所有相关进程。ps -ef | grep code | grep -v grep | cut -c 10-16 | xargs kill -s 9 top和ps基本作用都是显示系统进程状况&…

matplotlib绘图一例

网上外卖用户规模及使用率import matplotlib.pyplot as plt import matplotlib.dates as mdates import pandas as pd# 数据源自www.cnnic.net.cn。 l [["2015/12", "1.14亿", "16.5%"], ["2016/6", "1.50亿", "21.1%…

electron-builder 打包问题,下载慢解决方案

目录 问题说明设置下载源 ?解决方案思路下载Electron下载winCodeSign下载nsis下载nsis-resources 总结 问题说明 项目使用了Electron,在第一次打包时会遇见下载慢,导致打包进度几乎停滞不前,甚至可能直接报错 其实这是因为Electr…

套的-流量分析

目录 1、流量分析2、寻找flag3、总结 1、流量分析 把流量包下载下来进行分析,得到下面这些信息 通过追踪HTTP流,我们可以很明显的感觉到是对42.193.4.49进行目录爆破 追踪流给出的信息是不完整的,我们只是用来推测大概的过程,了解…

在电脑桌面上怎么制作可视化工作计划待办清单?

对于忙碌的上班族来说,每天都需要处理大量的工作任务,如何在繁杂的工作中保持高效和有序,成为了一个亟待解决的问题。在电脑桌面上制作可视化的工作计划待办清单,就是一个非常实用的方法。通过将工作任务以清单的形式展现在桌面上…

头条网盘拉新怎么通过授权解锁推广权限

头条网盘拉新项目是去年12月份才首发上线的一个项目,从佣金上,只要拉新一个用户就可以获取价格为9元的佣金,且拉失活用户也可以获取价格为4元的佣金,从背景上,背靠字节跳动这个大公司,预算充足,…

2.Labview字符串与路径精讲(上) — 理论篇

本章讲解labview中的字符串和路径及其使用方法,从前面板字符串属性到后面板字符串函数应用做出详细概述,通过本文的学习希望大家了解到字符串在labview编程中的重要地位。 本系列文章为labview 从基础到强化到精通的学习文章,大家可以随时点进…

本地项目文件夹创建python文件并配置conda环境的完整流程

1 在Pycharm中创建新项目 位置就是本地的项目文件夹 2 接着打开pycharm的终端 创建conda环境(这个过程需要保证conda.exe能够被系统路径识别) conda create --name my_environment(my_environment取自己想要的环境名字) 还可以指…

MySQL - 单表访问

单表访问 查询方式 MySQL查询的执行方式大致分为下边两种: 使用全表扫描进行查询 这种执行方式很好理解,就是把表的每一行记录都扫一遍嘛,把符合搜索条件的记录加入到结果集就完了。不管是啥查询都可以使用这种方式执行,当然&am…

【Machine Learning】Suitable Learning Rate in Machine Learning

一、The cases of different learning rates: In the gradient descent algorithm model: is the learning rate of the demand, how to determine the learning rate, and what impact does it have if it is too large or too small? We will analyze it through the follow…

索引常见面试题

面试中,MySQL 索引相关的问题基本都是一系列问题,都是先从索引的基本原理,再到索引的使用场景,比如: 索引底层使用了什么数据结构和算法?为什么 MySQL InnoDB 选择 Btree 作为索引的数据结构?什…

ProtoBuf-gRPC实践

目录介绍 01.gRPC学习背景 1.1 为什么要学RPC1.2 RPC是什么1.3 网络库收益分析1.4 学习计划说明1.5 学习问题思考 02.ProtoBuf的介绍 2.1 ProtoBuf是什么2.2 ProtoBuf和json2.3 ProtoBuf问题思考2.4 ProtoBuf特点2.5 ProtoBuf存储格式2.6 ProtoBuf优缺点2.7 创建proto文件2.8 …

Oracle等待事件-db file scattered read

上一篇说了下 Oracle等待事件-db file sequential read-CSDN博客 ,这一篇说一下它的”孪生兄弟” 另外一个IO 等待事件 db file scattered read(数据库文件分散读) 如果 Oracle 在 SGA 的缓冲区缓存中没有用户请求的数据,则服务器进程会将相应的数据块…

前端学习之css选择器--基本选择器、关系选择器、属性选择器、复合选择器、伪类选择器

目录 基本选择器 结果 关系选择器 结果 父子关系 祖先后代关系 相邻兄弟关系 兄弟关系 ​编辑 属性选择器 结果 复合选择器 结果 伪类选择器 结果 伪类选择器-操作标签 结果 未访问 访问后 悬停 伪类选择器-操作表单 结果 伪类选择器-操作结构 结果 基本选择…

二叉树详解

二叉树详解 一:什么是树1:概念2:树的特点##3:树的一些重要概念 二:二叉树1:二叉树的概念2:二叉树的特点3:特殊的二叉树: 三:二叉树的性质四:二叉树的存储 一:什么是树 1:概念 树是一种非线性的数据结构,它是由n个节点组成的一个具有层次关系的集合,把它叫做树的原因是因为它看…