MyISAM幾個容易忽視的配置選項

MyISAM在讀操做佔主導的狀況下是很高效的。可一旦出現大量的讀寫併發,同InnoDB相比,MyISAM的效率就會直線降低,並且,MyISAM和InnoDB的數據存儲方式也有顯著不一樣:一般,在MyISAM裏,新數據會被附加到數據文件的結尾,可若是時常作一些UPDATE,DELETE操做以後,數據文件就再也不是連續的,形象一點來講,就是數據文件裏出現了不少洞洞,此時再插入新數據時,按缺省設置會先看這些洞洞的大小是否能夠容納下新數據,若是能夠,則直接把新數據保存到洞洞裏,反之,則把新數據保存到數據文件的結尾。之因此這樣作是爲了減小數據文件的大小,下降文件碎片的產生。但InnoDB裏則不是這樣,在InnoDB裏,因爲主鍵是cluster的,因此,數據文件始終是按照主鍵排序的,若是使用自增ID作主鍵,則新數據始終是位於數據文件的結尾。php

瞭解了這些基礎知識,下面說說MyISAM幾個容易忽視的配置選項:併發

concurrent_insert:優化

一般來講,在MyISAM裏讀寫操做是串行的,但當對同一個表進行查詢和插入操做時,爲了下降鎖競爭的頻率,根據concurrent_insert的設置,MyISAM是能夠並行處理查詢和插入的:.net

當concurrent_insert=0時,不容許併發插入功能。
當concurrent_insert=1時,容許對沒有洞洞的表使用併發插入,新數據位於數據文件結尾(缺省)。
當concurrent_insert=2時,無論表有沒有洞洞,都容許在數據文件結尾併發插入。blog

這樣看來,把concurrent_insert設置爲2是很划算的,至於由此產生的文件碎片,能夠按期使用OPTIMIZE TABLE語法優化。排序

max_write_lock_count:get

缺省狀況下,寫操做的優先級要高於讀操做的優先級,即使是先發送的讀請求,後發送的寫請求,此時也會優先處理寫請求,而後再處理讀請求。這就形成一個問題:一旦我發出若干個寫請求,就會堵塞全部的讀請求,直到寫請求全都處理完,纔有機會處理讀請求。此時能夠考慮使用max_write_lock_count:it

max_write_lock_count=1io

有了這樣的設置,當系統處理一個寫操做後,就會暫停寫操做,給讀操做執行的機會。效率

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。

參考資料:

Concurrent Inserts
Table Locking Issues

 

轉:http://blog.csdn.net/phphot/archive/2009/06/04/4242031.aspx

相關文章
相關標籤/搜索