10.10.2 MyISAM 键缓存
为了减少磁盘I/O,MyISAM存储引擎使用了许多数据库管理系统所用的策略之一。它使用一个缓存机制来将最频繁访问的表块保留在内存中:
-
对于索引块,特殊结构称为键缓存(或键缓冲区)被维护。该结构包含多个块缓冲区,其中最常用的索引块被放置。
-
对于数据块,MySQL 不使用特殊的缓存,而是依赖于操作系统的文件系统缓存。
本节首先描述了 MyISAM
键缓存的基本操作,然后讨论了改进键缓存性能和控制缓存操作的特性:
-
多个会话可以并发访问缓存。
-
您可以设置多个键缓存,并将表索引分配到特定的缓存中。
要控制键缓存的大小,请使用 key_buffer_size
系统变量。如果该变量设置为零,则不使用键缓存。键缓存也不会被使用,如果 key_buffer_size
值太小,以至于无法分配最少的块缓冲区(8个)。
当键缓存不操作时,索引文件将使用操作系统提供的原生文件系统缓冲区来访问。 (换言之,表索引块将使用与表数据块相同的策略来访问。)
索引块是一个连续的访问单元,对 MyISAM
索引文件进行访问。通常索引块的大小等于索引 B 树中的节点大小。 (索引使用磁盘上的 B 树数据结构表示。叶子节点位于树底部,非叶子节点位于上层。)
键缓存结构中的所有块缓冲区都具有相同的大小。这個大小可以等于、大于或小于表索引块的大小。通常这两个值之一是另一个的倍数。
当从任何表索引块中访问数据时,服务器首先检查该索引块是否在键缓存中的某个块缓冲区中。如果是,它将从缓存中读取或写入,而不是从磁盘上读取或写入。否则,服务器选择一个包含不同表索引块(或块)的缓存块缓冲区,并将所需的索引块复制到该缓存中。随着新的索引块在缓存中可用,索引数据可以被访问。
如果选择替换的块已经被修改过,该块将被认为是“脏”的。在这种情况下,prior to being replaced,它们的内容将被刷新到其原始表索引中。
通常服务器遵循LRU(最近最少使用)策略:当选择替换块时,它选择了最近最少使用的索引块。为了使这个选择变得更容易,键缓存模块维护了一个特殊列表(LRU链),该列表按时间顺序排列。每当访问块时,它将被置于列表末尾,因为它是最新使用的。当需要替换块时,列表开头的块是最近最少使用的,并且成为首选候选。
InnoDB
存储引擎也使用LRU算法来管理其缓冲池。请参阅第17.5.1节,“缓冲池”。