中点插入策略
默认地,MySQL 4.1的索引缓存管理系统采用LRU策略来选择要被清除的缓存区块,不过它也支持更完善的方法,叫做"中点插入策略"。
使用中点插入策略时,LRU链就被分割成两半:一个热子链,一个温子链。两半分割的点不是固定的,不过缓存管理系统会注意不让温子链部分"太短",总是至少包括全部缓存区块的 key_cache_division_limit 比率。key_cache_division_limit 是缓存结构体变量的组件部分,因此它是每个缓存都可以设置这个参数值。
当一个索引区块从表中读入缓存时,它首先放在温子链的末尾。当达到一定的点击率(访问这个区块)后,它就提升到热子链中去。目前,要提升一个区块的点击率(3)对每个区块来说都是一样的。将来,我们会让点击率依靠B树中对应的索引区块节点的级别:包含非叶子节点的索引区块所要求的提升点击率就低一点,包含叶子节点的B索引树的区块的值就高点。
提升起来的区块首先放在热子链的末尾。这个区块在热子链内一直循环。如果这个区块在该子链开头位置停留时间足够长了,它就会被降级回温子链。这个时间是由索引缓存结构体变量的组件 key_cache_age_threshold 值来决定的。
这个阀值是这么描述的,一个索引缓存包含了 N 个区块,热子链开头的区块在低于 N*key_cache_age_threshold/100 次访问后就被移动到温子链的开头位置。它又首先成为被删除的候选对象,因为要被替换的区块还是从温子链的开头位置开始的。
中点插入策略就能在缓存中总能保持更有价值的区块。如果更喜欢采用LRU策略,只需让 key_cache_division_limit 的值低于默认值 100。
中点插入策略能帮助改善在执行需要有效扫描索引,它会将所有对应到B树中高级别的有价值的节点推出的查询时的性能。为了避免这样,就必须设定 key_cache_division_limit 远远低于100以采用中点插入策略。则在扫描索引操作时那些有价值的频繁点击的节点就会保留在热子链中了。
索引预载入
如果索引缓存中有足够的区块用来保存全部索引,或者至少足够保存全部非叶子节点,那么在使用前就载入索引缓存就很有意义了。将索引区块以十分有效的方法预载入索引缓存缓冲:从磁盘中顺序地读取索引区块。
没有预载入,查询所需的索引区块仍然需要被放到缓存中去。虽然索引区块要保留在缓存中,因为有足够的缓冲,它们可以从磁盘中随机读取到,而非顺序地。
想要预载入缓存,可以使用 LOAD INDEX INTO CACHE 语句。如下语句预载入了表 t1 和 t2 的索引节点(区块):
mysql> LOAD INDEX INTO CACHE t1, t2 IGNORE LEAVES; +---------+--------------+----------+----------+ | Table | Op | Msg_type | Msg_text | +---------+--------------+----------+----------+ | test.t1 | preload_keys | status | OK | | test.t2 | preload_keys | status | OK | +---------+--------------+----------+----------+ |
增加修饰语 IGNORE LEAVES 就只预载入非叶子节点的索引区块。因此,上述语句加载了 t1 的全部索引区块,但是只加载 t2 的非叶子节点区块。
如果使用 CACHE INDEX 语句将索引指向一个索引缓存,将索引区块预先放到那个缓存中去。否则,索引区块只会加载到默认的缓存中去。

