儲存引擎層可通過接受Server層傳遞來的鎖類型而自行決定該如何給資料上鎖
表鎖是在Server層實現的鎖定機制,MyISAM並沒有自己實現,則是完全使用Server層傳遞來的表鎖
表鎖優點是附加成本低,缺點是可支援的並發度非常之小
現階段MySQL公認的2個經典版本是5.1和5.5,然而5.5引入中繼資料鎖,使得表鎖的資訊更為複雜
在5.1,我們通過show full processlist;輸出結果中State為Locked的便為表鎖
而5.5.3 Locked被Table lock取代,在5.5.6 Table lock又被waiting for table level lock取代
並且,有些在5.1是屬表鎖,卻在5.5已經不再是了,取而代之的是"waiting for table metadata lock"
雖然也是表鎖,但是比較另類,屬於新引入的表中繼資料鎖,這些鎖在表鎖監控當中是不被統計的
比如,用lock tables顯示加上的鎖,還有,伺服器在重新命名或刪除一個表時建立的鎖
㈠ 找出誰持有表鎖
mysqladmin debug
或者,我們也可以粗糙的用show processlist,但這資訊比較不全
㈡ 監控表鎖
show status like 'table_locks%'
有2個輸出值
Table_locks_immediate:自上次啟動以來申請的表鎖數,可累計,重啟後則被初始化
Table_locks_waited:被阻塞的表鎖數,可累計
這2個變數要合起來看:每申請多少個表鎖,有幾個被鎖住
㈢ 表鎖最佳化
可從2個方面最佳化表鎖
1)縮短鎖定時間
① 執行query最快的就是不去執行,緩衝為王
② 建立高效的MyISAM索引
③ 合理設計MyISAM Schema設計
2)讓能並行的盡量並行
開啟MyISAM 並發插入的特性(concurrent insert)
當concurrent_insert=0,無論資料檔案中間是否存在空塊,都不允許concurrent insert
當concurrent_insert=1, 僅在資料檔案中間不存在空塊時,才允許從資料檔案尾部進行 concurrent insert
當concurrent_insert=2,無論資料檔案中間是否存在空塊,都允許從資料檔案尾部進行concurrent insert
建議是將concurrent_insert=1
3)利用讀寫優先順序
預設情況下MySQL是寫優先順序高於讀,但如果我們的業務是於讀為主,比如www,blog,等
此時我們可設定low_priority_updates=1,告訴MySQL先處理讀請求
By DBA_WaterBin
2013-09-28
Good Luck