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