如何减少行锁对性能的影响

如何减少行锁对性能的影响

1. 什么是行锁

行锁是针对数据表中的行记录进行加锁。

2. 两阶段锁

InnoDB中会在需要的时候加上行锁,不是使用完立即释放,而是等待事务结束才释放,这就是两阶段锁。

3. 死锁

并发系统中,多个线程有循环资源依赖,导致进入无限等待状态,就是死锁。

3.1 死锁的处理策略

  • 超时释放。设置参数 innodb_lock_wait_timeout
  • 死锁检测,发现死锁后,主动回滚死锁链条中的一个事务。讲innodb_deadlock_detect 设置为on

4. 如何解决热点行更新导致的性能问题?

  • 如果知道业务不会产生死锁的话,就把死锁检测关掉。
  • 控制并发度。控制并发更新热点行的线程数量。
  • 从设计上有话,讲一行热点数据改成逻辑上的多行。比如将统计总数的记录按照某些维度拆分到不同的行,统计的时候通过sum统计,更新的时候,只更新其中的某一行,降低锁冲突概率。

5. 如何删除表中的前10000行数据

备选方案如下:

  1. delete from T limit 10000

  2. 在一个连接中循环执行 delete from T limit 500

  3. 在20个连接中同时执行 delete from T limit 500

最优的是方案2.

  • 方案1会对数据逐行加锁,事务结束后才会释放行锁,导致加锁时间长,影响其他事务。
  • 方案2 涉及加锁的数据行比较少,持有锁的时间比较短。
  • 方案3 在20个连接中同时执行,会产生20个事务,这20个事务之间互相竞争锁,人为增加了冲突。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值