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