行鎖,表鎖
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中,主鍵索引則是聚集索引,資料的物理順序與鍵值的邏輯 索引 順序相同,其實就是說主鍵索引跟其他...