MySQL索引底層(三) InnoDB中的鎖

2021-10-04 05:43:59 字數 1397 閱讀 8042

行鎖,表鎖

innodb儲存引擎中有行鎖以及表鎖,行鎖是innodb中預設的鎖。

表鎖:對整張表進行加鎖,在同一時刻整張表的所有記錄都被鎖住。

行鎖:只對錶中的某一行記錄進行加鎖,表的其餘行不會被占用,但是可能會出現死鎖。

關閉事務自動提交

檢視一下表資料

接著我們更新一條資料

執行成功之後我們並沒有提交事務,這個時候這一條記錄已經是加了鎖的,所以我們在另外乙個客戶端更新同樣的行記錄。

自然就報錯了,直接就等待超時了。這裡證明已經加鎖了,接著我們來證明是行鎖還是表鎖。

當我們執行update的時候,是update 欄位a=1的 所以我們在update欄位a=2的時候,雖然沒有提交事務但是還是可以執行的,這裡證明了innodb是行鎖的。

注意:行鎖必須有索引才能實現,否則就會自動鎖住全表,也就是表鎖,而innodb當有主鍵的時候,自動就會建立主鍵索引。

行鎖與表鎖的區別

行鎖優點 :粒度小, 因為加鎖的只是一行資料。

鎖的優化:

合理設計索引

減少基於範圍的資料檢索過濾條件

盡量控制事務的大小,盡量使用較低的事務隔離級別

盡可能讓所有的資料檢索都通過索引來完成。

表鎖

優點:獲取跟釋放快,能避免死鎖(當執行update語句的時候,把整個表鎖住了,其他的sql無法執行,所以不會造成死鎖)

缺點:粒度太大,併發不夠高,當併發量較多的時候,鎖表會讓程序無法繼續執行sql。

死鎖

死鎖出現在行鎖中,假設現在有乙個t1的session執行緒去update乙個資料庫表table1 ,而且有乙個t2的session執行緒去update乙個資料庫表table2。

在沒有提交事務的時候,table1跟table2都已經進行了加鎖,這個時候,t1去操作了table2,那麼這個時候因為table2的記錄加了鎖,那麼t1會一直在等待,接著t2又同樣的去操作table1的表記錄,也同樣在等待,就造成了死鎖。

mysql底層 索引

mysql只是乙個應用軟體,不能直接讀取磁碟上的資料,當我們需要讀取某條資料的時候,mysql呼叫核心的乙個函式,告訴核心我要讀取某個資料,核心驅動磁柱磁頭去讀取資料,讀取資料之後怎麼返回裡,其實是把資料寫到記憶體中了 這個記憶體只是核心記憶體,並不是mysql記憶體 接下來再把資料copy到mys...

mysql索引底層

資料結構 二叉樹 從父節點開始,大的往右,小的往左,當有序的增長就變成了單邊增長,就會對效能沒什麼提公升,不適合 紅黑樹 二叉樹的平衡版,通過自旋等方式實現平衡 當資料很多時,紅黑樹的高度就變得很高,查詢一次需要多次的io不適合大資料查詢 b樹和b 樹 乙個節點都可以存多個元素 多叉樹 以有序的方式...

MySQL索引底層(二) 索引底層原理

聚集索引 上次我們講到了主鍵的索引,我們可以執行一下sql語句 explain select from t user where a 1 我們可以看到這條sql走的是主鍵的索引,而在mysql的innodb中,主鍵索引則是聚集索引,資料的物理順序與鍵值的邏輯 索引 順序相同,其實就是說主鍵索引跟其他...