一般乙個程式滿,從消耗的角度,乙個是cpu,乙個是io,但有的時候mysql慢,是因為某條sql不小心把整個表給鎖了。
鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制。
在資料庫中,除了傳統的計算機資源(如cpu,ram,i/o)的爭用外,資料也是供很多使用者共享的資源。如何保證資料併發訪問的一致性,有效性是所有資料庫必須解決的乙個問題,鎖衝突也是影響資料庫併發訪問效能的乙個重要因素。
從對資料操作的型別:分為讀鎖/寫鎖
從對資料操作的粒度:分為表鎖/行鎖
表鎖(偏讀)
1.特點:偏向myisam儲存引擎,開銷小,加鎖快,無死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低
2.案例分析:
session1獲取讀鎖,可以讀取資料,session2也可以讀取資料
session1獲取讀鎖,可以讀取資料,但是當要向表中插入資料時,會報錯,因為還沒有釋放讀鎖,但是session2向表中插入資料時,會處於等待狀態,等session1釋放讀鎖後,session2的寫入操作就完成了
3.案例總結
myisam在執行查詢語句之前,會自動給所涉及的表加讀鎖,在執行增改刪操作前,會自動給涉及的表加寫鎖
myisam表級鎖有兩種模式:
結論:對myisam表的讀操作(加讀鎖),不會阻塞其它程序對同一表的讀請求,但會阻塞對同一表的寫請求。只有當讀鎖釋放後,才會執行其它程序的寫操作
對myisam表進行寫操作(加寫鎖),會阻塞其它程序對同一表的讀和寫操作,只有當釋放了寫鎖時,才會執行其它程序的讀寫操作
簡而言之就是,讀鎖會阻塞寫,但不會阻塞讀,而寫鎖會阻塞讀和寫
4.表鎖分析,如何排查鎖的情況
看看哪些表被鎖了:show open tables;
如何分析表鎖定:可以通過table_locks_waited和table_locks_immediate狀態變數來分析系統上的表鎖定
sql:show status like 'table%';
另外,myisam的讀寫鎖排程是寫優先,這也是myisam不適合做寫為主表的引擎。因為寫鎖後,其它執行緒不能做任何操作,大量的更新會使查詢很難得到鎖,從而造成永遠阻塞
行鎖(偏寫)
1.特點:偏向innodb儲存引擎,開銷大,加鎖慢,有死鎖,鎖定力度小,發生鎖衝突的概率最低,併發度也最高
innodb與myisam兩者的不同:一是支援事務,而是採用了行級鎖
2.併發事務處理帶來的問題
3.事務的隔離級別
4.案例分析
5.無索引行鎖公升級為表鎖
6.間隙鎖的危害
7.分析行鎖定
通過檢查innodb_row_lock狀態變數來分析系統上的行鎖爭奪情況
8.優化建議
頁鎖
mysql 簡述鎖機制 MySQL之鎖機制簡述
一 為什麼需要鎖 鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制。為了保證資料庫中資料併發訪問的一致性 有效性,故引入鎖機制。其中鎖衝突也是影響資料庫併發訪問效能的乙個重要因素。二 鎖的分類 分類一 行鎖,頁鎖,表鎖 分類二 共享鎖 排他鎖 意向鎖 is ix 分類三 樂觀鎖 悲觀鎖 inno...
鎖機制之MySQL表鎖
如何保證在被併發訪問時資料的一致性 完整性和有效性,是資料庫關注的核心問題。資料庫的鎖機制就是為了解決這個問題而出現的。鎖機制在一定程度上將對共享資源的併發訪問有序化,從而保證資料的一致完整性。鎖機制的好壞直接影響到資料的併發處理能力和效能。乙個好的鎖機制的實現是乙個資料的核心競爭力之一。我們知道在...
MySQL系列之鎖
分布式鎖 疑問?什麼是共享鎖?共享鎖 共享讀鎖,排他鎖 獨佔寫鎖 鎖機制與innodb鎖演算法 在關係型資料庫中,可以按照鎖的粒度把資料庫鎖分為行級鎖 innodb引擎 表級鎖 myisam引擎 和頁級鎖 bdb引擎 myisam採用表級鎖 table level locking innodb支援行...