一文了解MySQL性能测试及调优中的死锁处理方法,你还看不明白?
一文了解MySQL性能测试及调优中的死锁处理方法,你还看不明白?
以下从死锁检测、死锁避免、死锁解决3个方面来探讨如何对MySQL死锁问题进行性能调优。
死锁检测
通过SQL语句查询锁表相关信息:
(1)查询表打开情况
SHOW OPEN TABLES WHERE IN_USE> 0
(2)查询锁情况列表
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS
(3)查询锁等待信息,其中blocking_lock_id是当前事务在等待的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS
(4)查询死锁日志
SHOW ENGINE INNODB STATUS
这条语句只能显示最新的一条死锁,无法完全捕获到系统发生的所有死锁信息。
如果想要记录所有的死锁日志,需要打开innodb_print_all_deadlocks参数,将所有的死锁日志记录到errorlog中。
(5)查询锁等待时间
SHOW STATUS LIKE '%lock%'
死锁避免
当有死锁发生时,通常是由于项目的程序中出现了冗长的事务,或是由于隔离级别设置的不合适等。
我们需要在事务使用中注意以下几点:
(1)尽量保持事务的短小精悍,做出一系列关联的更新操作后立即提交事务,以降低死锁的可能性。特别是不要让有关联的MySQL会话长时间挂起未提交的事务。
(2)建议使用更低的隔离级别,如READ COMMITTED。
(3)在同一事务内修改多张表,或一张表内的不同行时,每次以相同的顺序执行操作。以便让事务形成清晰的锁操作队列而规避死锁。
死锁解决
MySQL数据库通过死锁检测(innodb_deadlock_detect)和死锁超时时间(innodb_lock_wait_timeout)这两个参数来进行死锁解决。
死锁检测(innodb_deadlock_detect):在MySQL 8.0中,增加了一个新的动态变量innodb_deadlock_detect,用来控制InnoDB是否执行死锁检测。
该参数的默认值为ON,即打开死锁检测。开启后InnoDB在加锁的时候会检测加锁后是否会造成死锁,如果会加锁,就回滚代价最小的那一个事务。
死锁超时时间(innodb_lock_wait_timeout):这个参数可以用来处理检测不出来的死锁,或是避免长时间等待较长的事务的情况。
对于高并发的系统,当大量线程等待同一个锁时,死锁检测可能会导致性能的下降。
此时,如果禁用死锁检测,而改为依靠参数innodb_lock_wait_timeout来释放长时间占用锁资源的事务可能会更加高效。
也就是说,在确认死锁检测功能影响了系统的性能并且禁用死锁检测不会带来负面影响时,可以尝试关闭innodb_deadlock_detect选项。
另外,如果禁用了InnoDB死锁检测,需要及时调整参数innodb_lock_wait_timeout的值,以满足实际的需求。
一文了解MySQL性能测试及调优中的死锁处理方法,你还看不明白?的更多相关文章
- mysql数据库性能调优总结积累
mysql数据库的调优大概可以分为四大块 0 架构调优 ---根据业务 读写分库分表 ---主从 读写分离 1 配置的调优 ---开启缓存查询 设置缓存大小 ---最大连接数设置 ---数据库引 ...
- MySQL 数据库规范--调优篇(终结篇)
前言 这篇是MySQL 数据库规范的最后一篇--调优篇,旨在提供我们发现系统性能变弱.MySQL系统参数调优,SQL脚本出现问题的精准定位与调优方法. 目录 1.MySQL 调优金字塔理论 2.MyS ...
- MySQL 数据库性能调优
MySQL 数据库性能调优 MySQL性能 最大数据量 最大并发数 优化的范围有哪些 存储.主机和操作系统方面: 应用程序方面: 数据库优化方面: 优化维度 数据库优化维度有四个: 优化选择: 数据库 ...
- /*+parallel(t,4)*/在SQL调优中的重要作用!
谈谈HINT /*+parallel(t,4)*/在SQL调优中的重要作用! /*+parallel(t,4)*/在大表查询等操作中能够起到良好的效果,基于并行查询要启动并行进程.分配任务与系统资源. ...
- mysql数据库索引调优
一.mysql索引 1.磁盘文件结构 innodb引擎:frm格式文件存储表结构,ibd格式文件存储索引和数据. MyISAM引擎:frm格式文件存储表结构,MYI格式文件存储索引,MYD格式文件存储 ...
- tomcat 线程数与 mysql 连接数综合调优
目前线上系统包含 数据收集+数据分析+中心服务,三个均为 tomcat,共用一个mysql服务. 由于tomcat最大线程数200 *3 =600,最大并发时,会有600个jdbc连接.当然这是极端情 ...
- 如何进行Java EE性能测试与调优
性能测试的目标 性能测试不同于功能测试,不是对与错的检验,而是快与慢的衡量.在进行真正的性能测试之前要先搞清楚目标: 1. 在确定的硬件条件下,可以支持的并发数越大越好,响应时间越快越好.具体需要达到 ...
- Mysql之explain调优
Explain调优 使用explain语法,对SQL进行解释,根据其结果进行调优: MySQL 表关联的算法是 Nest Loop Join,是通过驱动表的结果集作为循环基础数据,然后一条一条地通过该 ...
- mysql 数据库缓存调优之解决The total number of locks exceeds the lock table size错误
环境: mysql5.6.2 主从同步(备注:需操作主库和从库) 一.InnoDB表执行大批量数据的更新,插入,删除操作时会出现这个问题,需要调整InnoDB全局的innodb_buffer_poo ...
随机推荐
- MySQL-SQL基础-子查询
#子查询-某些情况下,当进行查询的时候,需要的条件是另外一个select语句的结果,这个时候就要用到子查询.用于子查询的关键字主要包括: in.not in.=.!=.exists.not exist ...
- 类的基础语法阅读【Python3.8官网文档】
英文官方文档: https://docs.python.org/3.8/tutorial/classes.html 中文官方文档: https://docs.python.org/zh-cn/3.8/ ...
- Docker之Alpine制作jre镜像(瘦身)+自定义镜像上传阿里云
alpine制作jdk镜像 alpine Linux简介 1.Alpine Linux是一个轻型Linux发行版,它不同于通常的Linux发行版,Alpine采用了musl libc 和 BusyBo ...
- <input type="file">如何实现自定义样式
利用样式覆盖来实现效果:先看下原本和改变后的样式 1 <!doctype html> 2 <html> 3 <head> 4 <title>file自定 ...
- Mybatis log plugin插件破解修复版 MyBatis Log Plugin License Authorization Failed
github地址 - https://github.com/Link-Kou/intellij-mybaitslog
- 将dict.define转化成dict.txt
在使用捷通智能灵云外呼系统V6.1时.需要大量使用到模式码,也就是正则表达式.而老版本365还是使用场景文件. 当要将老版本改编成新版本的时候,需要需要将dict.define文件中的一行行的词条用& ...
- POJ1426——Find The Multiple (简单搜索+取余)
题意: 给一个数n,让你找出一个只有1,0,组成的十进制数,要求是找到的数可以被n整除. 用DFS是搜索 当前位数字 (除最高位固定为1),因为每一位都只有0或1两种选择,换而言之是一个双入口BFS. ...
- Git(1) - Git、Github和Gitlab简介
Git是什么 概念 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. SVN.CVS等,它们是集中式版本控制系统. 集中式和分布式版本控制 ...
- Python测试框架对比----unittest, pytest, nose, robot framework对比
什么是框架? 框架(Framework)是整个或部分系统的可重用设计, 框架是用来解决代码的组织及运行控制问题的. 在我们编写自动化脚本的时候,经常需要读取配置文件,读取数据文件,发送请求,记录日志, ...
- python全局变量的定义
第一:如定义在类或者函数体外,在函数或者类中引用需要用到 global声明 temp_t = "ceshi" def tmp1(): global temp_t temp_t =1 ...