淺析MySQL 表鎖

來源:互聯網
上載者:User

儲存引擎層可通過接受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

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.