mysql5.7官网直译锁操作优化--内部锁的方法介绍

48 篇文章 0 订阅
8.11 Optimizing Locking Operations 锁操作的优化


8.11.1 Internal Locking Methods 内部锁定的方法
8.11.2 Table Locking Issues 表锁的问题
8.11.3 Concurrent Inserts 并发插入
8.11.4 Metadata Locking 元数据锁
8.11.5 External Locking 外部锁
mysql对于表中内容的竞争通过使用锁来管理:
>内部锁在mysql服务器内部执行用来管理多线程对表内容的竞争。这类型的锁之所以被称为内部是因为它完全在服务器内部,不涉及任何其他程序。请看8.11.1的内部锁方法。
>外部锁会发生,当服务器和其他程序锁MyISAM表文件从而合作达到程序可以访问表。具体请看8.11.5的外部锁。
------------------------------------------
8.11.1 Internal Locking Methods 内部锁方法
这部分讨论内部锁;也就是说,mysql服务器自己通过锁来管理多个session对表内容的竞争管理。
这类型的锁完全有服务器自己来完成,不需要任何外部程序所以叫内部锁。关于其他程序在mysql文件中执行的锁,请看8.11.5的外部锁。
>Row-Level Locking 行级锁
>Table-Level Locking 表级锁
>Choosing the Type of Locking 选择表类型
行级锁
mysql使用行级锁在InnoDB表上支持多个session对表的同时写,使得它们适用于多用户,高并发和OLTP应用。
为了当多个写操作并发完成在一个单一InnoDB表上且不产生死锁,要求锁必须在事物开始之前加上如查询SELECT .... FOR UPDATE 语句对每一个行组可能被修改的,即使修改数据语句在事物之后。如果事物修改或者锁不只一张表,每一个事物中都以相同的顺序来发布合适的语句。死锁会影响性能,但不会有严重错误,因为InnoDB自动发现死锁条件并且会回滚收影响的事物。
在高并发系统,死锁检测能够引起性能下降当多个线程等待同一个锁。这时,也许更有效的是关闭死锁检测并依靠innodb_lock_wait_timeout设置来处理当死锁发生时事物的回滚。死锁的检测可以通过使用innodb_deadlock_detect配置选项来关闭。
行级锁的优势
1)减少锁冲突,当不同的session访问不同的行。
2)对于回滚更少的改变。
3)可能锁住单行很长时间
表级锁
mysql对MyISAM,MEMORY,和MERGE表中使用表级锁,在同一个时间只允许一个session来更新表。这种级别锁会使的存储引擎更适用于只读,几乎全是读,或者是单用户的应用程序。
这类型的存储引擎通过对所有请求排列并按同样顺序锁表。相对的是减少了并发量;其他session要想改变表必须等待直到当前数据修改完成后才能操作。
表级别锁的优势:
1)需要更少的相关内存(行锁要求对每一行内存或者是分组行锁)
2)更快速当使用一个锁来涉及到一个大部分表。
3)更快速你需要GROUP BY操作在表中大部分数据或者必须扫描扫描完整的表顺序。
MySQL授权表写锁如下:
1,如果没有锁在表中,给表中加一个写锁。
2,否则,放锁要求到写锁队列。
MySQl授权表读锁如下:
1)如果没有写锁在表中,则可以给表加行锁。
2)否则,将锁请求放入读锁队列。
表更新比表检索的优先级更好。因此,当一个锁被释放,锁首先会到写锁队列并且之后请求这个读锁队列。这样能保证更新表操作不会有太久的延迟即使是有很多查询在的情况下。然而,如果有许多更新在表中,查询语句需要等待直到不再有更新存在。
对于修改读写操作的优先级信息,请看8.11.2的表锁的问题。
你能够分析表锁竞争在你的系统通过检查table_locks_immediate和table_locks_waited状态变量值,这说明了请求授予获取表锁的数量和等待的数量:
mysql> SHOW STATUS LIKE 'Table%';
+-----------------------+---------+
| Variable_name         | Value   |
+-----------------------+---------+
| Table_locks_immediate | 1151552 |
| Table_locks_waited    | 15324   |
+-----------------------+---------+
锁执行方案表也提供了锁信息,请看25.11.12的锁方案表的执行。
MyISAM存储引擎支持并发插入来减少读和写的竞争对于给出的表:如果MyISAM表没有自由的数据块在表文件中间,行总是插入到数据文件的最后。在这种情况下,你能自由的混合并发插入和查询语句对MyISAM表而不需要上锁。也就是你能够插入行到MyISAM表的同时,其他客户端可以读取它。漏洞可能会因为删除或者更新表中间的数据而产生。如果有漏洞,并发插入不可用但是能够自动可用当所有的漏洞都填充了新数据以后。为了控制这种行为,使用concurrent_insert系统变量,请看8.11.3的并发插入、
如果你明确需要一个表锁通过LOCK TABLES,你能够请求一个READ LOCAL 锁而不是一个READ锁,这样其他session能够在你锁表的情况下完成并发插入。
为了执行多个插入和查询操作在一个表t1当并发插入不可用时,你能够插入行到临时表temp_t1 并且o从临时表中取数据更新真实表:
mysql> LOCK TABLES t1 WRITE, temp_t1 WRITE;
mysql> INSERT INTO t1 SELECT * FROM temp_t1;
mysql> DELETE FROM temp_t1;
mysql> UNLOCK TABLES;
选择锁的类型
通常,在如下情况下表锁优先于行锁:
>大多数语句都是对表的读取、
>对表的操作混合着读和写,其中更新和删除操作的单行可以通过一个关键字查询:
UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;
DELETE FROM tbl_name WHERE unique_key_col=key_value;
>查询和并发插入一起执行,非常少的更新或者删除操作。
>许多扫描或者分组操作在完整的表中没有任何写。
使用高级锁,你能够更容易调整应用通过支持的不同锁类型,因为重量级锁要少于行锁。
除行级锁以外的选项:
>版本协调(例如使用mysql并发插入)可以边写边读。这意味着数据库或者表支持不同的试图对数据依赖于何时访问开始。其他常用的条件是"空间穿越","写时复制","按需复制"。
>按需复制优先级高于行级锁,在多种情况下。然而,在最差的情况下,它能够使用更多内存比使用常规锁。
>代表使用行级锁,你能够使用应用级锁,例如通过使用GET LOCK()和RELEASE_LOCK()在MySQL中提供。这些是对锁的指导,所以他们会和合作的应用一起工作。具体请看12.20的多方面函数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值