数据库常见锁的性能

举报
码乐 发表于 2025/02/09 19:00:06 2025/02/09
【摘要】 1 简介锁的性能,锁的效率分析与排序(按性能降序排列)。在数据库锁的设计中,锁定的范围越大,对系统的并发性能影响越大,而锁的粒度越细,性能越高。因此,我们按照 性能(执行效率)从高到低排序,并分析各锁的 锁定程度 和 性能影响。 2 按执行性能降序排序 排名 锁类型 锁定范围 性能影响 ① AUTO-INC 锁 仅限于自增 ID 生成 最小范围,单...

1 简介

锁的性能,锁的效率分析与排序(按性能降序排列)。
在数据库锁的设计中,锁定的范围越大,对系统的并发性能影响越大,而锁的粒度越细,性能越高。
因此,我们按照 性能(执行效率)从高到低排序,并分析各锁的 锁定程度 和 性能影响。

2 按执行性能降序排序

  排名  				锁类型 锁定范围    								性能影响
  ① AUTO-INC 锁    仅限于自增 ID 生成 最小范围,              最小性能影响,事务不等待
  					  单个表的自增计数器  
  ② 行锁        影响索引所在单行数据                   比范围锁快    
  
  ③ 临时表锁      仅限于会话级别,影响较小               比Gap快影响范围较小
  ③ Gap 锁 索引范围    防止插入,影响多个事务 		比 Next-Key 锁稍快,但仍可能造成阻塞
  ④ Next-Key 锁    索引行 + 其前后的间隙仅影响部分索引范围   	比行锁慢,但比全局锁高效

  ⑤ 意向锁   表级别,但不会实际阻塞 提供兼容性检测,对性能影响最小  通常不会造成严重性能损耗
  ⑥ 数据库锁  整个数据库   影响当前数据库所有表的操作   性能损耗大,但优于全局锁
  ⑦ 全局锁   整个 MySQL 实例 影响整个数据库系统的所有操作  性能最差,严重影响并发执行

3 详细分析各锁的效率与锁定程度

1 AUTO-INC 锁(性能最高)

锁定范围:仅限于 表的自增 ID 生成,不影响其他操作。
影响程度:极小,多个事务可以并发执行,不需要等待锁释放。
性能:最高,因为它仅用于控制 AUTO_INCREMENT 计数器,并且 不会引发死锁。

🔹 适用场景:高并发写入时,自动 ID 生成不会成为性能瓶颈。

2 Gap 锁

锁定范围:索引范围(不锁定已有数据,但防止插入)。
影响程度:比 Next-Key 锁小,适用于 REPEATABLE READ,但仍然可能影响写入操作。
性能:比 Next-Key 锁稍快,因为它不会锁定已有的行数据,但仍然可能阻塞插入操作。

🔹 适用场景:保证事务的一致性,防止插入新数据导致数据变化。

3 Next-Key 锁

锁定范围:索引行 + 其前后的间隙(防止插入新数据)。
影响程度:中等,适用于 REPEATABLE READ 级别,防止幻读。
性能:比 行锁 慢,但比 全局锁 高效,因为它只锁定索引范围,而不是整个表。

🔹 适用场景:需要保证事务隔离性,防止幻读。

4 临时表锁

锁定范围:仅限于当前会话的临时表。
影响程度:很小,因为临时表是私有的,不会影响其他事务。
性能:比 Gap 锁高,因为临时表只在当前连接中可见,不会有并发争抢。

🔹 适用场景:查询缓存、中间结果存储,不会影响其他事务。

5 意向锁

锁定范围:表级别,但仅用于事务检测,不影响操作本身。
影响程度:非常低,仅用于标识事务意图,而不会实际锁住数据。
性能:与临时表锁相当,几乎不会影响性能,只是在加锁前增加检测。

🔹 适用场景:在行锁并存的情况下,提供更好的锁兼容性。

6 数据库锁

锁定范围:整个数据库(所有表)。
影响程度:高,会阻止其他事务操作该数据库内的所有表,但不会影响其他数据库。
性能:比表锁、Next-Key 锁慢得多,因为它限制了整个数据库的并发操作。

🔹 适用场景:数据库结构变更(如 ALTER DATABASE)、大规模数据迁移。

7 全局锁(性能最低)

锁定范围:整个 MySQL 服务器(所有数据库、所有表)。
影响程度:极高,所有写操作都会被阻塞,甚至会影响 SELECT 语句。
性能:最差,因为它会导致整个数据库系统的吞吐量下降。

🔹 适用场景:全库备份(如 FLUSH TABLES WITH READ LOCK),防止数据库一致性问题。

4 小结

按照执行性能降序排序:

AUTO-INC 锁(最小影响,性能最高)
Next-Key 锁(锁索引范围,影响比行锁大)
Gap 锁(锁索引范围,但不会锁已有行)

临时表锁(仅限当前会话)
意向锁(检测事务意图,不实际阻塞)
数据库锁(影响整个数据库)
全局锁(影响整个 MySQL 实例,性能最差)

粒度最小的锁(如 AUTO-INC 锁)影响最小,执行效率最高。
Next-Key 锁 & Gap 锁用于事务一致性,但可能阻塞写入。
数据库锁和全局锁严重影响并发,除非必要不建议使用。

如果要在高并发环境下优化 MySQL 锁机制,尽量使用 行级锁 或 索引锁,避免全局锁或数据库锁,以提升系统吞吐量。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。