MySQL5.5.X的優(yōu)化秘密之一:InnoDB存儲(chǔ)引擎
從mysql5.5.x開始,默認(rèn)的存儲(chǔ)引擎更改為InnoDB Plugin引擎,提供了具有提交、回滾和崩潰恢復(fù)能力的事務(wù)安全存儲(chǔ)引擎。InnoDB鎖定在行級(jí),并且也在SELECT語(yǔ)句提供與Oracle
從mysql5.5.x開始,默認(rèn)的存儲(chǔ)引擎更改為InnoDB Plugin引擎,提供了具有提交、回滾和崩潰恢復(fù)能力的事務(wù)安全存儲(chǔ)引擎。InnoDB鎖定在行級(jí),并且也在SELECT語(yǔ)句提供與Oracle風(fēng)格一致的非鎖定讀,這些特性增加了多用戶部署和性能。InnoDB存儲(chǔ)引擎被完全整合到了mysql服務(wù)器中,不過(guò),為了能在主內(nèi)存中緩存數(shù)據(jù)和索引,InnoDB存儲(chǔ)引擎會(huì)維持它自己的緩沖池。InnoDB會(huì)在一個(gè)表空間中存儲(chǔ)它的表和索引。
充分利用CPU多核處理能力
在mysql5.1.X中,innodb_file_io_threads參數(shù)默認(rèn)是4,在linux系統(tǒng)上是不可更改的,在windows系統(tǒng)上可以調(diào)整。不支持動(dòng)態(tài)改變,需要寫入中。該參數(shù)的作用是讓InnoDB使用后臺(tái)線程處理數(shù)據(jù)頁(yè)上讀寫I/O請(qǐng)求的數(shù)量。在mysql5.5.x中,用兩個(gè)新參數(shù)代替:innodb_read_io_threads和innodb_write_io_threads。如果CPU是2顆8核,可以將這兩個(gè)參數(shù)設(shè)置為8。如果數(shù)據(jù)庫(kù)的讀操作較多,可以設(shè)置innodb_read_io_threads10,innodb_write_io_threads6。
提高刷新臟頁(yè)數(shù)量和合并插入數(shù)量,改善磁盤I/O處理能力
在5.1.x版本中,由于代碼寫死,最多只會(huì)刷新100個(gè)臟頁(yè)到磁盤、合并20個(gè)插入緩沖。即使磁盤有能力處理更多的請(qǐng)求,也只會(huì)處理這么多,這樣在更新量較大(大批量insert)的時(shí)候,臟頁(yè)刷新可能就會(huì)跟不上,導(dǎo)致性能下降。innodb_io_capacity參數(shù)可以動(dòng)態(tài)調(diào)整刷新臟頁(yè)的數(shù)量,避免了大批量insert時(shí)臟頁(yè)刷新跟不上導(dǎo)致性能下降。該參數(shù)默認(rèn)是200,可以動(dòng)態(tài)調(diào)整。例如,如果使用的是單盤SAS/SATA,可以將innodb_io_capacity設(shè)置為200;如果使用的是SAS*12RAID10,可以將innodb_io_capacity設(shè)置為2000;如果使用的是SSD,可以將innodb_io_capacity設(shè)置為5000;如果使用的是FUSION-IO,可以將innodb_io_capacity設(shè)置為50000。
讓InnoDB_Buffer_Pool緩沖池中的熱數(shù)據(jù)存活更久
InnoDB_Buffer_Pool緩沖區(qū)有兩個(gè)區(qū)域,一個(gè)是sublist of new blocks區(qū)域(經(jīng)常被訪問(wèn)到的區(qū)域,即熱數(shù)據(jù)),一個(gè)是sublist of old blocks區(qū)域(不經(jīng)常訪問(wèn)到的區(qū)域)。當(dāng)用戶訪問(wèn)數(shù)據(jù)時(shí),如果緩存區(qū)中有相應(yīng)的數(shù)據(jù),則直接返回,否則會(huì)從磁盤讀入緩存區(qū)的sublist of old blocks區(qū)域,然后再移動(dòng)到sublist of new blocks區(qū)域,并通過(guò)LRU最近最少使用算法來(lái)剔除舊數(shù)據(jù)。然而,有些SQL語(yǔ)句做統(tǒng)計(jì)用全表掃描,會(huì)進(jìn)入sublist of new blocks區(qū)域,把一些真正的熱數(shù)據(jù)“踢走”,導(dǎo)致緩沖區(qū)的數(shù)據(jù)頻繁進(jìn)出,磁盤I/O頻繁。為了解決這個(gè)問(wèn)題,可以控制進(jìn)入緩沖區(qū)sublist of old blocks區(qū)域的數(shù)量(innodb_old_blocks_pct參數(shù)),以