mysql myisam 去掉表锁a_MyISAM表锁的解决方案
Table_locks_immediate和Table_locks_waited兩個狀態(tài):
Table_locks_immediate表示立即釋放表鎖數(shù),Table_locks_waited表示需要等待的表鎖數(shù),
如果Table_locks_immediate / Table_locks_waited > 5000,說明不嚴(yán)重,
因為InnoDB是行鎖而MyISAM是表鎖,對于高并發(fā)寫入的應(yīng)用InnoDB效果會好些。
示例中的服務(wù)器Table_locks_immediate / Table_locks_waited = 235,MyISAM不太好。
?Table_locks_immediate
The number of times that a request for a table lock could be granted immediately.
?Table_locks_waited
The number of times that a request for a table lock could not be granted immediately and a wait was needed. If this is high and you have performance problems, you should first optimize your queries, and then either split your table or tables or use replication.
實際上應(yīng)該關(guān)心的是Table_locks_waited的值
這是我們服務(wù)器上的一個值
mysql> show global status like 'table%';
+-----------------------+---------+
| Variable_name???????? | Value?? |
+-----------------------+---------+
| Table_locks_immediate | 1147514 |
| Table_locks_waited??? | 135???? |
+-----------------------+---------+
解決方案大概有如下幾種:
MyISAM存儲引擎有一個系統(tǒng)變量concurrent_insert,專門用以控制其并發(fā)插入的行為,其值分別可以為0、1或2。
0 不允許并發(fā)操作
1 如果MyISAM表中沒有空洞(即表的中間沒有被刪除的行),MyISAM允許在一個進程讀表的同時,另一個進程從表尾插入記錄。這也是MySQL的默認設(shè)置。
2 無論MyISAM表中有沒有空洞,都允許在表尾并發(fā)插入記錄
使用--low-priority-updates啟用mysqld。這將給所有更新(修改)一個表的語句以比SELECT語句低的優(yōu)先級。在這種情況下,在先前情形的最后的SELECT語句將在INSERT語句前執(zhí)行。
為max_write_lock_count設(shè)置一個低值,使得在一定數(shù)量的WRITE鎖定后,給出READ鎖定
使用LOW_PRIORITY屬性給于一個特定的INSERT,UPDATE或DELETE較低的優(yōu)先級
使用HIGH_PRIORITY屬性給于一個特定的SELECT
使用INSERT DELAYED語句
綜合自己的業(yè)務(wù)需求,使用了方案2。看來需要不斷監(jiān)測服務(wù)器狀態(tài),再進行更合適的調(diào)整。
總結(jié)
以上是生活随笔為你收集整理的mysql myisam 去掉表锁a_MyISAM表锁的解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【视频】商用笔记本优势有哪些?华为擎云
- 下一篇: 风投公司如何投资