mysql鎖與索引
阿新 • • 發佈:2021-01-15
行鎖
當走索引就是使用行鎖,當索引失效就會使用表鎖
對索引使用一下操作導致索引失效
- 計算,如:+、-、*、/、!=、<>、is null、is not null、or
- 函式,如:sum()、round()等等
- 手動/自動型別轉換,如:id = "1",本來是數字,給寫成字串了
行鎖(寫&讀)
預先關閉自動提交事務功能
set autocommit=0;
視窗A執行更新語句,當前事務對其他食物不可見 -- 已提交讀
update test_innodb_lock set b='a1' where a=1;
SELECT * from test_innodb_lock;
在視窗A食物提交之前,視窗B看到的還是老資料
SELECT * from test_innodb_lock;
行鎖(寫&寫)
視窗A執行更新,不提交
update test_innodb_lock set b='a2' where a=1;
此時,視窗B也執行更新
update test_innodb_lock set b='a3' where a=1;
由於視窗A沒有commit,視窗B的事務就會等待獲取鎖,直到視窗A事務提交
表鎖
索引失效,行鎖升級為表鎖,整個表都被鎖住,其他事務等待
*避免使用or關鍵字變更資料,select可以考慮使用in查詢更多的資料,然後在程式碼裡過濾不需要的資料(代價)
多佔用空間以減少時間
間隙鎖
當我們採用範圍條件查詢資料時,InnoDB 會對這個範圍內的資料進行加鎖。比如有 id 為:1、3、5、7 的 4 條資料,我們查詢 1-7 範圍的資料(><between)。那麼 1-7 都會被加上鎖。2、4、6 也在 1-7 的範圍中,但是不存在這些資料記錄,這些 2、4、6 就被稱為間隙。