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