有的人說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
在回話三種執行下 show full processlist 。
沒有發現任何鎖定的現象。
修改表儲存引擎:
alter table tmp002 engine=myisam
受影響的行: 5618288
同樣是上面的例子
回話一:
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 是不會鎖表的。其實這裡使用到了快照。快照這裡不作討論。
mysql select是否會鎖表 ?
有的人說mysql的 select 會鎖表 有的人說 mysql 的查詢不會鎖表 其他他們都對,沒有 但是很片面。其實對於mysql的select 是否會鎖表 這個完全取決於表採用的是什麼儲存引擎。這裡我就拿大家最熟悉的儲存引擎innodb 和myisam 來說明這個問題。對於myisam的表sel...
update會鎖表嗎?
update會鎖表嗎?兩種情況 1.帶索引 2.不帶索引 前提介紹 方式 採用命令列的方式來模擬 1.mysq由於預設是開啟自動提交事務,所以首先得檢視自己當前的資料庫是否開啟了自動提交事務。命令 select autocommit 結果如下 autocommit 0 如果是1,那麼執行命令 set...
物極必反 蘋果是否會盛極而衰
隨著蘋果產品的不斷大賣與蘋果公司市值進一步提公升,很多投資者開始擔心蘋果會出現盛極而衰的現象,科技界的發展瞬息萬變,誰也無法 蘋果未來的發展。2012開始了,今年蘋果又會有何表現。iphone是否還能體現地位象徵 很手機購買者其實不懂手機,也不是很清楚手機的功能,只是大家都用iphone,我沒有ip...