`
王之子
  • 浏览: 109418 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

锁定与等待

 
阅读更多

锁机制是影响查询性能的另一个重要因素。当有多个用户并发访问数据库中某一资源的时候,为了保证并发访问的一致性,数据库必须通过锁机制来协调这些访问。

我们可以认为查询的时间开销主要包括两部分,即查询本身的计算时间和查询开始前的等待时间,所以说索引影响的是前者,而锁机制影响的是后者。

 

减少表锁定等待

MySQL 为 MyISAM 类型表提供了表级别的锁定。MyISAM 的表锁定可以允许多个线程同时读取数据,比如 select 查询,它们之间是不需要锁等待的。但是对于更新操作(如 update 操作),它会排斥对当前表的所有其它查询,包括 select 查询。除此之外,更新操作有着默认的高优先级,这意味着当表锁释放后,更新操作将先获得锁定,然后才轮到读取操作。也就是说,如果有很多 update 操作排着长队,那么对当前表的 select 查询必须等到所有的更新都完成之后才能开始。

 

在一些特定的情况下,慢速查询对于整体性能的影响是非常严重的,举个例子。

 

CREATE TABLE `count_t` ( 
`id` INT NOT NULL AUTO_INCREMENT , 
`count` INT NOT NULL DEFAULT '0' , PRIMARY KEY (`id`)
) ENGINE = MyISAM;

 我们为这个表填充了10万行记录,其中 count 字段为 0 到 999 的随机整数。现在我们需要一个比较慢速的 update 操作,如下所示:



 

接下来,我们编写 PHP 程序用来执行这个 update 操作,然后用 ab 模拟 10 个并发用户来请求这个 PHP 程序,这使得刚才的 update 操作语句会被执行 10 次,目的是让这个数据表忙于长时间的 update 操作。

在启动 ab 后不久,我们马上在 MySQL 命令行中发起一个 select 查询,如下所示:

 

mysql> select * from count_t where id=1;

 

这个查询并没有返回结果,而像是陷入了沉思。这时我们在另一个 MySQL 命令行会话中监视所有的线程状态,因为我们想知道到底发生了什么。 show processlist 的结果如下所示:

 

 

我们看到除了 show processlist 本身的线程之外,还有几个 update 线程和 1 个 select 线程,其中只有一个 update 线程的状态为 Updating ,而其它的几个 update 线程 和 1个 select 线程都处于 Locked 状态,这意味着它们正在等待表锁的释放、

终于,select 查询结束了,结果如下所示:



 

 

行锁定带来了什么

如果你的站点主要依靠用户创造内容,那么频繁的数据更新在所难免,它将会给 select 等读取操作带来很大的影响,这时候可以使用行锁来解决问题,MySQL 在 Innodb 类型表中提供了行锁的支持,将刚才的 count_t 表转为 Innodb 类型。

 

 我们同样用 ab 模拟 10 个并发用户来执行 update 操作,同时我们监视 MySQL 线程,如下所示:



 

可以看到有多个 update 线程在执行,它们的状态都为 updating 。这时候我们在 MySQL 命令行中执行一个 select 查询,如下所示:



 

查询瞬间返回结果,用时 0.00 秒。即便还有多个 update 操作在执行,select 查询还是迅速地获得结果。update 和 select 来自不同的线程,并且针对不同的记录行,所以它们可以轻松地并发进行,这就是行锁真正带给我们的惊喜。

 

行锁定真的好吗?

 

我们再来模拟一个更加接近实际情况的场景,为此,我们用 PHP 编写了以下程序:

 

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "runoob";
 
// 创建链接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查链接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
} 

$sql = "UPDATE `count_t` SET `count`=`count`+1";
$conn->query($sql);

$conn->close();

 这段程序做了两件事情,首先它执行一次慢速的 update 操作,然后执行 10000 次快速的 select 查询。我们用 ab 模拟 20 个并发,每个用户请求一次程序,通过使用 MyISAM 和 Innodb 两种不同类型的锁定机制,我们来分别记录总执行时间。

首先是 MyISAM 类型表,测试结果的关键部分如下所示:



 

 

接下来是 Innodb 类型表,结果如下所示:



 
 使用 Innodb 的行锁定在这里并没有比 MyISAM 的表锁定表现得更好,反而还略有不如。在压力测试的时候,我们通过 show PROCESSLIST 来监视线程状态,当使用 MyISAM 类型表的时候,我们看到除了一个正在 Updating 的 update 线程之外,其它的 update 线程都在 Locked,而使用 Innodb 行锁定的时候,我们看到所有的 update 线程的状态都是 Updating,可为什么它的总时间还不如前者呢 ?

这里我们需要清楚的是,锁定只是一种逻辑层面的约束,即便是同时拥有 Updating 的状态,也不能加速这些 update 操作的总时间,因为磁盘的物理写操作最终还是依次进行的。

  • 大小: 11.1 KB
  • 大小: 112.7 KB
  • 大小: 10.2 KB
  • 大小: 119.9 KB
  • 大小: 9.8 KB
  • 大小: 6.6 KB
  • 大小: 6.9 KB
  • 大小: 7.2 KB
分享到:
评论

相关推荐

    基于微信小程序的在线办公小程序答辩PPT.pptx

    基于微信小程序的在线办公小程序答辩PPT.pptx

    机器学习(预测模型):2000年至2015年期间193个国家的预期寿命和相关健康因素的数据

    这个数据集来自世界卫生组织(WHO),包含了2000年至2015年期间193个国家的预期寿命和相关健康因素的数据。它提供了一个全面的视角,用于分析影响全球人口预期寿命的多种因素。数据集涵盖了从婴儿死亡率、GDP、BMI到免疫接种覆盖率等多个维度,为研究者提供了丰富的信息来探索和预测预期寿命。 该数据集的特点在于其跨国家的比较性,使得研究者能够识别出不同国家之间预期寿命的差异,并分析这些差异背后的原因。数据集包含22个特征列和2938行数据,涉及的变量被分为几个大类:免疫相关因素、死亡因素、经济因素和社会因素。这些数据不仅有助于了解全球健康趋势,还可以辅助制定公共卫生政策和社会福利计划。 数据集的处理包括对缺失值的处理、数据类型转换以及去重等步骤,以确保数据的准确性和可靠性。研究者可以使用这个数据集来探索如教育、健康习惯、生活方式等因素如何影响人们的寿命,以及不同国家的经济发展水平如何与预期寿命相关联。此外,数据集还可以用于预测模型的构建,通过回归分析等统计方法来预测预期寿命。 总的来说,这个数据集是研究全球健康和预期寿命变化的宝贵资源,它不仅提供了历史数据,还为未来的研究和政策制

    基于微信小程序的“健康早知道”微信小程序答辩PPT.pptx

    基于微信小程序的“健康早知道”微信小程序答辩PPT.pptx

    基于微信小程序的电影交流平台答辩PPT.pptx

    基于微信小程序的电影交流平台答辩PPT.pptx

    计算机字符编码GB18030.PDF

    计算机字符编码GB18030

    Hive 操作基础(进阶版)多级分区数据文件2

    Hive 操作基础(进阶版)多级分区数据文件2

    基于java的贫困生管理系统答辩PPT.pptx

    基于java的贫困生管理系统答辩PPT.pptx

    pandas-2.1.4-cp312-cp312-win_amd64.zip

    pandas whl安装包,对应各个python版本和系统(具体看资源名字),找准自己对应的下载即可! 下载后解压出来是已.whl为后缀的安装包,进入终端,直接pip install pandas-xxx.whl即可,非常方便。 再也不用担心pip联网下载网络超时,各种安装不成功的问题。

    TA_Lib轮子无需编译-TA_Lib-0.4.18-cp38-cp38-win32.whl.zip

    TA_lib库(whl轮子),直接pip install安装即可,下载即用,非常方便,各个python版本对应的都有。 使用方法: 1、下载下来解压; 2、确保有python环境,命令行进入终端,cd到whl存放的目录,直接输入pip install TA_lib-xxxx.whl就可以安装,等待安装成功,即可使用! 优点:无需C++环境编译,下载即用,方便

    课设毕设基于SpringBoot+Vue的瑜伽体验课预约系统源码可运行.zip

    本压缩包资源说明,你现在往下拉可以看到压缩包内容目录 我是批量上传的基于SpringBoot+Vue的项目,所以描述都一样;有源码有数据库脚本,系统都是测试过可运行的,看文件名即可区分项目~ |Java|SpringBoot|Vue|前后端分离| 开发语言:Java 框架:SpringBoot,Vue JDK版本:JDK1.8 数据库:MySQL 5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat 开发软件: idea/eclipse(推荐idea) Maven包:Maven3.3.9+ 系统环境:Windows/Mac

    tornado-6.2b2.tar.gz

    tornado-6.2b2.tar.gz

    javawe论坛项目 原生技术

    javawe论坛项目 原生技术

    tornado-6.2b1-cp310-cp310-macosx_10_9_universal2.whl

    tornado-6.2b1-cp310-cp310-macosx_10_9_universal2.whl

    基于司机信用评价的货运管理系统(springboot+vue+mysql+说明文档).zip

    随着物流行业的快速发展,货运管理变得愈发重要。为了提高货运效率,确保货物安全,我们开发了这款基于司机信用评价的货运管理系统。 该系统主要包含了货物信息管理、订单评价管理、货主管理等多个功能模块。在货物信息管理模块中,用户可以查看和管理货物的详细信息,包括货物名称、规格、装车状态、运输状态以及卸货状态等,方便用户随时掌握货物的动态。 订单评价管理模块是该系统的核心之一,它允许货主对司机的服务进行评价,系统会根据评价数据对司机进行信用评分。这一功能不仅有助于提升司机的服务质量,还能为货主提供更加可靠的货运选择。 此外,货主管理模块提供了货主信息的录入、修改和查询等功能,方便用户管理自己的货主资料。系统界面简洁明了,以蓝色为主色调,设计现代且专业,为用户提供了良好的使用体验。 通过该系统,用户可以轻松实现货物信息的查看和管理,对司机的服务进行评价,提高货运效率和服务质量。同时,系统也为司机提供了一个展示自我、提升信用的平台,有助于推动物流行业的健康发展。

    毕业生交流学习平台 SSM毕业设计 附带论文.zip

    毕业生交流学习平台 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B

    基于java的广场舞团答辩PPT.pptx

    基于java的广场舞团答辩PPT.pptx

    基于java的基于SSM的校园音乐平台答辩PPT.pptx

    基于java的基于SSM的校园音乐平台答辩PPT.pptx

    安装包JIRATimeSLA

    Jira插件安装包

    【java毕业设计】基于图像识别与分类的中国蛇类识别系统源码(springboot+vue+mysql+说明文档).zip

    项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse

    tornado-6.2b2-cp37-abi3-win_amd64.whl

    tornado-6.2b2-cp37-abi3-win_amd64.whl

Global site tag (gtag.js) - Google Analytics