### 8.10.2 MyISAM 密钥缓存

[8.10.2.1 共享密钥缓存访问](shared-key-cache.html)
[8.10.2.2 多键缓存](multiple-key-caches.html)
[8.10.2.3 中点插入策略](midpoint-insertion.html)
[8.10.2.4 索引预加载](index-preloading.html)
[8.10.2.5 密钥缓存块大小](key-cache-block-size.html)
[8.10.2.6 重构密钥缓存](key-cache-restructuring.html)

[](<>)[](<>)

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

-   对于索引块，维护一个称为键缓存（或键缓冲区）的特殊结构。该结构包含许多块缓冲区，其中放置了最常用的索引块。

-   对于数据块，MySQL 没有使用特殊的缓存。相反，它依赖于本机操作系统文件系统缓存。

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

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

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

    要控制密钥缓存的大小，请使用[`按键缓冲区大小`](server-system-variables.html#sysvar_key_buffer_size)系统变量。如果此变量设置为零，则不使用密钥缓存。如果[`按键缓冲区大小`](server-system-variables.html#sysvar_key_buffer_size)值太小，无法分配最小数量的块缓冲区（8）。

    当密钥缓存不工作时，只使用操作系统提供的本机文件系统缓冲来访问索引文件。（换句话说，使用与表数据块相同的策略访问表索引块。）

    索引块是访问数据的连续单元`米萨姆`索引文件。通常，索引块的大小等于索引B树的节点大小。（索引在磁盘上使用B-树数据结构表示。树底部的节点是叶节点。叶节点上方的节点是非叶节点。）

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

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

    如果选择替换的块被修改，则该块被视为“脏”在这种情况下，在被替换之前，它的内容会被刷新到它所在的表索引中。

    通常，服务器遵循LRU（最近使用最少的）策略：在选择要替换的块时，它会选择最近使用最少的索引块。为了使这个选择更容易，密钥缓存模块在一个按使用时间排序的特殊列表（LRU链）中维护所有使用的块。当访问一个块时，它是最近使用的，并被放置在列表的末尾。当需要更换街区时，位于列表开头的街区是最近使用最少的，并成为第一批被驱逐的候选街区。

    这个`InnoDB`存储引擎还使用LRU算法来管理其缓冲池。看见[第15.5.1节“缓冲池”](innodb-buffer-pool.html).
