1. 程式人生 > 資料庫 >mysql鎖與索引

mysql鎖與索引

行鎖

當走索引就是使用行鎖,當索引失效就會使用表鎖

對索引使用一下操作導致索引失效

  • 計算,如:+、-、*、/、!=、<>、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 就被稱為間隙。