Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  The MyISAM Key Cache

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节,“缓冲池”