8.10.2 MyISAM 密钥缓存

为了最大程度地减少磁盘 I/O,MyISAM存储引擎采用了许多数据库 Management 系统所使用的策略。它使用缓存机制将最常访问的 table 块保留在内存中:

  • 对于索引块,维护一个称为键缓存(或键缓冲区)的特殊结构。该结构包含许多块缓冲区,在这些缓冲区中放置了最常用的索引块。

  • 对于数据块,MySQL 不使用特殊的缓存。相反,它依赖于本机 os 文件系统缓存。

本节首先介绍MyISAM键缓存的基本操作。然后讨论了可提高关键高速缓存性能并使您更好地控制高速缓存操作的功能:

  • 多个会话可以同时访问缓存。

  • 您可以设置多个键高速缓存,并将 table 索引分配给特定的高速缓存。

要控制密钥缓存的大小,请使用key_buffer_size系统变量。如果此变量设置为零,则不使用任何密钥缓存。如果key_buffer_size值太小而无法分配最小数量的块缓冲区(8),则也不使用键高速缓存。

当键高速缓存不可用时,仅使用 os 提供的本机文件系统缓冲来访问索引文件。 (换句话说,使用与 table 数据块相同的策略访问 table 索引块.)

索引块是对MyISAM索引文件的连续访问单元。通常,索引块的大小等于索引 B 树的节点的大小。 (索引是使用 B 树数据结构在磁盘上 table 示的.树底部的节点是叶节点.叶节点上方的节点是非叶节点.)

密钥高速缓存结构中的所有块缓冲区的大小均相同。该大小可以等于,大于或小于 table 索引块的大小。通常,这两个值之一是另一个的倍数。

当必须访问任何 table 索引块中的数据时,服务器首先检查键高速缓存的某些块缓冲区中是否可用。如果是这样,服务器将访问密钥缓存中的数据,而不是磁盘上的数据。也就是说,它从缓存中读取或写入缓存,而不是从磁盘读取或写入磁盘。否则,服务器将选择一个包含另一个 table 索引块的缓存块缓冲区,并用所需 table 索引块的副本替换那里的数据。一旦新的索引块位于缓存中,就可以访问索引数据。

如果碰巧选择要替换的块已被修改,则将该块视为“脏”。在这种情况下,在替换之前,其内容将刷新到它来自的 table 索引中。

通常,服务器遵循 LRU(最近最少使用)策略:选择要替换的块时,它会选择最近最少使用的索引块。为了使选择更加容易,密钥缓存模块将所有使用的块维护在按使用时间排序的特殊列 table(LRU 链)中。当访问一个块时,它是最近使用的块,并位于列 table 的末尾。当需要替换块时,列 table 开头的块是最近最少使用的块,成为驱逐的第一个候选者。

InnoDB存储引擎还使用 LRU 算法来 Management 其缓冲池。参见第 14.5.1 节“缓冲池”