通常一個程序滿,從消耗的角度,一個是cpu,一個是IO,但有的時候mysql慢,是由於某條sql不當心把整個表給鎖了。mysql
鎖是計算機協調多個進程或線程併發訪問某一資源的機制。
在數據庫中,除了傳統的計算機資源(如CPU,RAM,I/O)的爭用外,數據也是供不少用戶共享的資源。如何保證數據併發訪問的一致性,有效性是全部數據庫必須解決的一個問題,鎖衝突也是影響數據庫併發訪問性能的一個重要因素。程序員
從對數據操做的類型:分爲讀鎖/寫鎖sql
從對數據操做的粒度:分爲表鎖/行鎖數據庫
1.特色:偏向MyISAM存儲引擎,開銷小,加鎖快,無死鎖;鎖定粒度大,發生鎖衝突的機率最高,併發度最低
2.案例分析:session
3.案例總結
MyISAM在執行查詢語句以前,會自動給所涉及的表加讀鎖,在執行增改刪操做前,會自動給涉及的表加寫鎖
MyISAM表級鎖有兩種模式:併發
結論:性能
簡而言之就是,讀鎖會阻塞寫,但不會阻塞讀,而寫鎖會阻塞讀和寫優化
4.表鎖分析,如何排查鎖的狀況
看看哪些表被鎖了:show open tables;
如何分析表鎖定:能夠經過table_locks_waited和table_locks_immediate狀態變量來分析系統上的表鎖定
SQL:show status like 'table%';spa
另外,MyISAM的讀寫鎖調度是寫優先,這也是MyISAM不適合作寫爲主表的引擎。由於寫鎖後,其它線程不能作任何操做,大量的更新會使查詢很可貴到鎖,從而形成永遠阻塞線程
1.特色:偏向InnoDB存儲引擎,開銷大,加鎖慢,有死鎖,鎖定力度小,發生鎖衝突的機率最低,併發度也最高
InnoDB與MyISAM二者的不一樣:一是支持事務,而是採用了行級鎖
2.併發事務處理帶來的問題
3.事務的隔離級別
4.案例分析
5.無索引行鎖升級爲表鎖
6.間隙鎖的危害
7.分析行鎖定
經過檢查InnoDB_row_lock狀態變量來分析系統上的行鎖爭奪狀況
show status like 'innodb_row_lock%';
8.優化建議