MySQL 8.0 参考手册  / 第8章优化  / 8.10 缓冲和缓存  /  8.10.2 MyISAM 键缓存

8.10.2 MyISAM 键缓存

为了最小化磁盘 I/O,MyISAM存储引擎采用了一种被许多数据库管理系统使用的策略。它采用缓存机制将最常访问的表块保存在内存中:

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

  • 对于数据块,MySQL 没有使用专门的缓存。相反,它依赖于本机操作系统文件系统缓存。

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

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

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

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

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

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

键缓存结构中的所有块缓冲区大小相同。此大小可以等于、大于或小于表索引块的大小。通常这两个值之一是另一个的倍数。

当必须访问来自任何表索引块的数据时,服务器首先检查它是否在键缓存的某个块缓冲区中可用。如果是,则服务器访问密钥缓存中的数据而不是磁盘上的数据。也就是说,它从缓存中读取或写入缓存,而不是从磁盘读取或写入。否则,服务器选择一个包含不同表索引块(或多个块)的缓存块缓冲区,并用所需表索引块的副本替换那里的数据。只要新的索引块在缓存中,就可以访问索引数据。

如果碰巧选择用于替换的块已被修改,则该块被认为是脏的”。在这种情况下,在被替换之前,它的内容被刷新到它来自的表索引中。

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

存储引擎还使用InnoDBLRU 算法来管理其缓冲池。请参阅 第 14.5.1 节,“缓冲池”