行锁总结|学习笔记

简介: 快速学习行锁总结

开发者学堂课程【MySQL 高级应用 - 索引和锁行锁总结】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/598/detail/8639


行锁总结

目录:

一、案例结论

二、行锁定的分析

三、优化建议

 

一、案例结论

Innodb 存储引擎由于实现了行级锁定(存储引擎和锁的行为方式),虽然在锁定机制的实现方面所带来的性能损耗可能比表级锁定会要更高一些, 但是在整体并发处理能力方面要远远优于 MyISAM 的表级锁定的。

当系统并发量较高的时候,因为 innodb 的高并发,使得 Innodb 的整体性当与 MyISAM 进行比较时,前者体现出了较为明显的优势。

但是, Innodb 的行级锁定同样存在其脆弱的一面,当使用不当时,可能会让Innodb 的整体性能表现不仅不能比 MyISAM 高甚至可能会更差,较为明显具有特征的,例如行锁变表锁造成走向了得不偿失的地步。

 

二、行锁定的分析

通过检查 InnoDBrow_lock 状态变量来分析系统上的行锁的争夺情况

1.对各个状态的说明

mysql>show status like 'innodb_row_lock%';

Innodb_row_lock_current_waits:

当前正在等待锁定的数量;

Innodb_row_lock_time:

从系统启动到现在锁定总时间长度;

Innodb_row_lock_time_avg:

每次等待所花平均时间;

Innodb_row_lock_time_max:

从系统启动到现在等待最长的一次所花的时间;

Innodb_ row_lock_waits:

系统启动后到现在总共等待的次数;

对于这5个状态变量,比较重要的如下

Innodb_row_lock_time_avg (等待平均时长)

Innodb_row_lock_waits (等待总次数)

Innodb_row_lock_time (等待总时长)

尤其是当等待次数很高,而且每次等待时长也不小的时候,需要分析系统中为什么会有如此多的等待,然后根据分析结果着手指定优化计划。

mysq 出错的情况下,有可能是客户端连接工具的问题。例如 session-3重连后便恢复正常。

诸如 mysq 一类的客户端工具更改配置参数后,最好重启重连系统,此为最为保险的方法。

而当部分工具更改完毕后仍为原样或缓存、保存特定关系,前一个方法无法起到作用则可以使用新开窗口的方式进行连接。

2.实例

session-1

mysql>show status like 'innodb_row_lock%';

//鼠标右键操作

+-------------------------------------------+-----------+

|   Variable_name                          |  0       |

+-------------------------------------------+-----------+

|Innodb_row_lock_current_waits              | 72038    |

|Innodb_row_lock_time                       |  18009   |

|Innodb_row_lock_time_avg                   |  29740    |

|Innodb_ row_lock_waits                     |  4       |

+-------------------------------------------+-----------+

5 rows in set (0.00 sec)

前三列为时间类,当锁定时间越多,则时间花费越长。由上述实例结果可得,当前无锁,接下来分别为锁定总时间长度;等待所花平均时间;最长的一次等待时间;启动后到现在总共等待的时间。

其中,最为重要的部分为等待锁定的数量与启动后到现在总共等待的时间。

 

三、优化建议

1)尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁。例如 varchar 类型必须添加单引号。

2)合理设计索引,尽量缩小锁的范围尽可能较少检索条件,避免间隙锁。例如写范围查询时需要时刻注意间隙锁所带来的某些负面危害。

3)尽量控制事务大小,减少锁定资源量和时间长度

4)尽可能低级别事务隔离

相关文章
|
3月前
|
数据库 索引 关系型数据库
乐观锁和悲观锁+行锁和表锁
【8月更文挑战第2天】
58 8
|
4月前
|
SQL 关系型数据库 BI
关于InnoDB行锁和4种锁是怎么实现的?
总的来说,InnoDB的行锁机制通过索引来实现对数据行的精确控制,并通过多种锁类型和兼容性规则来处理并发事务中的冲突。开发者需要注意合理使用索引和优化事务处理,以提高数据库的并发性能和稳定性。
|
6月前
|
存储 关系型数据库 MySQL
分布式事物【悲观锁、乐观锁、读锁、写锁、间隙锁、临键锁 、 表锁、行锁、页面锁、 如何避免死锁】(二)-全面详解(学习总结---从入门到深化)
分布式事物【悲观锁、乐观锁、读锁、写锁、间隙锁、临键锁 、 表锁、行锁、页面锁、 如何避免死锁】(二)-全面详解(学习总结---从入门到深化)
258 0
|
5月前
|
SQL 关系型数据库 MySQL
MySQL数据库——锁-行级锁(行锁、间隙锁和临键锁)
MySQL数据库——锁-行级锁(行锁、间隙锁和临键锁)
86 0
|
6月前
|
SQL 存储 关系型数据库
MySQL表锁、行锁、排它锁和共享锁
MySQL表锁、行锁、排它锁和共享锁
81 0
MySQL表锁、行锁、排它锁和共享锁
|
SQL 关系型数据库 MySQL
一分钟了解乐观锁、悲观锁、共享锁、排它锁、行锁、表锁以及使用场景
!! 背景:最近在各种群和博客里,又看见了什么[乐观锁]、悲观锁什么鬼的感觉很高级的词汇,于是乎今天对这几个概念进行整理一下,揭开它神秘的面纱,给大家提供一个基本参考。作为开发人员不管是用什么编程语言,我觉得这些是应该要掌握的。知其然,知其所以然。 锁机制是 MySQL 中用来保证并发访问数据库时数据一致性和完整性的重要机制。在并发访问中,多个事务可能同时对同一份数据进行操作。如果不采用锁机制,就会出现数据错乱和丢失的问题。MySQL 中的锁机制主要包括以下几种类型:
307 0
|
SQL 存储 关系型数据库
并发锁 (三):myisam表锁
并发锁 (三):myisam表锁
81 1
并发锁 (三):myisam表锁
|
存储 关系型数据库 MySQL
深入浅出InnoDB中的行锁
深入浅出InnoDB中的行锁
深入浅出InnoDB中的行锁
|
SQL 关系型数据库 MySQL
行锁案例讲解|学习笔记
快速学习行锁案例讲解
行锁案例讲解|学习笔记
|
存储 SQL 算法
【行锁及其算法、死锁、意向锁】
【行锁及其算法、死锁、意向锁】
153 0