天天看點

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很快就執行了 

受影響的行: 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 ,等待鎖的釋放 。

綜上所述,可以得到下面的結果。

本文出自 “” 部落格,請務必保留此出處

繼續閱讀