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