資源描述:
《mysql存儲(chǔ)引擎優(yōu)化》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、存儲(chǔ)引擎優(yōu)化MyISAM存儲(chǔ)引擎優(yōu)化我們知道,MyISAM存儲(chǔ)引擎是MySQL最為古老的存儲(chǔ)引擎之一,也是最為流行的存儲(chǔ)引擎之一。對(duì)于以讀請(qǐng)求為主的非事務(wù)系統(tǒng)來說,MyISAM存儲(chǔ)引擎由于其優(yōu)異的性能表現(xiàn)及便利的維護(hù)管理方式無疑是大家最優(yōu)先考慮的對(duì)象。我們將通過分析MyISAM存儲(chǔ)引擎的相關(guān)特性,來尋找提高M(jìn)yISAM存儲(chǔ)引擎性能的優(yōu)化策略。索引緩存優(yōu)化MyISAM存儲(chǔ)引擎的緩存策略是其和很多其他數(shù)據(jù)庫乃至MySQL數(shù)據(jù)庫的很多其他存儲(chǔ)引擎不太一樣的最大特性。因?yàn)樗麅H僅緩存索引數(shù)據(jù),并不會(huì)緩存實(shí)際的表數(shù)據(jù)信息到內(nèi)存中,而是將這一工作交給了OS級(jí)別的文件系統(tǒng)緩存。所以,在數(shù)據(jù)
2、庫優(yōu)化中非常重要的優(yōu)化環(huán)節(jié)之一“緩存優(yōu)化”的工作在使用MyISAM存儲(chǔ)引擎的數(shù)據(jù)庫的情況下,就完全集中在對(duì)索引緩存的優(yōu)化上面了。在分析優(yōu)化索引緩存策略之前,我們先大概了解一下MyISAM存儲(chǔ)引擎的索引實(shí)現(xiàn)機(jī)制以及索引文件的存放格式。MyISAM存儲(chǔ)引擎的索引和數(shù)據(jù)是分開存放于“.MYI”文件中,每個(gè)“.MYI”文件由文件頭和實(shí)際的索引數(shù)據(jù)。“.MYI”的文件頭中主要存放四部分信息,分別稱為:state(主要是整個(gè)索引文件的基本信息),base(各個(gè)索引的相關(guān)信息,主要是索引的限制信息),keydef(每個(gè)索引的定義信息)和recinfo(每個(gè)索引記錄的相關(guān)信息)。在文件頭后
3、面緊接著的就是實(shí)際的索引數(shù)據(jù)信息了。索引數(shù)據(jù)以Block(Page)為最小單位,每個(gè)block中只會(huì)存在同一個(gè)索引的數(shù)據(jù),這主要是基于提高索引的連續(xù)讀性能的目的。在MySQL中,索引文件中索引數(shù)據(jù)的block被稱為IndexBlock,每個(gè)IndexBlock的大小并不一定相等。在“.MYI”中,IndexBlock的組織形式實(shí)際上只是一種邏輯上的,并不是物理意義上的。在物理上,實(shí)際上是以FileBlock的形式來存放在磁盤上面的。在KeyCache中緩存的索引信息是以“CacheBlock”的形式組織存放的,“CacheBlock”是相同大小的,和“.MYI”文件物理存儲(chǔ)
4、的Block(FileBlock)一樣。在一條Query通過索引檢索表數(shù)據(jù)的時(shí)候,首先會(huì)檢查索引緩存(key_buffer_cache)中是否已經(jīng)有需要的索引信息,如果沒有,則會(huì)讀取“.MYI”文件,將相應(yīng)的索引數(shù)據(jù)讀入KeyCache中的內(nèi)存空間中,同樣也是以Block形式存放,被稱為CacheBlock。不過,數(shù)據(jù)的讀入并不是以IndexBlock的形式來讀入,而是以FileBlock的形式來讀入的。以FileBlock形式讀入到KeyCache之后的CacheBlock實(shí)際上是于FileBlock完全一樣的。如下圖所示:當(dāng)我們從“.MYI”文件中讀入FileBlock
5、到KeyCache中CacheBlock時(shí)候,如果整個(gè)KeyCache中已經(jīng)沒有空閑的CacheBlock可以使用的話,將會(huì)通過MySQL實(shí)現(xiàn)的LRU相關(guān)算法將某些CacheBlock清除出去,讓新進(jìn)來的FileBlock有地方呆。我們先來分析一下與MyISAM索引緩存相關(guān)的幾個(gè)系統(tǒng)參數(shù)和狀態(tài)參數(shù):◆key_buffer_size,索引緩存大??;這個(gè)參數(shù)用來設(shè)置整個(gè)MySQL中的常規(guī)KeyCache大小。一般來說,如果我們的MySQL是運(yùn)行在32位平臺(tái)紙上,此值建議不要超過2GB大小。如果是運(yùn)行在64位平臺(tái)紙上則不用考慮此限制,但也最好不要超過4GB。◆key_buffer
6、_block_size,索引緩存中的CacheBlockSize;在前面我們已經(jīng)介紹了,在KeyCache中的所有數(shù)據(jù)都是以CacheBlock的形式存在,而key_buffer_block_size就是設(shè)置每個(gè)CacheBlock的大小,實(shí)際上也同時(shí)限定了我們將“.MYI”文件中的IndexBlock被讀入時(shí)候的FileBlock的大小?!鬹ey_cache_division_limit,LRU鏈表中的HotArea和WarmArea分界值;實(shí)際上,在MySQL的KeyCache中所使用的LRU算法并不像傳統(tǒng)的算法一樣僅僅只是通過訪問頻率以及最后訪問時(shí)間來通過一個(gè)唯一的鏈
7、表實(shí)現(xiàn),而是將其分成了兩部分。一部分用來存放使用比較頻繁的HotCackeLock(HotChain),被成為HotArea,另外一部分則用來存放使用不是太頻繁的WarmCacheBlock(WarmChain),被成為WarmArea。這樣做的目的主要是為了保護(hù)使用比較頻繁的CacheBlock更不容易被換出。而key_cache_division_limit參數(shù)則是告訴MySQL該如何劃分整個(gè)CacheChain劃分為HotChain和WarmChain兩部分,參數(shù)值為WarmChain占整個(gè)Chain的百分比