默认情况下,键缓存管理系统使用简单的 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 的值。然后,即使在索引扫描操作期间,有价值的、经常命中的节点也会保留在热子列表中。