`
snoopy7713
  • 浏览: 1140253 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

MYSQL 并发访问问题(减少用户等待时间)

阅读更多

MYSQL 并发访问问题(减少用户等待时间)


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

  

 

  背景模拟:

  为了更加清楚的说明这个问题,笔者先模拟一个日常的案例。通过案例大家来阅读下面的内容,可能条理会更加的清晰。现在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选项来解决所遇到速度问题。

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

 

注以上信息来至于: http://www.php100.com/html/webkaifa/database/Mysql/2011/0307/7672.html

分享到:
评论

相关推荐

    易语言MySql高并发操作模块源码 效率很高

    【MySQL高并发操作模块源码】是一个专门设计用于处理大量并发请求的软件组件,它能够高效地处理数据库的读写操作。在高并发环境中,系统的性能往往受到数据库操作的限制,因为数据库是系统中的瓶颈。这个模块的目标...

    11 并发访问控制_theory_MYSQL_

    并发访问控制是数据库系统中的核心概念,特别是在多用户环境下,保证数据的一致性和完整性至关重要。在MySQL这样的关系型数据库管理系统中,并发控制机制确保了多个事务可以同时进行,而不会导致数据的不一致。本节...

    分析MySQL并发下的问题及解决方法

    MySQL并发下的问题主要涉及到数据库在处理多个用户同时访问时的数据一致性与并发性能。并发问题的解决方案通常涉及到锁机制和事务管理。以下是对并发问题及解决方法的详细分析: 1. **表锁导致的慢查询问题** 在...

    MySQL锁竞争避免机制探析.pdf

    通过上述策略,数据库管理员可以有效地避免或缓解MySQL中的锁竞争问题,优化系统性能,减少用户等待时间,从而提升整体服务质量和用户体验。在实际应用中,应根据系统的具体情况进行选择和调整,以达到最佳的并发...

    JavaWeb并发编程与高并发解决方案.docx

    它位于CPU与主内存之间,目的是提高数据访问速度,减少等待时间。CPU缓存按照层级可以分为L1、L2和L3缓存,其中L1缓存速度最快但容量最小,L3缓存则相反。 - **时间局限性**:如果某个数据被访问,那么在不久的将来...

    mysql 5.1.51

    在5.1.51中,InnoDB可能进行了优化,提高了并发处理能力,减少了锁等待时间。 3. **安装过程**:`mysql-essential-5.1.51-win32.msi` 文件是MySQL 5.1.51的安装程序,用于在Windows 32位系统上安装数据库服务器、...

    mysql怎么减少行锁对性能的影响

    - **优化SQL查询**:针对订单查询的需求,可以建立适当的索引(例如,在user_id和product_id上建立联合索引),以减少查询时的行锁等待时间。 - **事务管理**:在处理订单时,确保事务尽可能短,比如将订单创建和...

    mysql死锁的一些案例

    - 避免长时间持有锁:尽快完成事务操作,减少其他事务等待时间。 4. **load file异常**: 此压缩包中提及的"load file异常"可能是指在使用`LOAD DATA INFILE`语句导入数据时遇到的问题。这个SQL命令用于快速从...

    MySQL安装步骤和方法

    - **连接超时**:增加最大连接数或优化网络设置,减少连接等待时间。 - **性能问题**:调整MySQL的缓存和缓冲区大小,优化查询语句,使用索引提高数据检索速度。 通过上述步骤,您可以顺利完成MySQL的安装与基本...

    Mysql安装错误代码对照

    - **增加等待时间**:通过调整MySQL配置文件来增加等待时间。 - **优化查询**:减少查询中的锁定需求。 #### 1211 错误:外键约束检查失败 错误1211表示在尝试插入或更新记录时,违反了外键约束。解决方法包括: - ...

    MYSQL锁机制全揭秘

    在数据库操作中,保证数据并发访问时的一致性、有效性是至关重要的,锁机制正是为此而生。 MySQL支持不同存储引擎采用不同的锁机制,常见的有表级锁、行级锁和页面锁。其中表级锁适用于查询为主的应用,如Web应用;...

    mysql5.7.22安装包

    4. 死锁检测和处理:更快地检测和解决死锁问题,减少应用程序的等待时间。 通过了解并掌握这些关键知识点,你将能够更好地利用 MySQL 5.7.22 来构建高效、安全的数据库解决方案。在实际应用中,还应关注日志管理、...

    高并发的抢购功能

    这种方法虽然能有效防止超卖,但可能会导致较高的锁等待时间,从而影响系统性能。 4. **利用MySQL的事务处理**:通过使用MySQL的事务特性,可以在进行库存扣减操作时锁定对应的行,确保在同一时刻只有一个事务能够...

    MYSQL锁机制

    - **提高效率**:通过合理的锁策略减少等待时间,从而提高整体系统的运行效率。 #### 三、MySQL锁的种类及特性 MySQL中主要有三种类型的锁:表级锁、行级锁和页面锁。 ##### 表级锁 - **特点**:开销较小,加锁...

    MySQL配置文件解析

    MySQL配置文件解析主要涉及到MySQL服务器的参数调整,...这些参数的优化需根据实际应用环境进行调整,包括网站的访问量、在线用户数、数据量、硬件资源等。优化是一个持续的过程,需要不断监控和测试以找到最佳配置。

    三份数据库并发处理方案

    数据库并发处理是数据库系统中的重要概念,特别是在多用户环境下,多个事务同时访问和修改数据库时,如何保证数据的一致性、完整性和隔离性是至关重要的。本方案将深入探讨并发控制技术,确保在高并发场景下数据库的...

    mysql数据库性能优化

    - **概念**:锁机制用于控制并发访问,确保数据的一致性和完整性。 - **类型**: - 表锁定:锁定整个表,适用于简单的应用场景。 - 行锁定:只锁定受影响的行,适用于复杂的并发环境。 ##### 2. 减少表锁定等待 ...

    高并发Web网站构建和安全防护

    在早期,简单的HTML页面已经能够满足大多数用户的浏览需求,但随着网页复杂度的提升,如社交网络、在线视频等富媒体内容的出现,单一服务器已难以应对大规模并发访问。因此,如何构建能够高效处理大量并发请求的Web...

Global site tag (gtag.js) - Google Analytics