mysql select是否会锁表

有的人说mysql的 select 会锁表 ,有的人说 mysql 的查询不会锁表 。
其他他们都对,没有 ,但是很片面。
其实对于mysql的select 是否会锁表 ,这个完全取决于表采用的是什么存储引擎。
这里我就拿大家最熟悉的存储引擎INNODB 和MYISAM 来说明这个问题。
对于myisam的表select 是会锁定表的 ,会导致其他操作挂起,处于等待状态。
对于innodb的表select 是不会锁表的。其实这里使用到了快照。快照这里不作讨论。

下面是是我的佐证:

 回话一:
 select SQL_NO_CACHE * from tmp002
 表 tmp002  有5618288 数据 存储引擎时INNODB  ,全部查询出来大约需要5min左右  

 回话二:
 update tmp002
 set num=6
 where MreasonId in ('700098','301001' ) limit 10000

 我们首先 执行以下 回话一的 语句 。 再执行回话二。

 我们会发现回话2很快就执行了 
 update tmp002
 set num=6
 where MreasonId in ('700098','301001' ) limit 10000
 
受影响的行: 0
时间: 0.120s
 
 在回话三种执行下 show full PROCESSLIST 。
 没有发现任何锁定的现象。

修改表存储引擎:
 alter table tmp002 ENGINE=MYISAM
受影响的行: 5618288
时间: 17.510s 

同样是上面的例子

回话一:
 select SQL_NO_CACHE * from tmp002
 表 tmp002  有5618288 数据 存储引擎时INNODB  ,全部查询出来大约需要5min左右  
 回话二:
 update tmp002
 set num=6
 where MreasonId in ('700098','301001' ) limit 10000
 我们首先 执行以下 回话一的 语句 。 再执行回话二。
 我们先回话一直处于执行状态 ,没有返回任何信息 。
在回话三种执行下 show full PROCESSLIST 。
13564441 root 192.168.53.41:53312 tempDB Query 2 Locked  update tmp002 set num=6 where MreasonId in ('700098','301001' ) limit 10000
13564671 root 192.168.53.41:53736 tempDB Query 4 Writing to net select SQL_NO_CACHE * from tmp002
回话13564441状态为 Locked ,等待锁的释放 。
综上所述,可以得到下面的结果。
对于myisam的表select 是会锁定表的 ,会导致其他操作挂起,处于等待状态。
对于innodb的表select 是不会锁表的。其实这里使用到了快照。快照这里不作讨论。
转载请注明(B5教程网)原文链接:http://www.bcty365.com/content-35-656-1.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值