1. 程式人生 > >(轉)MyISAM Key Cache詳解及優化

(轉)MyISAM Key Cache詳解及優化

磁盤 詳解 update 根據 進行 緩沖 write 隊列 但是

原文:http://huanghualiang.blog.51cto.com/6782683/1372721

一、MyISAM Key Cache詳解:

為了最小化磁盤I/O,MyISAM將最頻繁訪問的索引塊(“indexblock”)都放在內存中,這樣的內存緩沖區我們稱之為Key Cache,它的大小可以通過參數key_buffer_size來控制。在MyISAM的索引文件中(MYI),連續的單元(contiguous unit)組成一個Block,Index block的大小等於該BTree索引節點的大小。Key Cache就是以Block為單位的。

1. MyISAM如何使用Key Cache

當MySQL請求(讀或寫)MyISAM索引文件中某個IndexBlock時,首先會看Key Cache隊列中是否已經緩存了對應block。如果有,就直接在Key Cache隊列中進行讀寫了,不再需要請求磁盤。如果是寫請求,那麽Key Cache中的對應Block就會被標記為Dirty(和磁盤不一致)。在MyISAM在Key Cache成功請求(讀寫)某個Block後,會將該Block放到Key Cache隊列的頭部。

如果Key Cache中沒有待請求(讀或寫)的Block,MyISAM會向磁盤請求對應的Block,並將其放到KeyCache的隊列頭部。隊列如果滿了,會將隊列尾部的Block刪除,該Block如果是Dirty的,會將其Flush到磁盤上。我們看到MyISAM維護了一個LRU(Least Recently Used)的Key Cache隊列。隊列中的Dirty Block會在Block被踢出隊列時Flush到磁盤上。

2. 並發訪問

Key Cache中的index Block是可以被並發訪問的(Shared access ),下面是一些規則:

a.多個沒有更新操作的session可以並發同一個block buffer

b.多個session同時訪問某一個block buffer,如果某個session是update操作,則優先訪問

c.多個session如果都需要進行block replacement,是可以並發操作。(從index file中讀取block更新到key cache,但是key cache已滿,需要刪除一些block buffer的操作叫做block replacement)

設置多key buffer

set global hot.key_buffer_size=xx; #hot、cold 是key buffer的名字,可隨意取

set global colkd.key_buffer_size=xx;

CACHE INDEX example.top_message IN hot_cache

CACHE INDEX example.event IN cold_cache

LOAD INDEX INTO CACHEexample.top_message,example.event IGNORE LEAVES; #預加載,可以放在配制文件中,啟動後數據庫key buffer命中率會提升.

LOAD INDEX INTO CACHE example.user IGNORELEAVERS,expamle.groups

二、MySQL管理key buffer算法:

MySQL默認使用LRU算法(因默認key_cache_division_limit= 100,只有一個chain,不使用“中點插入算法”。

Key Cache的LRU算法,作為對LRU算法的改進,MyISAM還提供了另一個緩存算法:“MidpointInsertion Strategy”。

Midpoint Insertion Strategy(中點插入算法)-將LRU鏈分成hot子表warm子表。

1. 相關參數

該策略涉及的參數有:key_cache_division_limit、key_cache_age_threshold

key_cache_division_limit=70 -- %30的緩存做hot

key_cache_age_threshold:Hotsub-chain中的頂部的block停留時間超過一個閾值後就會被降級到warm sub-chain。具體的計算方法是:設N為key cache中的block個數,如果在最近的N*key_cache_age_threshold/100次訪問中,keycache頂部的block仍然沒有被訪問到,那麽就會被移到warmsub-chain的頂部。

2. 原理介紹

(1).該策略將前面的LRU隊列(LRU Chain)分成兩部分,hot sub-chain和warm sub-chain。並根據參數key_cache_division_limit劃分,總保持warm sub-chain在這個百分比以上。默認情況key_cache_division_limit是100,所以默認時候只有warmsub-chain,即LRU Chain。

(註:Multiple Key cache情況,每個key cache都有對應的key_cache_division_limit值)

(2).在warm sub-chain中的某個block如果被訪問(Access)次數超過某個值時候,就將該block放到hot sub-chain的底部。

(3).在hot sub-chain中的block會隨著每一次的hit調整位置,hit越多,越接近底部。在頂部停留時間過長就會被降級到warm sub-chain中,而且是warm sub-chain的頂部(很可能很快就會被移出key cache)。

(4).Hot sub-chain中的頂部的block停留時間超過一個閾值後就會被降級到warm sub-chain。這個閾值由參數key_cache_age_threshold決定。具體的計算方法是:設N為key cache中的block個數,如果在最近的(N*key_cache_age_threshold/100)次訪問中,keycache頂部的block仍然沒有被訪問到,那麽就會被移到warm sub-chain的頂部。

(5).默認情況key_cache_division_limit = 100,這時只有只有一個Chain,所以不使用該策略。即退化的Midpoint Insertion Strategy是LRU算法。

*key buffer一些參數指標:

物理讀:key_read/key_read_requests一般要應小於0.01,否則key buffer設置小了。

key_writes/key_write_requests #看寫多不多,若很多接近1

使用率:1-((key_block_unused*key_cache_block_size)/key_buffer_size) # 一般在80%左右比較優,大於80%,可能是keybuffer設置過小,小於80% 可能是key buffer設置過大,導致內存資源浪費。

(轉)MyISAM Key Cache詳解及優化