MySQL OCP888题解057-避免长时间等待
迪丽瓦拉
2025-06-01 21:11:59
0

文章目录

  • 1、原题
    • 1.1、英文原题
    • 1.2、答案
  • 2、题目解析
    • 2.1、题干解析
    • 2.2、选项解析
  • 3、知识点
    • 3.1、知识点1:innodb_lock_wait_timeout系统变量
    • 3.2、知识点2:innodb_read_io_threads系统变量
    • 3.3、知识点3:自适应哈希索引
      • 3.3.1、什么是自适应哈希索引
      • 3.3.2、自适应哈希索引和B树索引的比较
      • 3.3.3、innodb_adaptive_hash_index系统变量
  • 4、总结

1、原题

1.1、英文原题

InnoDB: Warning: a long semaphore wait:
The relevant parts of the InnoDB monitor output shows:

Which two options would help avoid the long wait in the future?
A、Increase the value of the innodb_lock_wait_timeout option.
B、Increase the value of the innodb_read_io_threads option.
C、Change the table to use HASH indexes instead of BTREE indexes.
D、Set the value of innodb_adaptive_hash_index to zero.
E、Deactivate the query cache.
F、Increase the size of the InnoDB buffer pool.

1.2、答案

D、E

2、题目解析

2.1、题干解析

本题考察的是InnoDB各种与性能有关的配置。

2.2、选项解析

  1. 锁等待时间是个最长的阀值,所以如果有等待时间很长的情况,并不是这个锁等待阀值导致的,而是实际等待行锁就需要这么长时间,所以修改这个阀值是没有意义的,跟query cache也没有关系,所以选项A错误。
  2. 从描述可以看出这里是有query cache锁,增加IO线程数量没有意义,所以选项B错误。
  3. 哈希索引是自适应的,没法指定使用,所以选项C错误。
  4. 选项D不知道为啥正确,有懂的小伙伴可以分享下。
  5. 从描述可以看出这里是有query cache锁,禁用query cache会有效果。所以选项E正确。
  6. 选项F不知道为啥错误,有懂的小伙伴可以分享下。

3、知识点

3.1、知识点1:innodb_lock_wait_timeout系统变量

  • innodb_lock_wait_timeout系统变量表示InnoDB事务在放弃之前等待行锁的时间长度(秒)。默认值是50秒。对于及时性要求高的应用程序或OLTP系统,可以降低这个值。当锁等待超时发生时,当前语句被回滚(而不是整个事务)。
  • innodb_lock_wait_timeout只适用于InnoDB行锁,不适用表锁的等待。
  • 当innodb_deadlock_detect被启用(默认)时,锁等待超时值不适用于死锁,因为InnoDB会立即检测到死锁并回滚其中一个死锁事务。当innodb_deadlock_detect被禁用时,InnoDB依靠innodb_lock_wait_timeout在死锁发生时进行事务回滚。
  • innodb_lock_wait_timeout可以在运行时通过SET GLOBAL或SET SESSION语句来设置。改变GLOBAL设置需要足够的权限来设置全局系统变量,并影响到随后连接的所有客户端的操作。任何客户端都可以改变innodb_lock_wait_timeout的SESSION设置,这只影响到该客户端。

官方参考文档

3.2、知识点2:innodb_read_io_threads系统变量

innodb_read_io_threads系统变量代表InnoDB中读取操作的I/O线程数量。InnoDB使用后台线程来服务各种类型的I/O请求。你可以使用innodb_read_io_threads和innodb_write_io_threads配置参数来配置服务于数据页的读和写I/O的后台线程的数量。这些参数分别标志着用于读和写请求的后台线程的数量。它们在所有支持的平台上都有效。你可以在MySQL选项文件(my.cnf或my.ini)中为这些参数设置值;你不能动态地改变值。这些参数的默认值是4,允许的值范围是1-64。

官方参考文档
官方参考文档

3.3、知识点3:自适应哈希索引

3.3.1、什么是自适应哈希索引

Innodb存储引擎会监控对表上二级索引的查找,如果发现某二级索引被频繁访问,二级索引成为热数据,建立哈希索引可以带来速度的提升。经常访问的二级索引数据会自动被生成到hash索引里面去(最近连续被访问三次的数据),自适应哈希索引通过缓冲池的B+树构造而来,因此建立的速度很快。
自适应哈希索引由innodb_adaptive_hash_index变量启用,或者在服务器启动时由–skip-innodb-adaptive-hash-index关闭。

自适应哈希索引的优点:
1、无序,没有树高,访问速度更快
2、降低对二级索引树的频繁访问资源
3、自适应

自适应哈希索引的缺点:
1、hash自适应索引会占用innodb buffer pool;
2、自适应hash索引只适合搜索等值的查询,如select * from table where index_col=‘xxx’,而对于其他查找类型,如范围查找,是不能使用的;

官方参考文档
参考文档

3.3.2、自适应哈希索引和B树索引的比较

B树索引的特点:

  1. 在使用=, >, >=, <, <=, 或BETWEEN操作符的表达式中,B树索引可用于列比较。如果LIKE的参数是一个不以通配符开始的常量字符串,那么索引也可以用于LIKE比较。

哈希索引的特点
1/ 它们只用于使用=或<=>运算符的平等比较(但速度非常快)。它们不用于查找数值范围的比较运算符,如<。依靠这种类型的单值查找的系统被称为 “键值存储”;要将MySQL用于这种应用,应尽可能使用哈希索引。
2. 优化器不能使用哈希索引来加速ORDER BY操作。(这种类型的索引不能用于搜索顺序的下一个条目)。
3. 只有整个键可以被用来搜索一条记录。(对于B树索引,键的任何最左边的前缀都可以用来寻找行)。

官方参考文档

3.3.3、innodb_adaptive_hash_index系统变量

innodb_adaptive_hash_index系统变量表示InnoDB的自适应哈希索引是否被启用或禁用。这个变量在默认情况下是启用的。你可以使用SET GLOBAL语句修改这个参数,而不需要重新启动服务器。在运行时改变设置需要足够的权限来设置全局系统变量。
禁用自适应哈希索引会立即清空哈希表。当哈希表被清空时,正常的操作可以继续进行,而执行使用哈希表的查询则直接访问索引B树。

官方参考文档

4、总结

  1. innodb_lock_wait_timeout系统变量表示InnoDB事务在放弃之前等待行锁的时间长度(秒)。该变量只适用于InnoDB行锁,不适用于表锁。对于及时性要求高的应用程序或OLTP系统,可以降低这个值。当锁等待超时发生时,当前语句被回滚(而不是整个事务)。
  2. innodb_read_io_threads系统变量代表InnoDB中读取操作的I/O线程数量。InnoDB使用后台线程来服务各种类型的I/O请求。
  3. InnoDB自适应哈希索引:Innodb存储引擎会监控对表上二级索引的查找,如果发现某二级索引被频繁访问,二级索引成为热数据,建立哈希索引可以带来速度的提升。但哈希索引只能用于只适用于使用=或<=>运算符的平等比较,不适用于查找数值范围的比较运算符。哈希索引不能用来加速排序擦欧洲哦,也只能用整个键可以被用来搜索一条记录。(对于B树索引,键的任何最左边的前缀都可以用来寻找行)。所以哈希索引的局限性很明显,但是哈希索引会占用innodb buffer pool,所以要慎用。

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...