MySQL UPDATE能走索引但产生表锁的原因

MySQL InnoDB采用行级锁,通常依赖索引。若UPDATE语句未使用索引,可能导致表锁。即使索引生效,MySQL优化器在随机扫描比例过高时会选择全表扫描,从而造成表锁。优化策略包括充分利用索引,避免大量数据操作及延迟提交事务。
摘要由CSDN通过智能技术生成

1、MySQL InnoDB默认行级锁。行级锁都是基于索引的,如果一条SQL语句用不到索引是不会使用行级锁的,会使用表级锁把整张表锁住。

2、产生表锁的一些原因

  • 索引失效
  • 查询字段未加索引

3、思考:针对where查询条件字段增加索引后,索引未失效,update时会产生表锁吗?

-- 对name增加了索引
-- 事务A
start transaction;
update Test set appkey = 'XXX' where name = "test5";
COMMIT;
​
-- 事务B
start transaction;
update Test set appkey = 'XXX' where name = "lisi";
COMMIT;

经过测试,是有可能产生表锁的。

4、索引未失效但产生表锁的原因

MySQL内部有优化器,当随机扫描的数量超过一定比例时(一般是20% ~ 30%),优化器会决定直接改成全表扫描。所以有时会产生表锁。

5、官方文档上的介绍,http://www.searchdoc.cn/rdbms/mysql/dev.mysql.com/doc/refman/5.7/en/where-optimization.com.coder114.cn.html

查询每个表索引,并使用最佳索引,除非优化程序认为使用表扫描更有效。 一次使用扫描是基于最佳索引是否跨

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值