当前位置: 首页 > 编程日记 > 正文

mysql减少锁等待_降低锁竞争 减少MySQL用户等待时间

【IT168 技术】通过锁机制,可以实现多线程同时对某个表进行操作。如下图所示,在某个时刻,用户甲、用户乙、用户丙可能会同时或者先后(前面一个作业还没有完成)对数据表A进行查询或者更新的操作。当某个线程涉及到更新操作时,就需要获得独占的访问权。在更新的过程中,所有其它想要访问这个表的线程必须要等到其更新完成为止。此时就会导致锁竞争的问题。从而导致用户等待时间的延长。在这篇文章中,笔者将跟大家讨论,采取哪些措施可以有效的避免锁竞争,减少MySQL用户的等待时间。

629c57960acf15d9c68c5ed72d6bb921.png

背景模拟:

为了更加清楚的说明这个问题,笔者先模拟一个日常的案例。通过案例大家来阅读下面的内容,可能条理会更加的清晰。现在MySQL数据库遇到如上图所示这种情况。

首先,用户甲对数据表A发出了一个查询请求。

然后,用户乙又对数据表A发出了一个更新请求。此时用户乙的请求只有在用户甲的作业完成之后才能够得到执行。

最后,用户丙又对数据表A发出了一个查询请求。在MySQL数据库中,更新语句的优先级要比查询语句的优先级高,为此用户丙的查询语句只有在用户乙的更新作业完成之后才能够执行。而用户乙的更新作业又必须在用户甲的查询语句完成之后才能够执行。此时就存在比较严重的锁竞争问题。

现在数据库工程师所要做的就是在数据库设计与优化过程中,采取哪些措施来降低这种锁竞争的不利情况?

措施一:利用Lock Tables来提高更新速度

对于更新作业来说,在一个锁定中进行许多更新要比所有锁定的更新要来得快。为此如果一个表更新频率比较高,如超市的收银系统,那么可以通过使用Lock Tables选项来提高更新速度。更新的速度提高了,那么与Select查询作业的冲突就会明显减少,锁竞争的现象也能够得到明显的抑制。

措施二:将某个表分为几个表来降低锁竞争

如一个大型的购物超市,如沃尔玛,其销售纪录表每天的更新操作非常的多。此时如果用户在更新的同时,另外有用户需要对其进行查询,显然锁竞争的现象会比较严重。针对这种情况,其实可以人为的将某张表分为几个表。如可以为每一台收银机专门设置一张数据表。如此的话,各台收银机之间用户的操作都是在自己的表中完成,相互之间不会产生干扰。在数据统计分析时,可以通过视图将他们整合成一张表。

措施三:调整某个作业的优先级

默认情况下,在MySQL数据库中,更新操作比Select查询有更高的优先级。如上图所示,如果用户乙先发出了一个查询申请,然后用户丙再发出一个更新请求。当用户甲的查询作业完成之后,系统会先执行谁的请求呢?注意,默认情况下系统并不遵循先来后到的规则,即不会先执行用户乙的查询请求,而是执行用户丙的更新进程。这主要是因为,更新进程比查询进程具有更高的优先级。

但是在有些特定的情况下,可能这种优先级不符合企业的需求。此时数据库管理员需要根据实际情况来调整语句的优先级。如果确实需要的话,那么可以通过以下三种方式来实现。

一是通过LOW_PRIOITY属性。这个属性可以将某个特定的语句的优先级降低。如可以调低某个特定的更新语句或者插入语句的优先级。不过需要注意的是,这个属性只有对特定的语句有用。即其作用域只针对某个特定的语句,而不会对全局造成影响。

二是通过HIGH_PRIOITY属性。与通过LOW_PRIOITY属性对应,有一个HIGH_PRIOITY属性。顾名思义,这个属性可以用来提高某个特定的Select查询语句的优先级。如上面这个案例,在用户丙的查询语句中加入HIGH_PRIOITY属性的话,那么用户甲查询完毕之后,会立即执行用户丙的查询语句。等到用户丙执行完毕之后,才会执行用户乙的更新操作。可见,此时查询语句的优先级得到了提升。这里需要注意,跟上面这个属性一样,这个作用域也只限于特定的查询语句。而不会对没有加这个参数的其他查询语句产生影响。也就是说,其他查询语句如果没有加这个属性,那么其优先级别仍然低于更新进程。

三是通过Set LOW_PRIORIT_UPDATES=1选项。以上两个属性都是针对特定的语句,而不会造成全局的影响。如果现在数据库管理员需要对某个连接来调整优先级别,该如何实现呢?如上例,现在用户需要将用户丙连接的查询语句的优先级别提高,而不是每次查询时都需要使用上面的属性。此时就需要使用Set LOW_PRIORIT_UPDATES=1选项。通过这个选项可以制定具体连接中的所有更新进程都是用比较低的优先级。注意这个选项只针对特定的连接有用。对于其他的连接,就不适用。

四是采用Low_Priority_updates选项。上面谈到的属性,前面两个针对特定的语句,后面一个是针对特定的连接,都不会对整个数据库产生影响。如果现在需要在整个数据库范围之内,降低更新语句的优先级,是否可以实现?如上面这个案例,在不使用其他参数的情况下,就让用户丙的查询语句比用户乙的更新具有更先执行?如果用户有这种需求的话,可以使用Low_Priority_updates选项来启动数据库。采用这个选项启动数据库时,系统会给数据库中所有的更新语句比较低的优先级。此时用户丙的查询语句就会比用户用户乙的更新请求更早的执行。而对于查询作业来说,不存在锁定的情况。为此用户甲的查询请求与用户丙的查询请求可以同时进行。为此通过调整语句执行的优先级,可以有效的降低锁竞争的情况。

可见,可以利用属性或者选项来调整某条语句的优先级。如现在有一个应用,主要供用户来进行查询。更新的操作一般都是有管理员来完成,并且对于用户来说更新的数据并不敏感。此时基于用户优先的原则,可以考虑将查询的优先级别提高。如此的话,对于用户来说,其遇到锁竞争的情况就会比较少,从而可以缩短用户的等待时间。在调整用户优先级时,需要考虑其调整的范围。即只是调整特定的语句、还是调整特定的连接,又或者对整个数据库生效。

措施四:对于混合操作的情况,可以采用特定的选项

有时候会遇到混合操作的作业,如即有更新操作又有插入操作又有查询操作时,要根据特定的情况,采用特定的选项。如现在需要对数据表同时进行插入和删除的作业,此时如果能够使用Insert Delayed选项,将会给用户带来很大的帮助。再如对同一个数据表执行Select和Delete语句会有锁竞争的情况。此时数据库管理员也可以根据实际情况来选择使用Delete Limint选项来解决所遇到速度问题。

通常情况下,锁竞争与死锁不同,并不会对数据库的运行带来很大的影响。只是可能会延长用户的等待时间。如果用户并发访问的机率并不是很高,此时锁竞争的现象就会很少。那么采用上面的这些措施并不会带来多大的收益。相反,如果用户对某个表的并发访问比较多,特别是不同的用户会对表执行查询、更新、删除、插入等混合作业,那么采取上面这些措施可以在很大程度上降低锁冲突,减少用户的等待时间。

相关文章:

UML中的六种关系的比较与学习

通过不断的学习并绘制UML图,整个画图的过程中深刻体会到其核心部分还是理解事物之间的关系,总结六大关系来深入学习,主要关系有六种:继承、实现、依赖、关联、聚合、组合。 区别于联系: 1.继承(泛华&#x…

spark—3(Spark Scheduler)

2019独角兽企业重金招聘Python工程师标准>>> Spark的核心是根据RDD来实现的,Spark Scheduler则为Spark核心实现的重要一环,其作用就是任务调度。Spark的任务调度就是如何组织任务去处理RDD中每个分区的数据,根据RDD的依赖关系构建…

Tomcat手动配置简述【查询留存】

一、设置JAVA的环境变量JAVA_HOME 略 二、设置Tomcat的环境变量 一次性全配置了 Tomcat的根目录,例如【E:\tomcat-6.0.35】 创建下列环境变量: CATALINA_HOME: E:\tomcat-6.0.35 CATALINA_BASE: E:\tomcat-6.0.35 TOMCAT_HOME: E:\tomcat-6.0.35 然后修改…

linux mysql 不稳定_linux,mysql:今天写出一个十分弱智的bug!

今天写出一个十分弱智的bug,记录一下,提醒自己以后别这种犯错,不怕丢人哈~在写一个分页查询记录的sql时,要根据添加的时间逆序分页输出,之前的写法是酱紫:selectrecord.a, y.c from ( selecta,b from xorde…

IOS XML解析

<?xml version "1.0" encoding "utf-8"?> <video>小黄人</video> <video></video> <video/> <videos> <video> </video> </videos> 不能相互嵌套。 xml中的所有空格和空行都会当成字符来…

BAT架构师分享之:大型网站技术架构

早期的网站为了节省成本一般会设计成集中式系统&#xff0c;应用程序、数据库等都部署在一台服务器上。 但随着业务的快速度发展&#xff0c;逐渐出现瓶颈&#xff0c;按一定原则**&#xff08;应用拆分、服务拆分、数据拆分、应用解耦&#xff09;**&#xff0c;向分布式系统转…

mysql isreg_`Innodb` MySQL中如何优雅的删除大表跑路

最近很想写写MySQL相关的内容&#xff0c;就从这个话题出发吧有人说删MySQL表谁不会不就是drop table TABLENAME如果在生产环境中&#xff0c;你对一张TB级别的大表&#xff0c;敲下这行命令那么你的主管&#xff0c;大主管&#xff0c;隔壁的大主管 就会气势汹汹的冲向你其原因…

常用正则表达式集锦

链接地址&#xff1a;http://blog.csdn.net/tjcyjd/article/details/48416405 验证数字&#xff1a;^[0-9]*$验证n位的数字&#xff1a;^\d{n}$验证至少n位数字&#xff1a;^\d{n,}$验证m-n位的数字&#xff1a;^\d{m,n}$验证零和非零开头的数字&#xff1a;^(0|[1-9][0-9]*)$验…

C(第一个C程序) 和 C++ (第一个C++程序)对比碰撞

个人博客首页&#xff08;点击查看详情&#xff09; -- https://blog.51cto.com/11495268 1、简介 C 是对 C 的继承、扩展&#xff0c;但从语言角度来说&#xff0c;这是 两种变成语言&#xff0c;就一定存在不同&#xff0c;本文 就借助于 C、C 的 最精简标准程序 进行对比…

java的byte与C#的异同引起的字符处理问题。

java的byte是有符号类型(java就没有无符号类型的数据)&#xff0c;值域&#xff1a;-0128~127 c#的byte是无符号类型数值&#xff0c;值域&#xff1a;0~255 这在依赖字符编码处理程序中&#xff0c;两者源代码就不能通用了。 知道原因结局办法就容易多了。 1.使用&与运算 …

exec不同文件l怎么汇总_ABAQUS常见问题汇总 - 2.0版.doc

您所在位置&#xff1a;网站首页 > 海量文档&nbsp>&nbsp计算机&nbsp>&nbspC/C资料ABAQUS常见问题汇总 - 2.0版.doc154页本文档一共被下载&#xff1a;次,您可全文免费在线阅读后下载本文档。下载提示1.本站不保证该用户上传的文档完整性&#xff0c…

1月12号 UIView

UIView 1.为什么要UIView .可以用UIView作为容器&#xff0c;存放子视图 .管理事件UIEvent 2.ios坐标系 以左上角为坐标原点&#xff0c;向右边是x的正方向&#xff0c;向下是y的正向方 bounds: 相对于视图本身而言&#xff08;0&#xff0c;0&#xff0c;w, h&#xff09; fra…

小虎计算器-技术支持

2019独角兽企业重金招聘Python工程师标准>>> 最简单的计算器&#xff0c;包含历史记录 转载于:https://my.oschina.net/u/1405818/blog/3050764

jquery即时搜索查询插件jquery.search.js

jquery.search.js搜索插件是一款基于jquery的插件,任何一个input输入款均可即时转为查询框,可分为前台数据直接显示和后台传输数据显示两种方案! 文档说明:http://www.sameus.com 代码下载地址: http://code.google.com/p/17sameus/downloads/list 使用方式 jquery.search.js插…

node mysql 批量写入_请问如何使用node.js在MySQL中进行批量插入

catspeake我四处寻找关于批量插入对象的答案。Ragnar123的回答使我得出了这样的结论&#xff1a;function bulkInsert(connection, table, objectArray, callback) {let keys Object.keys(objectArray[0]);let values objectArray.map( obj > keys.map( key > obj[key]…

win10 UWP 应用设置

win10 UWP 应用设置 简单的把设置需要的&#xff0c;放到微软自带的LocalSettings LocalSettings.Values可以存放几乎所有数据 如果需要存放复合数据&#xff0c;一个设置项是由多个值组成&#xff0c;可以使用ApplicationDataCompositeValue将多个合并。 存放一个string strin…

通过loganalyzer展示数据库中的日志

目的&#xff1a;通过loganalyzer展示数据库中的日志 准备环境&#xff1a; CentOS7_1&#xff1a;用来生成日志 CentOS7_2&#xff1a;用来存放日志的数据库 CentOS7_3&#xff1a;LAP服务器 第一步&#xff1a;在CentOS7_2安装mysql数据库 此处使用二进制安装mariadb…

libmemcached 1.0.11 发布

libmemcached 1.0.11 删除了 memcached 的定制版本&#xff0c;更新了硬化(hardening)规则&#xff0c;修复了 socket 连接返回错误的问题。 libmemcached是C客户端到memcached服 务器的接口库。具有低内存占用率、线程安全、并提供对memcached功能的全面支持。它还采用多种命令…

python描述器做权限控制_Python装饰器14-描述器

描述器这是Python一个重要的概念,英文名&#xff1a;Descriptordescriptor是对象的一个属性&#xff0c;只不过它存在于类的dict中并且有特殊方法get(可能还有set和__delete)而具有一点特别的功能&#xff0c;为了方便指代这样的属性&#xff0c;我们给它起了个名字叫descripto…

数据结构(1)有序表查找

有序表查找 /* 主函数 */public class OrderTableSearch {public static void main(String[] args) {int [] a {0,1,16,24,35,47,59,62,73,88,99}; System.out.println(FibonacciSearch(a, 10, 88));System.out.println(InsertKeySearch(a, 10, 88));System.out.println(Bina…

Java实现MD5(32/16位大小写)加密

MD5简单介绍 大家都知道&#xff0c;地球上任何人都有自己独一无二的指纹&#xff0c;这常常成为公安机关鉴别罪犯身份最值得信赖的方法&#xff1b;与之类似&#xff0c;MD5就可以为任何文件&#xff08;不管其大小、格式、数量&#xff09;产生一个同样独一无二的“数字指纹”…

OD使用教程6 - 调试篇06|解密系列

OD使用教程6 - 调试篇06 让编程改变世界 Change the world by program 这一讲开始&#xff0c;小甲鱼带大家接触真正程序的逆向。其实也没啥大不了的&#xff0c;也就是对之前所学的知识进行巩固和加强。 不过&#xff0c;在每一节课中&#xff0c;小甲鱼都会教给大家不同的新…

宝塔面板 mysql装不上_宝塔面板强制安装mysql8.0

释放双眼&#xff0c;带上耳机&#xff0c;听听看~&#xff01;mysql终于更新到8.0&#xff0c;mysql8.0对比以往的版本有了很大的提升&#xff0c;但是要求的服务器配置也就变得越来越高。对于低配置服务器&#xff0c;在宝塔面板进行安装时&#xff0c;总会出现“至少需要2个…

android studio 怎么运行java

方法/步骤 1、新建一个project&#xff0c;或者如果已经有project的话&#xff0c;那就直接新建一个module.注意选择Java library&#xff0c;然后下一步 2、输入module的一些信息。点击finish 3、在左侧找到build.gradle&#xff0c;双击打开&#xff0c;参照图中修改一下配置…

运行PHP出现No input file specified错误解决办法

配置了一台新服务器&#xff0c;使用的是IIS Fastcgi PHP 5.3.X&#xff0c;访问php页面的时候就会报错“No input file specified” 在php.ini文件里面修改&#xff1a; 1、增加一行&#xff08;这个最重要&#xff09; fastcgi.impersonate 1 2、修改两项&#xff08;解开…

Microsoft Security Essentials 4.1.522.0 RTM

简单说一下新版本的新功能&#xff0c;其中最强的是云端修复系统受损或病毒感染文件功能、重新编写的网络检查系统防御病毒入侵、新增自我保护&#xff0c;后台监控主进程无法用任务管理器结束。 Microsoft Security Essentials 是 Microsoft 提供的免费杀毒下载软件&#xff0…

wincc vbs mysql_Wincc VBS操作txt及SQL2005

系统:Win7 32Bits 旗舰版wincc: 7.0 sp3英文版Dim strConnectionStringDim objConnectionDim objCommandDim strSQLDim RsDim sdayDim smonthDim edayDim emonthDim str1Dim str2Dim tempDim sqlwhereDim msgDim CDG, WSH, FilePathDim fso, fo, slDim read_tempDim OrderFileN…

[Python]网络打解包

Python与C、C交互的时候&#xff0c;如果进行网络消息的收发&#xff0c;需要讲数据打包解包为字节流。 这时候就会用到Struct模块中的pack、unpack函数 打包&#xff1a; PKG # ! means network byte#PkgHeadPKG pack(!i, 0x54434d) #intPKG pack(!H, 4) #us…

TiKV 成功晋级 CNCF 孵化项目

今天&#xff0c;CNCF&#xff08;Cloud Native Computing Foundation&#xff0c;云原生计算基金会&#xff09;技术监督委员会&#xff08;TOC&#xff09;宣布已经投票决议通过&#xff0c;正式将 TiKV 从沙箱项目晋级至孵化项目。 TiKV 是一个开源的分布式事务 Key-Value 数…

平均符号熵的计算公式_交叉熵(Cross Entropy)从原理到代码解读

交叉熵(Cross Entropy)是Shannon(香浓)信息论中的一个概念&#xff0c;在深度学习领域中解决分类问题时常用它作为损失函数。原理部分&#xff1a;要想搞懂交叉熵需要先清楚一些概念&#xff0c;顺序如下&#xff1a;1.自信息量—>2.信息熵(熵)—>3.相对熵(KL散度)—>…