MySQL的myisam解決并發讀寫解決方法
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
mysql的myisam解決并發讀寫解決方法MyISAM在讀操作占主導的情況下是很高效的。可一旦出現大量的讀寫并發,同InnoDB相比,MyISAM的效率就會直線下降,而且,MyISAM和InnoDB的數據存儲方式也有顯著不同:通常,在MyISAM里,新數據會被附加到數據文件的結尾,可如果時常做一些 UPDATE,DELETE操作之后,數據文件就不再是連續的,形象一點來說,就是數據文件里出現了很多洞洞,此時再插入新數據時,按缺省設置會先看這些洞洞的大小是否可以容納下新數據,如果可以,則直接把新數據保存到洞洞里,反之,則把新數據保存到數據文件的結尾。之所以這樣做是為了減少數據文件的大小,降低文件碎片的產生。但InnoDB里則不是這樣,在InnoDB里,由于主鍵是cluster的,所以,數據文件始終是按照主鍵排序的,如果使用自增ID做主鍵,則新數據始終是位于數據文件的結尾。
了解了這些基礎知識,下面說說MyISAM幾個容易忽視的配置選項:
concurrent_insert:
通常來說,在MyISAM里讀寫操作是串行的,但當對同一個表進行查詢和插入操作時,為了降低鎖競爭的頻率,根據concurrent_insert的設置,MyISAM是可以并行處理查詢和插入的:
當concurrent_insert=0時,不允許并發插入功能。
當concurrent_insert=1時,允許對沒有洞洞的表使用并發插入,新數據位于數據文件結尾(缺?。?/span>
當concurrent_insert=2時,不管表有沒有洞洞,都允許在數據文件結尾并發插入。
這樣看來,把concurrent_insert設置為2是很劃算的,至于由此產生的文件碎片,可以定期使用OPTIMIZE TABLE語法優化。
max_write_lock_count:
缺省情況下,寫操作的優先級要高于讀操作的優先級,即便是先發送的讀請求,后發送的寫請求,此時也會優先處理寫請求,然后再處理讀請求。這就造成一個問題:www.linuxidc.com一旦我發出若干個寫請求,就會堵塞所有的讀請求,直到寫請求全都處理完,才有機會處理讀請求。此時可以考慮使用 max_write_lock_count:
max_write_lock_count=1
有了這樣的設置,當系統處理一個寫操作后,就會暫停寫操作,給讀操作執行的機會。
low-priority-updates:
我們還可以更干脆點,直接降低寫操作的優先級,給讀操作更高的優先級。
low-priority-updates=1
綜合來看,concurrent_insert=2是絕對推薦的,至于max_write_lock_count=1和low-priority- updates=1,則視情況而定,如果可以降低寫操作的優先級,則使用low-priority-updates=1,否則使用 max_write_lock_count=1。
該文章在 2012/4/3 19:45:26 編輯過 |
關鍵字查詢
相關文章
正在查詢... |