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

简介: 怎么减少行锁对性能的影响

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



MySQL 的行锁是引擎层由引擎实现的,并不是所有的引擎都支持行锁,比如 MyISAM 引擎不支持行锁。


MyISAM 引擎特点


MySQL 5.7 MyISAM存储引擎的版本特性:


640.png

InnoDB 存储引擎


MySQL 5.7 InnoDB存储引擎的版本特性:


640.png


行锁针对的是数据表中的行记录的锁,比如事务 A 更新一行,这时候事务B 也要更新一行,则必须等事务 A 的操作完成后才能进行更新。


事务A 事务B
begin; updatate t set k=k+1 where id =1;update t set k=k+1 where id= 1
begin; update t set k = k+2 where id =1;
commit;


事务A 持有两个记录的行锁,在 commit 的时候释放,在 InnoDB 事务中,行锁 是在需要的时候才加上,而是要等待事务结束时才释放。

如果服务器 CPU 消耗接近 100% ,但整个数据库每秒执行不到100个事务,那很有可能就出现死锁了。


死锁和死锁检测


死锁的4个必要条件

  • 互斥条件
  • 请求保持条件
  • 循环等待
  • 不可剥夺


事务A 事务B
begin;update t set k=k+1 where id =1; begin;
update t set k=k+1 where id=2;
update t set k=k+1 where id =2;
update t set k=k+1 where id =1;


事务 A 在等待事务 B 释放 id =2 ,在事务 B 在等待事务 A 释放 id =1的行锁。事务A 事务B循环等待资源释放,满足循环等待,互斥,不可剥夺,请求保持等条件。


如何解决数据库死锁?


有两种策略可解决死锁:

  • 一种策略,是直接进入等待,知道超时,超时时间可通过参数 innodb_lock_wait_timeout 来设置。
  • 发起死锁检测,主动回滚死锁联调中的某一个事务,其他事务继续执行。将参数 innodb_deadlock_detect 设置为 on 标识开启这个逻辑。


怎么解决热点更新导致的性能问题?


  • 死锁检测要耗费大量的 CPU 资源,如果确定业务一定不会出现死锁,可以临时把死锁检测关掉。
  • 另外一个是思路是控制并发度,如果并发能够给控制住,同一行同时最多有 10个线程在更新,那么死锁检测的成本很低。


布隆过滤器可以一定程度上解决缓存穿透的问题,解决缓存穿透的问题核心是减少数据库的并发访问。由于 hash 碰撞的原因,布隆过滤器存在一定的误判几率,也存在不支持删除元素的问题。

相关文章
|
6月前
|
关系型数据库 MySQL
【MySQL实战笔记】07 | 行锁功过:怎么减少行锁对性能的影响?-01
【4月更文挑战第18天】MySQL的InnoDB引擎支持行锁,而MyISAM只支持表锁。行锁在事务开始时添加,事务结束时释放,遵循两阶段锁协议。为减少锁冲突影响并发,应将可能导致最大冲突的锁操作放在事务最后。例如,在电影票交易中,应将更新影院账户余额的操作安排在事务末尾,以缩短锁住关键行的时间,提高系统并发性能。
67 4
|
存储 缓存 数据库
优化性能与减少资源浪费:深入了解缓存策略
缓存策略是现代Web开发中关键的优化技术之一,它可以显著提高网站性能,降低服务器负载,并减少用户等待时间。在本博客中,我们将深入研究缓存策略的概念、不同类型的缓存和如何在项目中实施它们。
205 0
|
13天前
|
存储 缓存
中断向量表的大小会影响系统性能吗?
【10月更文挑战第28天】中断向量表的大小对系统性能有着重要的影响。在设计和实现计算机系统时,需要根据系统的具体需求和硬件环境,合理地确定中断向量表的大小,以平衡系统的可扩展性、中断响应时间、内存使用效率和系统稳定性等多方面的因素,从而优化系统的整体性能。
|
21天前
|
存储 缓存 监控
数据库优化:提升性能与效率的关键策略
【10月更文挑战第21】数据库优化:提升性能与效率的关键策略
|
21天前
|
存储 分布式计算 监控
数据库优化:提升性能与效率的全面策略
【10月更文挑战第21】数据库优化:提升性能与效率的全面策略
|
6月前
|
监控 测试技术
“我就优化了下,影响不大的”
“我就优化了下,影响不大的”
34 0
|
4月前
|
存储 数据处理 数据库
数据库索引策略如何影响数据更新操作的性能?
【7月更文挑战第3天】数据库索引策略如何影响数据更新操作的性能?
78 1
|
4月前
|
数据处理 数据库 索引
数据库索引策略如何影响数据的读取效率?
【7月更文挑战第3天】数据库索引策略如何影响数据的读取效率?
33 2
|
6月前
|
Java
什么锁比读写锁性能更高?
Java并发编程中,ReentrantReadWriteLock是高效的锁机制,但在高并发环境下,乐观锁(如CAS)和JDK 8引入的StampedLock可提供更高性能。StampedLock支持读锁、写锁和乐观读锁,其乐观读锁在读多写少的场景下能提升并发性能,通过tryOptimisticRead方法实现。当乐观读锁无效时,可无缝切换至悲观读锁。
|
6月前
|
存储 监控 关系型数据库
如何优化InnoDB的整体性能?
【5月更文挑战第14天】如何优化InnoDB的整体性能?
153 2