默认情况下,键缓存管理系统使用简单的 LRU 策略来选择要驱逐的键缓存块,但它也支持一种更复杂的方法,称为 中点插入策略。
使用中点插入策略时,LRU 链被分成两部分:一个热点子列表和一个暖色子列表。两部分之间的分割点不是固定的,但键缓存管理系统会确保暖色部分不会 “太短”,始终至少包含 key_cache_division_limit
百分比的键缓存块。 key_cache_division_limit
是结构化键缓存变量的一部分,因此它的值是每个缓存可以设置的参数。
当从表中读取索引块到键缓存时,它会被放置在暖色子列表的末尾。在一定数量的命中(访问块)之后,它会被提升到热点子列表。目前,提升块所需命中的数量(3)对所有索引块都是相同的。
提升到热点子列表的块会被放置在列表的末尾。然后该块在这个子列表中循环。如果该块在子列表的开头停留足够长的时间,它会被降级到暖色子列表。这段时间由 key_cache_age_threshold
键缓存组件的值决定。
阈值规定,对于包含 N
个块的键缓存,在最后
次命中内没有访问的热点子列表开头的块将被移动到暖色子列表的开头。然后它将成为第一个被驱逐的候选者,因为要替换的块总是从暖色子列表的开头获取。N
* key_cache_age_threshold / 100
中点插入策略使您能够始终将更有价值的块保留在缓存中。如果您想使用简单的 LRU 策略,请将 key_cache_division_limit
值设置为其默认值 100。
中点插入策略有助于提高性能,因为当执行需要索引扫描的查询时,实际上会从缓存中推出现有价值的高级 B 树节点的索引块。为了避免这种情况,您必须使用中点插入策略,并将 key_cache_division_limit
设置为远小于 100 的值。然后,在索引扫描操作期间,也会在热点子列表中保留有价值的频繁命中节点。