如何實(shí)現(xiàn)MySQL鎖的優(yōu)化
以下的文章主要介紹的是MySQL鎖的實(shí)際優(yōu)化過(guò)程,以下就是MySQL鎖的優(yōu)化的具體方案的描述,希望在你今后的學(xué)習(xí)中會(huì)有所幫助。我們大家都知道當(dāng)前MySQL已經(jīng)支持 ISAM, MyISAM, MEMORY (HEAP) 類型表的表級(jí)鎖了。
BDB 表支持頁(yè)級(jí)鎖,InnoDB 表支持行級(jí)鎖
很多時(shí)候,可以通過(guò)經(jīng)驗(yàn)來(lái)猜測(cè)什么樣的鎖對(duì)應(yīng)用程序更合適,不過(guò)通常很難說(shuō)一個(gè)MySQL鎖比別的更好,這全都要依據(jù)應(yīng)用程序來(lái)決定,不同的地方可能需要不同的鎖。
鎖機(jī)制
當(dāng)前MySQL已經(jīng)支持 ISAM, MyISAM, MEMORY (HEAP) 類型表的表級(jí)鎖了,BDB 表支持頁(yè)級(jí)鎖,InnoDB 表支持行級(jí)鎖。很多時(shí)候,可以通過(guò)經(jīng)驗(yàn)來(lái)猜測(cè)什么樣的鎖對(duì)應(yīng)用程序更合適,不過(guò)通常很難說(shuō)一個(gè)鎖比別的更好,這全都要依據(jù)應(yīng)用程序來(lái)決定,不同的地方可能需要不同的鎖。
想要決定是否需要采用一個(gè)支持行級(jí)鎖的存儲(chǔ)引擎,就要看看應(yīng)用程序都要做什么,其中的查詢、更新語(yǔ)句是怎么用的。例如,很多的web應(yīng)用程序大量的做查詢,很少刪除,主要是基于索引的更新,只往特定的表中插入記錄。采用基本的MySQL MyISAM 表就很合適了。
MySQL中對(duì)表級(jí)鎖的存儲(chǔ)引擎來(lái)說(shuō)是釋放死鎖的。避免死鎖可以這樣做到:在任何查詢之前先請(qǐng)求鎖,并且按照請(qǐng)求的順序鎖表。
MySQL中用于 WRITE(寫(xiě)) 的表鎖的實(shí)現(xiàn)機(jī)制如下:
如果表沒(méi)有加鎖,那么就加一個(gè)寫(xiě)鎖。
否則的話,將請(qǐng)求放到寫(xiě)鎖隊(duì)列中。
MySQL中用于 READ(讀) 的表鎖的實(shí)現(xiàn)機(jī)制如下:
如果表沒(méi)有加寫(xiě)鎖,那么就加一個(gè)讀MySQL鎖。
否則的話,將請(qǐng)求放到讀鎖隊(duì)列中。
當(dāng)鎖釋放后,寫(xiě)鎖隊(duì)列中的線程可以用這個(gè)鎖資源,然后才輪到讀鎖隊(duì)列中的線程。
這就是說(shuō),如果表里有很多更新操作的話,那么 SELECT 必須等到所有的更新都完成了之后才能開(kāi)始。
從 MySQL 3.23.33 開(kāi)始,可以通過(guò)狀態(tài)變量 Table_locks_waited 和 Table_locks_immediate 來(lái)分析系統(tǒng)中的鎖表爭(zhēng)奪情況:
- mysql> SHOW STATUS LIKE 'Table%';
- +-----------------------+---------+
- | Variable_name | Value |
- +-----------------------+---------+
- | Table_locks_immediate | 1151552 |
- | Table_locks_waited | 15324 |
- +-----------------------+---------+
在 MySQL 3.23.7(在Windows上是3.23.25)以后,在 MyISAM 表中只要沒(méi)有沖突的 INSERT 操作,就可以無(wú)需使用MySQL鎖表自由地并行執(zhí)行 INSERT 和 SELECT 語(yǔ)句。
也就是說(shuō),可以在其它客戶端正在讀取 MyISAM 表記錄的同時(shí)時(shí)插入新記錄。如果數(shù)據(jù)文件的中間沒(méi)有空余的磁盤(pán)塊的話,就不會(huì)發(fā)生沖突了,因?yàn)檫@種情況下所有的新記錄都會(huì)寫(xiě)在數(shù)據(jù)文件的末尾(當(dāng)在表的中間做刪除或者更新操作時(shí),就可能導(dǎo)致空洞)。當(dāng)空洞被新數(shù)據(jù)填充后,并行插入特性就會(huì)自動(dòng)重新被啟用了。
如果想要在一個(gè)表上做大量的 INSERT 和 SELECT 操作,但是并行的插入?yún)s不可能時(shí),可以將記錄插入到臨時(shí)表中,然后定期將臨時(shí)表中的數(shù)據(jù)更新到實(shí)際的表里??梢杂靡韵旅顚?shí)現(xiàn):
【編輯推薦】