為了盡量減少磁碟 I/O,MyISAM
儲存引擎採用了許多資料庫管理系統使用的策略。它採用快取機制,將最常存取的表格區塊保留在記憶體中。
對於索引區塊,維護一個稱為索引快取 (或索引緩衝區) 的特殊結構。該結構包含多個區塊緩衝區,其中放置最常用的索引區塊。
對於資料區塊,MySQL 不使用特殊快取。而是依賴作業系統的原生檔案系統快取。
本節首先說明 MyISAM
索引快取的基本操作。然後討論改進索引快取效能並讓您能夠更好地控制快取操作的功能。
多個工作階段可以同時存取快取。
您可以設定多個索引快取,並將表格索引指派給特定的快取。
若要控制索引快取的大小,請使用 key_buffer_size
系統變數。如果此變數設定為零,則不使用索引快取。如果 key_buffer_size
值太小而無法配置最少數量的區塊緩衝區 (8 個),則也不會使用索引快取。
當索引快取無法運作時,只會使用作業系統提供的原生檔案系統緩衝來存取索引檔案。(換句話說,表格索引區塊使用的存取策略與表格資料區塊所使用的策略相同。)
索引區塊是存取 MyISAM
索引檔案的連續單位。通常,索引區塊的大小等於索引 B 樹節點的大小。(索引在磁碟上使用 B 樹資料結構表示。樹底部的節點是分葉節點。分葉節點上方的節點是非分葉節點。)
索引快取結構中的所有區塊緩衝區大小都相同。此大小可以等於、大於或小於表格索引區塊的大小。通常,這兩個值其中一個是另一個的倍數。
當需要存取任何資料表索引區塊的資料時,伺服器會先檢查該區塊是否已存在於金鑰快取的某些區塊緩衝區中。如果存在,伺服器會存取金鑰快取中的資料,而不是從磁碟存取。也就是說,它是從快取讀取或寫入快取,而不是從磁碟讀取或寫入。否則,伺服器會選擇包含不同資料表索引區塊的快取區塊緩衝區,並將該處的資料替換為所需資料表索引區塊的副本。一旦新的索引區塊進入快取,就可以存取索引資料。
如果選來替換的區塊剛好被修改過,該區塊會被視為「髒的」。在這種情況下,在被替換之前,其內容會被刷新回它所來自的資料表索引。
通常,伺服器會遵循LRU(最近最少使用)策略:在選擇要替換的區塊時,它會選擇最近最少使用的索引區塊。為了更容易做出此選擇,金鑰快取模組會將所有已使用的區塊維護在一個特殊列表(LRU 鏈)中,該列表會依使用時間排序。當存取一個區塊時,它會變成最近最常使用,並放置在列表的末尾。當需要替換區塊時,列表開頭的區塊是最近最少使用的區塊,並成為第一個被逐出的候選者。
InnoDB
儲存引擎也使用 LRU 演算法來管理其緩衝池。請參閱第 17.5.1 節「緩衝池」。