`
shootyou
  • 浏览: 84443 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

转帖:MySQL锁表机制分析

阅读更多

为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制。
一、概述
MySQL有三种锁的级别:页级、表级、行级。
MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level
locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。

MySQL这3种锁的特性可大致归纳如下:

  1. 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
  2. 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
  3. 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

二、MyISAM表锁
MyISAM存储引擎只支持表锁,是现在用得最多的存储引擎。

查询表级锁争用情况
可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺:

mysql>;showstatuslike‘table%;
+———————–+———-+
|Variable_name|Value|
+———————–+———-+
|Table_locks_immediate|76939364|
|Table_locks_waited|305089|
+———————–+———-+
2rowsinset(0.00sec)

Table_locks_waited的值比较高,说明存在着较严重的表级锁争用情况。

2. MySQL表级锁的锁模式
MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table WriteLock)。MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、 INSERT等)前,会自动给涉及的表加写锁。所以对MyISAM表进行操作,会有以下情况:

  1. a、对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
  2. b、对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。

下面通过例子来进行验证以上观点。数据表gz_phone里有二百多万数据,字段id,phone,ua,day。现在同时用多个客户端同时对该表进行操作分析。

1. a、当我用客户端1进行一个比较长时间的读操作时,分别用客户端2进行读和写操作:

client1:
mysql>select count(*) from gz_phone group by ua;
75508 rows in set (3 min 15.87 sec) client2:
select id,phone from gz_phone limit 1000,10;
+——+——-+
| id | phone |
+——+——-+
| 1001 | 2222 |
| 1002 | 2222 |
| 1003 | 2222 |
| 1004 | 2222 |
| 1005 | 2222 |
| 1006 | 2222 |
| 1007 | 2222 |
| 1008 | 2222 |
| 1009 | 2222 |
| 1010 | 2222 |
+——+——-+
10 rows in set (0.01 sec)
mysql> update gz_phone set phone=’11111111111′ where id=1001;
Query OK, 0 rows affected (2 min 57.88 sec)
Rows matched: 1 Changed: 0 Warnings: 0

说明当数据表有一个读锁时,其它进程的查询操作可以马上执行,但更新操作需等待读锁释放后才会执行。

 

2. b、当用客户端1进行一个较长时间的更新操作时,用客户端2,3分别进行读写操作:
client1:
mysql> update gz_phone set phone=’11111111111′;
Query OK, 1671823 rows affected (3 min 4.03 sec)
Rows matched: 2212070 Changed: 1671823 Warnings: 0 client2:
mysql> select id,phone,ua,day from gz_phone limit 10;
+—-+——-+——————-+————+
| id | phone | ua | day |
+—-+——-+——————-+————+
| 1 | 2222 | SonyEricssonK310c | 2007-12-19 |
| 2 | 2222 | SonyEricssonK750c | 2007-12-19 |
| 3 | 2222 | MAUI WAP Browser | 2007-12-19 |
| 4 | 2222 | Nokia3108 | 2007-12-19 |
| 5 | 2222 | LENOVO-I750 | 2007-12-19 |
| 6 | 2222 | BIRD_D636 | 2007-12-19 |
| 7 | 2222 | SonyEricssonS500c | 2007-12-19 |
| 8 | 2222 | SAMSUNG-SGH-E258 | 2007-12-19 |
| 9 | 2222 | NokiaN73-1 | 2007-12-19 |
| 10 | 2222 | Nokia2610 | 2007-12-19 |
+—-+——-+——————-+————+
10 rows in set (2 min 58.56 sec) client3:
mysql> update gz_phone set phone=’55555′ where id=1;
Query OK, 1 row affected (3 min 50.16 sec)
Rows matched: 1 Changed: 1 Warnings: 0

说明当数据表有一个写锁时,其它进程的读写操作都需等待读锁释放后才会执行。

3、并发插入
原则上数据表有一个读锁时,其它进程无法对此表进行更新操作,但在一定条件下,MyISAM表也支持查询和插入操作的并发进行。
MyISAM存储引擎有一个系统变量concurrent_insert,专门用以控制其并发插入的行为,其值分别可以为0、1或2。

1. a、当concurrent_insert设置为0时,不允许并发插入。
2. b、当concurrent_insert设置为1时,如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个进程读表的同时,另一个进程从表尾插入记录。这也是MySQL的默认设置。
3. c、当concurrent_insert设置为2时,无论MyISAM表中有没有空洞,都允许在表尾并发插入记录。

4、MyISAM的锁调度
由于MySQL认为写请求一般比读请求要重要,所以如果有读写请求同时进行的话,MYSQL将会优先执行写操作。这样MyISAM表在进行大量的更新操作时(特别是更新的字段中存在索引的情况下),会造成查询操作很难获得读锁,从而导致查询阻塞。
我们可以通过一些设置来调节MyISAM的调度行为:

1. a、通过指定启动参数low-priority-updates,使MyISAM引擎默认给予读请求以优先的权利。
2. b、通过执行命令SET LOW_PRIORITY_UPDATES=1,使该连接发出的更新请求优先级降低。
3. c、通过指定INSERT、UPDATE、DELETE语句的LOW_PRIORITY属性,降低该语句的优先级。

上面3种方法都是要么更新优先,要么查询优先的方法。这里要说明的就是,不要盲目的给mysql设置为读优先,因为一些需要长时间运行的查询操作,也会使写进程“饿死”。只有根据你的实际情况,来决定设置哪种操作优先。这些方法还是没有从根本上同时解决查询和更新的问题。
在一个有大数据量高并发表的mysql里,我们还可采用另一种策略来进行优化,那就是通过mysql主从(读写)分离来实现负载均衡,这样可避免优先哪一种操作从而可能导致另一种操作的堵塞。下面将用一个篇幅来说明mysql的读写分离技术。

转自:http://hi.baidu.com/webv/blog/item/cb9dbf64f011b0e0f73654bb.html

分享到:
评论

相关推荐

    转帖:液晶显示器原理与维修手册

    - **信号接口电路分析**: GM2121作为信号接口的核心,负责A/D转换和像素时钟产生等功能。 - **关键部件检测**: 重点检查A/D转换器、LCD控制器、PLL等关键部件的工作状态。 - **故障诊断**: 根据电路原理和实际故障...

    转帖:Android应用的自动升级、更新模块的实现docx.docx

    6. **处理异常**: 检查和下载过程中可能出现的网络错误、存储空间不足等问题需要有合适的错误处理和反馈机制。 **三、具体实现** 1. **版本检查接口**: 设计一个HTTP接口或提供一个版本信息文件,如`...

    转帖:我的职场十年,IT人很值得借鉴呀

    综上所述,通过对“我的职场十年”这篇文章内容的分析,我们可以看到IT行业不仅要求从业者具备扎实的专业技能,还需要具备良好的沟通能力、领导力以及持续学习的态度等综合素质。同时,在这个充满挑战与机遇的领域里...

    mysql5.5.28.zip

    在MySQL 3.23中使用新MyISAM最大的表大小可达8百万 TB(2^63个字节);多种语言支持,但不支持中文。 然而,为了实现快速、健壮和易用的目的,MySQL必须牺牲一部分灵活而强大的功能,如子查询、存储过程与触发器、...

    论坛转帖工具.rar

    标题中的“论坛转帖工具.rar”表明这是一个用于在论坛之间转移帖子的软件工具,通常用于帮助用户方便地将一个论坛的帖子内容复制到另一个论坛,可能是为了分享信息、讨论或保存重要的帖子。这类工具可能包括自动抓取...

    转帖--oracle分析函数+PLSQL小结

    Oracle分析函数是数据库查询中的一个强大工具,它们在处理数据集时提供了高级的聚合功能,可以对一组行进行计算,并返回单个值或一组值。分析函数与聚合函数(如SUM, AVG, COUNT等)类似,但有显著的区别:聚合函数...

    编辑人员转帖去水印工具

    本篇文章将详细探讨“编辑人员转帖去水印工具”,并介绍如何使用名为Teorex Inpaint的1.0.0.2版本的软件来实现这一目标。 首先,我们要理解什么是水印。水印通常是指在图像或视频中添加的半透明标记,它可以是文字...

    UBB论坛转帖圣手.exe

    UBB论坛转帖圣手.exeUBB论坛转帖圣手.exe

    discuz X2转帖工具、采集工具

    3. 数据分析:通过批量发布和转帖,可以进行用户行为分析,了解哪种类型的内容更受论坛用户欢迎。 综上所述,“Discuz! X2转帖工具、采集工具”是提升Discuz! X2论坛运营效率的有效辅助手段,但使用时需谨慎,确保...

    贴吧转帖工具

    【贴吧转帖工具】是一种专为百度贴吧用户设计的便捷工具,主要用于提高用户在贴吧中的互动效率。通过这款工具,用户可以实现一键转帖和一键8经验签到的功能,极大地简化了传统操作流程,节省了用户的时间,提升了...

    winform复杂表头导出打印 (转帖)

    原文转自:http://topic.csdn.net/u/20100609/08/7f5b90b1-724a-46ce-a8c7-cba778ab2e02.html 所见即所得的 打印,导出excel,复杂表头,列合并等功能,附全部源码即样例

    运放参数的详细解释和分析-转帖TI工作人员的资料(doc版)

    在TI论坛看到的帖子,感觉挺好,就整理成word文档了,内容主要是运放datasheet常见参数的解释和分析。TI原帖地址“http://www.deyisupport.com/question_answer/analog/amplifiers/f/52/t/20214.aspx”。感谢原作者...

    聊天机器人的小例子

    转帖:本项目是一个聊天机器人的小例子,使用的图灵(www.tuling123.com)提供的聊天api,javaapk之前也发布过一个聊天机器人http://www.javaapk.com/source/1488.html,现在的问答机器人只能分析关键字做一个简单的...

    [转帖]世界编程大赛第一名写的程序

    练习心理调节技巧,如深呼吸、正念冥想,以及制定详尽的比赛策略和时间表,可以帮助参赛者在比赛中保持最佳状态。 综上所述,“世界编程大赛第一名写的程序”不仅仅是代码的展示,更是编程艺术、工程实践和竞争智慧...

    2008高教社杯全国大学生数学建模竞赛B题讨论专贴-高等教育学费价格市场模型分析.pdf

    2008年高教社杯数学建模比赛B题讨论转帖: 本帖规则: 1:我们论坛会适当公布一些步骤,公式等 2:可以在本帖提问,讨论。 2:请勿在本帖灌水,已经发现,删除会员资格。 B题题目介绍: 2008高教社...

    2008高教社杯全国大学生数学建模竞赛B题讨论专贴-高等教育收费的定价模型与实证分析.pdf

    2008年高教社杯数学建模比赛B题讨论转帖: 本帖规则: 1:我们论坛会适当公布一些步骤,公式等 2:可以在本帖提问,讨论。 2:请勿在本帖灌水,已经发现,删除会员资格。 B题题目介绍: 2008高教社...

    2008高教社杯全国大学生数学建模竞赛B题讨论专贴-高校教育收费问题的微分方程模型与宏观调控分析.pdf

    2008年高教社杯数学建模比赛B题讨论转帖: 本帖规则: 1:我们论坛会适当公布一些步骤,公式等 2:可以在本帖提问,讨论。 2:请勿在本帖灌水,已经发现,删除会员资格。 B题题目介绍: 2008高教社...

    转帖工具插件 for PHPwind 7.5 正式版.rar

    "转帖工具插件 for PHPwind 7.5 正式版" 是专门为 PHPwind 7.5 版本设计的一个功能插件,旨在提供便捷的帖子转移功能,帮助管理员或者用户将内容从一个地方轻松移动到另一个地方,而无需直接编辑论坛的原始文件。...

    博客需求分析文档

    博客需求分析文档旨在详细阐述构建一个博客平台所需的各种功能和特性,以满足不同用户群体的需求。以下是基于给定内容的详细知识点: 1. **博客的本质和核心**: - **本质**:博客是一种技术手段,让人们在网上...

Global site tag (gtag.js) - Google Analytics