Mysql(MyISAM)的讀寫(xiě)互斥鎖問(wèn)題的解決方法
更新時(shí)間:2011年09月27日 00:32:11 作者:
最近因?yàn)閿?shù)據(jù)庫(kù)讀的請(qǐng)求增加,出現(xiàn)了比較嚴(yán)重的讀寫(xiě)鎖問(wèn)題,由于主從分離,主服務(wù)器很快的執(zhí)行完了寫(xiě)入的操作,但從庫(kù)由于有大量的select的查詢,會(huì)被這些來(lái)自主輔同步的update,insert嚴(yán)重堵塞,最后造成所有的Mysql從庫(kù)負(fù)載迅速上升。
由于沒(méi)辦法在短期內(nèi)增加讀的服務(wù)器,所以采取對(duì)Mysql進(jìn)行了一些配置,以犧牲數(shù)據(jù)實(shí)時(shí)性為代價(jià),來(lái)?yè)Q取所有服務(wù)器的生命安全。呵呵,具體相關(guān)調(diào)整以及思路如下:
MyISAM在讀操作占主導(dǎo)的情況下是很高效的??梢坏┏霈F(xiàn)大量的讀寫(xiě)并發(fā),同InnoDB相比,MyISAM的效率就會(huì)直線下降,而且,MyISAM和 InnoDB的數(shù)據(jù)存儲(chǔ)方式也有顯著不同:通常,在MyISAM里,新數(shù)據(jù)會(huì)被附加到數(shù)據(jù)文件的結(jié)尾,可如果時(shí)常做一些UPDATE,DELETE操作之后,數(shù)據(jù)文件就不再是連續(xù)的,形象一點(diǎn)來(lái)說(shuō),就是數(shù)據(jù)文件里出現(xiàn)了很多洞洞,此時(shí)再插入新數(shù)據(jù)時(shí),按缺省設(shè)置會(huì)先看這些洞洞的大小是否可以容納下新數(shù)據(jù),如果可以,則直接把新數(shù)據(jù)保存到洞洞里,反之,則把新數(shù)據(jù)保存到數(shù)據(jù)文件的結(jié)尾。之所以這樣做是為了減少數(shù)據(jù)文件的大小,降低文件碎片的產(chǎn)生。但 InnoDB里則不是這樣,在InnoDB里,由于主鍵是cluster的,所以,數(shù)據(jù)文件始終是按照主鍵排序的,如果使用自增ID做主鍵,則新數(shù)據(jù)始終是位于數(shù)據(jù)文件的結(jié)尾。
了解了這些基礎(chǔ)知識(shí),下面說(shuō)說(shuō)MyISAM幾個(gè)容易忽視的配置選項(xiàng):
concurrent_insert:
通常來(lái)說(shuō),在MyISAM里讀寫(xiě)操作是串行的,但當(dāng)對(duì)同一個(gè)表進(jìn)行查詢和插入操作時(shí),為了降低鎖競(jìng)爭(zhēng)的頻率,根據(jù)concurrent_insert的設(shè)置,MyISAM是可以并行處理查詢和插入的:
當(dāng)concurrent_insert=0時(shí),不允許并發(fā)插入功能。
當(dāng)concurrent_insert=1時(shí),允許對(duì)沒(méi)有洞洞的表使用并發(fā)插入,新數(shù)據(jù)位于數(shù)據(jù)文件結(jié)尾(缺省)。
當(dāng)concurrent_insert=2時(shí),不管表有沒(méi)有洞洞,都允許在數(shù)據(jù)文件結(jié)尾并發(fā)插入。
這樣看來(lái),把concurrent_insert設(shè)置為2是很劃算的,至于由此產(chǎn)生的文件碎片,可以定期使用OPTIMIZE TABLE語(yǔ)法優(yōu)化。
max_write_lock_count:
缺省情況下,寫(xiě)操作的優(yōu)先級(jí)要高于讀操作的優(yōu)先級(jí),即便是先發(fā)送的讀請(qǐng)求,后發(fā)送的寫(xiě)請(qǐng)求,此時(shí)也會(huì)優(yōu)先處理寫(xiě)請(qǐng)求,然后再處理讀請(qǐng)求。這就造成一個(gè)問(wèn)題:一旦我發(fā)出若干個(gè)寫(xiě)請(qǐng)求,就會(huì)堵塞所有的讀請(qǐng)求,直到寫(xiě)請(qǐng)求全都處理完,才有機(jī)會(huì)處理讀請(qǐng)求。此時(shí)可以考慮使用max_write_lock_count:
max_write_lock_count=1
有了這樣的設(shè)置,當(dāng)系統(tǒng)處理一個(gè)寫(xiě)操作后,就會(huì)暫停寫(xiě)操作,給讀操作執(zhí)行的機(jī)會(huì)。
low-priority-updates:
我們還可以更干脆點(diǎn),直接降低寫(xiě)操作的優(yōu)先級(jí),給讀操作更高的優(yōu)先級(jí)。
low-priority-updates=1
綜合來(lái)看,concurrent_insert=2是絕對(duì)推薦的,至于max_write_lock_count=1和low-priority-updates=1,則視情況而定,如果可以降低寫(xiě)操作的優(yōu)先級(jí),則使用low-priority-updates=1,否則使用max_write_lock_count=1。
MyISAM在讀操作占主導(dǎo)的情況下是很高效的??梢坏┏霈F(xiàn)大量的讀寫(xiě)并發(fā),同InnoDB相比,MyISAM的效率就會(huì)直線下降,而且,MyISAM和 InnoDB的數(shù)據(jù)存儲(chǔ)方式也有顯著不同:通常,在MyISAM里,新數(shù)據(jù)會(huì)被附加到數(shù)據(jù)文件的結(jié)尾,可如果時(shí)常做一些UPDATE,DELETE操作之后,數(shù)據(jù)文件就不再是連續(xù)的,形象一點(diǎn)來(lái)說(shuō),就是數(shù)據(jù)文件里出現(xiàn)了很多洞洞,此時(shí)再插入新數(shù)據(jù)時(shí),按缺省設(shè)置會(huì)先看這些洞洞的大小是否可以容納下新數(shù)據(jù),如果可以,則直接把新數(shù)據(jù)保存到洞洞里,反之,則把新數(shù)據(jù)保存到數(shù)據(jù)文件的結(jié)尾。之所以這樣做是為了減少數(shù)據(jù)文件的大小,降低文件碎片的產(chǎn)生。但 InnoDB里則不是這樣,在InnoDB里,由于主鍵是cluster的,所以,數(shù)據(jù)文件始終是按照主鍵排序的,如果使用自增ID做主鍵,則新數(shù)據(jù)始終是位于數(shù)據(jù)文件的結(jié)尾。
了解了這些基礎(chǔ)知識(shí),下面說(shuō)說(shuō)MyISAM幾個(gè)容易忽視的配置選項(xiàng):
concurrent_insert:
通常來(lái)說(shuō),在MyISAM里讀寫(xiě)操作是串行的,但當(dāng)對(duì)同一個(gè)表進(jìn)行查詢和插入操作時(shí),為了降低鎖競(jìng)爭(zhēng)的頻率,根據(jù)concurrent_insert的設(shè)置,MyISAM是可以并行處理查詢和插入的:
當(dāng)concurrent_insert=0時(shí),不允許并發(fā)插入功能。
當(dāng)concurrent_insert=1時(shí),允許對(duì)沒(méi)有洞洞的表使用并發(fā)插入,新數(shù)據(jù)位于數(shù)據(jù)文件結(jié)尾(缺省)。
當(dāng)concurrent_insert=2時(shí),不管表有沒(méi)有洞洞,都允許在數(shù)據(jù)文件結(jié)尾并發(fā)插入。
這樣看來(lái),把concurrent_insert設(shè)置為2是很劃算的,至于由此產(chǎn)生的文件碎片,可以定期使用OPTIMIZE TABLE語(yǔ)法優(yōu)化。
max_write_lock_count:
缺省情況下,寫(xiě)操作的優(yōu)先級(jí)要高于讀操作的優(yōu)先級(jí),即便是先發(fā)送的讀請(qǐng)求,后發(fā)送的寫(xiě)請(qǐng)求,此時(shí)也會(huì)優(yōu)先處理寫(xiě)請(qǐng)求,然后再處理讀請(qǐng)求。這就造成一個(gè)問(wèn)題:一旦我發(fā)出若干個(gè)寫(xiě)請(qǐng)求,就會(huì)堵塞所有的讀請(qǐng)求,直到寫(xiě)請(qǐng)求全都處理完,才有機(jī)會(huì)處理讀請(qǐng)求。此時(shí)可以考慮使用max_write_lock_count:
max_write_lock_count=1
有了這樣的設(shè)置,當(dāng)系統(tǒng)處理一個(gè)寫(xiě)操作后,就會(huì)暫停寫(xiě)操作,給讀操作執(zhí)行的機(jī)會(huì)。
low-priority-updates:
我們還可以更干脆點(diǎn),直接降低寫(xiě)操作的優(yōu)先級(jí),給讀操作更高的優(yōu)先級(jí)。
low-priority-updates=1
綜合來(lái)看,concurrent_insert=2是絕對(duì)推薦的,至于max_write_lock_count=1和low-priority-updates=1,則視情況而定,如果可以降低寫(xiě)操作的優(yōu)先級(jí),則使用low-priority-updates=1,否則使用max_write_lock_count=1。
您可能感興趣的文章:
- Mysql悲觀鎖和樂(lè)觀鎖的使用示例
- 實(shí)例講解MySQL中樂(lè)觀鎖和悲觀鎖
- mysql鎖表和解鎖語(yǔ)句分享
- MySQL行級(jí)鎖、表級(jí)鎖、頁(yè)級(jí)鎖詳細(xì)介紹
- Mysql數(shù)據(jù)庫(kù)鎖定機(jī)制詳細(xì)介紹
- MYSQL鎖表問(wèn)題的解決方法
- 一次Mysql死鎖排查過(guò)程的全紀(jì)錄
- mysql 數(shù)據(jù)庫(kù)死鎖原因及解決辦法
- mysql數(shù)據(jù)庫(kù)鎖的產(chǎn)生原因及解決辦法
- mysql鎖定單個(gè)表的方法
- mysql 悲觀鎖與樂(lè)觀鎖的理解及應(yīng)用分析
相關(guān)文章
phpstudy中mysql無(wú)法啟動(dòng)(與本地安裝的mysql沖突)的解決方式
這篇文章主要給大家介紹了關(guān)于phpstudy中mysql無(wú)法啟動(dòng)(與本地安裝的mysql沖突)的解決方式,文中通過(guò)圖文將解決的方法介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
Mysql學(xué)習(xí)之?dāng)?shù)據(jù)庫(kù)檢索語(yǔ)句DQL大全小白篇
這篇文章主要介紹了Mysql數(shù)據(jù)庫(kù)檢索語(yǔ)句DQL大全,本文適合數(shù)據(jù)庫(kù)初學(xué)者,小白也能看懂,有需要的朋友可以收藏閱讀,希望可以有所幫助2021-09-09
SQL中current_date()函數(shù)的實(shí)現(xiàn)
日期時(shí)間類(lèi)型的數(shù)據(jù)也是經(jīng)常要用到的,SQL中也提供了一些函數(shù)對(duì)這些數(shù)據(jù)進(jìn)行處理,本文主要介紹了SQL中current_date()函數(shù)的實(shí)現(xiàn),具有一定的參考價(jià)值2024-02-02
MySQL 查找價(jià)格最高的圖書(shū)經(jīng)銷(xiāo)商的幾種SQL語(yǔ)句
不同的圖書(shū),在不同的經(jīng)銷(xiāo)商的價(jià)格不同,我們這里要找到每種圖書(shū)最高的經(jīng)銷(xiāo)商是誰(shuí)? 找最低的類(lèi)似了。2009-07-07
pycharm2017實(shí)現(xiàn)python3.6與mysql的連接
這篇文章主要為大家詳細(xì)介紹了PyCharm連接MySQL數(shù)據(jù)庫(kù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03

