從 MySQL 9.0 開始,此處討論的用於參考多個 MyISAM
索引快取的複合部分結構化變數語法已棄用。
共用存取索引快取可提升效能,但無法完全消除工作階段之間的競爭。它們仍然會為了管理存取索引快取緩衝區的控制結構而競爭。為了進一步減少索引快取存取競爭,MySQL 還提供了多個索引快取。此功能可讓您將不同的資料表索引指派給不同的索引快取。
當有多個索引快取時,伺服器必須知道在處理給定 MyISAM
資料表的查詢時要使用哪個快取。預設情況下,所有 MyISAM
資料表索引都會快取在預設索引快取中。若要將資料表索引指派給特定的索引快取,請使用 CACHE INDEX
語句 (請參閱 第 15.7.8.2 節,「CACHE INDEX 語句」)。例如,下列語句將來自資料表 t1
、t2
和 t3
的索引指派給名為 hot_cache
的索引快取
mysql> CACHE INDEX t1, t2, t3 IN hot_cache;
+---------+--------------------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------+--------------------+----------+----------+
| test.t1 | assign_to_keycache | status | OK |
| test.t2 | assign_to_keycache | status | OK |
| test.t3 | assign_to_keycache | status | OK |
+---------+--------------------+----------+----------+
可以使用 SET GLOBAL
參數設定語句或使用伺服器啟動選項來設定其大小,以建立 CACHE INDEX
語句中參考的索引快取。例如
mysql> SET GLOBAL keycache1.key_buffer_size=128*1024;
若要銷毀索引快取,請將其大小設定為零
mysql> SET GLOBAL keycache1.key_buffer_size=0;
您無法銷毀預設索引快取。任何嘗試這樣做的行為都會被忽略
mysql> SET GLOBAL key_buffer_size = 0;
mysql> SHOW VARIABLES LIKE 'key_buffer_size';
+-----------------+---------+
| Variable_name | Value |
+-----------------+---------+
| key_buffer_size | 8384512 |
+-----------------+---------+
索引快取變數是具有名稱和元件的結構化系統變數。對於 keycache1.key_buffer_size
,keycache1
是快取變數名稱,而 key_buffer_size
是快取元件。有關用於參考結構化索引快取系統變數的語法的說明,請參閱 第 7.1.9.5 節,「結構化系統變數」。
預設情況下,資料表索引會指派給在伺服器啟動時建立的主要 (預設) 索引快取。當索引快取被銷毀時,所有指派給它的索引都會重新指派給預設索引快取。
對於忙碌的伺服器,您可以使用包含三個索引快取的策略
一個 「熱門」索引快取,佔所有索引快取配置空間的 20%。將此用於大量用於搜尋但不更新的資料表。
一個 「冷門」索引快取,佔所有索引快取配置空間的 20%。將此快取用於中型、密集修改的資料表,例如暫存資料表。
一個佔用索引鍵快取空間 60% 的「暖」索引鍵快取。將其作為預設的索引鍵快取,預設用於所有其他表格。
使用三個索引鍵快取的好處之一是,存取一個索引鍵快取結構不會阻礙對其他結構的存取。存取指定到某個快取的表格的陳述式,不會與存取指定到另一個快取的表格的陳述式競爭。效能提升還有其他原因。
熱快取僅用於檢索查詢,因此其內容永遠不會被修改。因此,每當需要從磁碟提取索引區塊時,無需先清除選擇用於替換的快取區塊的內容。
對於指定到熱快取的索引,如果沒有查詢需要索引掃描,則索引 B 樹的非葉節點對應的索引區塊有很高的機率會保留在快取中。
當更新的節點在快取中且無需先從磁碟讀取時,對臨時表格執行最頻繁的更新操作會快得多。如果臨時表格的索引大小與冷索引鍵快取的大小相當,則更新的節點在快取中的機率非常高。
CACHE INDEX
陳述式會建立表格與索引鍵快取之間的關聯,但每次伺服器重新啟動時,該關聯都會遺失。如果您希望該關聯在每次伺服器啟動時都生效,一種方法是使用選項檔案:包含設定您的索引鍵快取的變數設定,以及一個init_file
系統變數,該變數指定一個包含要執行的CACHE INDEX
陳述式的檔案。例如
key_buffer_size = 4G
hot_cache.key_buffer_size = 2G
cold_cache.key_buffer_size = 2G
init_file=/path/to/data-directory/mysqld_init.sql
mysqld_init.sql
中的陳述式會在每次伺服器啟動時執行。該檔案每行應包含一個 SQL 陳述式。以下範例將數個表格分別指定到 hot_cache
和 cold_cache
。
CACHE INDEX db1.t1, db1.t2, db2.t3 IN hot_cache
CACHE INDEX db1.t4, db2.t5, db2.t6 IN cold_cache