從 MySQL 8.4 開始,此處討論的用於參考多個 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