`
王之子
  • 浏览: 109793 次
  • 性别: 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
分享到:
评论

相关推荐

    揭秘英特尔® Parallel Amplifier

    这款工具提供了三种主要的分析类型:热点分析、并发性分析和锁定与等待分析,帮助开发者深入理解程序的运行机制并找出性能瓶颈。 1. **热点分析**: 热点分析是基础级别的性能评估,它关注的是程序中消耗时间最多...

    C#锁定程序项目winform锁定界面

    - 锁定界面是一种安全措施,它允许用户在离开计算机或不再与程序交互时暂停程序的操作,直到输入正确的解锁密码或通过其他验证方式。这可以防止他人无意或有意地更改程序状态或访问敏感信息。 2. **两种锁定方式**...

    mysql数据库性能优化

    减少表锁定等待 - **问题分析**:由于MySQL的MyISAM表类型采用表锁定机制,当表被锁定时,所有对该表的操作都会受到影响。 - **解决方案**: - 尽量减少更新操作,尤其是在高峰期。 - 使用InnoDB表类型,因为它...

    构建高性能Web站点_PDF_45.5M

    11.3 锁定与等待 11.4 事务性表的性能 11.5 使用查询缓存 11.6 临时表 11.7 线程池 11.8 反范式化设计 11.9 放弃关系型数据库 第12章 Web负载均衡 12.1 一些思考 12.2 HTTP重定向 12.3 DNS负载均衡 12.4 ...

    构建高性能Web站点(PDF)

    11.3 锁定与等待 11.4 事务性表的性能 11.5 使用查询缓存 11.6 临时表 11.7 线程池 11.8 反范式化设计 11.9 放弃关系型数据库 第12章 Web负载均衡 12.1 一些思考 12.2 HTTP重定向 12.3 DNS负载均衡 12.4...

    构建高性能Web站点(PDF)-第2部分

    11.3 锁定与等待 11.4 事务性表的性能 11.5 使用查询缓存 11.6 临时表 11.7 线程池 11.8 反范式化设计 11.9 放弃关系型数据库 第12章 Web负载均衡 12.1 一些思考 12.2 HTTP重定向 12.3 DNS负载均衡 12.4...

    IE主页锁定工具V1.0

    IE主页设置工具V1.0 软件功能:锁定主页、解除锁定、清理...使用“清理缓存”功能,需耐心等待一段时间,完成后有提示窗出现。  4.程序开发wszjf,可随意传播,翻版不究。"  5.问题和建议请mail:wssgzjf@163.com。

    C# 系统无操作自动锁定程序

    最后,为了让用户体验更好,我们可以添加一些设置选项,让用户自定义锁定等待时间,或者是否开启此功能等。 总结,通过学习和实践这个"C# 系统无操作自动锁定程序"项目,开发者可以提升C# WinFrom应用开发技能,...

    s7-300plc同步与锁定程序.rar

    《S7-300 PLC同步与锁定程序详解》 西门子S7-300 PLC(可编程逻辑控制器)是工业自动化领域广泛应用的一种控制设备,尤其在复杂的控制系统中,其同步与锁定机制显得尤为重要。本文将深入探讨S7-300 PLC的同步与锁定...

    MySQL 数据库锁定机制

    ### MySQL 数据库锁定机制 #### 一、概览 MySQL 数据库锁定机制是数据库系统中一项重要的技术,用于处理多用户并发访问同一份数据时可能产生的冲突问题。MySQL 支持多种类型的锁定机制,包括行级锁定、表级锁定...

    解锁WINRAR锁定的压缩文件.txt

    4. **验证解锁结果**:等待新文件创建完成后,尝试打开并修改其中的内容,确认文件是否已经成功解锁。 #### 注意事项 - 在操作过程中,请确保备份原始文件,以免在操作过程中丢失重要数据。 - 使用第三方工具时需...

    屏幕锁定程序

    在屏幕锁定程序中,INI文件可能被用来保存用户的设置,如锁定等待时间、密码等相关参数。读取INI文件可以获取用户定制的设置,而写入INI文件则可以更新或保存新的配置。使用`GetPrivateProfileString`和`...

    系统锁定专家

    【系统锁定专家】是一款专为用户设计的高效安全的系统锁定软件。该工具的主要功能是保护用户的计算机系统,确保在未经许可的情况下无法访问个人数据和系统设置。通过设定一个密码,用户可以轻松地锁定自己的电脑,...

    记录被另一个用户锁定.txt

    这种情况下,如果一个用户的事务已经锁定了某些记录,而其他用户试图修改这些记录,则后者将不得不等待,直到前者的事务完成或回滚。本文将详细介绍Oracle记录被另一个用户锁定的现象、原因以及相应的解决方法。 ##...

    基于vb键盘锁定源程序

    3. **控制逻辑**:可能需要一个或多个条件来决定何时启用或禁用键盘锁定,这些条件可能与时间、用户交互或其他系统状态有关。 4. **界面提示**:为了用户体验,通常会有一个可视化的提示,告知用户键盘已被锁定,...

    定时关闭显示器、锁定计算机

    4. 接着,在“等待”选项中输入希望电脑在多长时间无操作后启动屏保。 5. 屏保启动后,通常需要密码才能解锁,这起到了锁定计算机的作用。 除了系统内置的设置,还可以利用第三方软件来实现更精确的定时锁定。例如...

    BLOG_Oracle_lhr_ 【等待事件】等待事件系列(5.1)--Enqueue(队列等待) .pdf

    - **enq:MR锁**:多行资源锁定等待,通常出现在对表中的多行进行操作时。 - **enq:DX-contention**:涉及数据对象的独占锁定竞争。 - **enq:SQ-contention**:序列对象的等待,常见于序列值的获取过程中。 ##### ...

    SQL Server数据库表锁定原理以及如何解除表的锁定.doc

    5. **死锁**:当两个事务互相等待对方释放资源时,就会发生死锁。SQL Server通过死锁检测和恢复机制来解决这个问题,它可以检测到死锁并选择一个事务进行回滚。 **解除表锁定的方法:** 1. **手动解锁**:使用`...

Global site tag (gtag.js) - Google Analytics