近伺服器上經常出現mysql程序佔cpu100%的情況,使用show processlist命令後,看到出現了很多狀態為locked的sql。使用show status like 'table%'檢查table_locks_immediate和table_locks_waited,發現table_locks_waited偏大。出問題的表是myisam,分析大概是myisam的表鎖導致。
myisam適合於讀頻率遠大於寫頻率這一情況。而我目前的應用可能會出現在某一時段讀寫頻率相當。大致如下:
也就是說對myisam表的讀操作,不會阻塞其他使用者對同一表的讀請求,但會阻塞對同一表的寫請求;對 myisam表的寫操作,則會阻塞其他使用者對同一表的讀和寫操作;myisam表的讀操作與寫操作之間,以及寫操作之間是序列的!
解決方案大概有如下幾種:
myisam儲存引擎有乙個系統變數concurrent_insert,專門用以控制其併發插入的行為,其值分別可以為0、1或2。
使用--low-priority-updates啟用mysqld。這將給所有更新(修改)乙個表的語句以比select語句低的優先順序。在這種情況下,在先前情形的最後的select語句將在insert語句前執行。
為max_write_lock_count設定乙個低值,使得在一定數量的write鎖定後,給出read鎖定
使用low_priority屬性給於乙個特定的insert,update或delete較低的優先順序
使用high_priority屬性給於乙個特定的select
使用insert delayed語句
綜合自己的業務需求,使用了方案2。看來需要不斷監測伺服器狀態,再進行更合適的調整。
針對MyISAM鎖表的解決方案
最近伺服器上經常出現mysql程序佔cpu100 的情況,使用show processlist命令後,看到出現了很多狀態為locked的sql。使用show status like table 檢查table locks immediate和table locks waited,發現table lo...
針對MyISAM鎖表的解決方案
最近伺服器上經常出現mysql程序佔cpu100 的情況,使用show processlist命令後,看到出現了很多狀態為locked的sql。使用show status like table 檢查table locks immediate和table locks waited,發現table lo...
mysql 表鎖 mysql鎖表解決方案
1.為何會鎖表 首先我們了解一下資料庫查詢機制,首先我們用工具進行連線查詢時,會建立乙個connection,此時資料庫會將查詢語句解析成一棵 樹 各個引擎底層的結構不一樣,mysql的話在innodb用的是b tree,俗稱b 樹,那麼再到執行器進行處理,最後返回給客戶端。鎖表的原因 當多個連線 ...