10477777 发表于 2018-9-29 13:59:42

mysql select是否会锁表 ?

  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 Lockedupdate 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 是不会锁表的。其实这里使用到了快照。快照这里不作讨论。

页: [1]
查看完整版本: mysql select是否会锁表 ?