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很快就執行了
受影響的行: 0
時間: 0.120s
在回話三種執行下 show full PROCESSLIST 。
沒有發現任何鎖定的現象。
修改表存儲引擎:
alter table tmp002 ENGINE=MYISAM
受影響的行: 5618288
時間: 17.510s
同樣是上面的例子
回話一:
我們先回話一直處于執行狀态 ,沒有傳回任何資訊 。
在回話三種執行下 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 ,等待鎖的釋放 。
綜上所述,可以得到下面的結果。
本文出自 “” 部落格,請務必保留此出處