文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  多重索引快取

10.10.2.2 多重索引快取

注意

從 MySQL 9.0 開始,此處討論的用於參考多個 MyISAM 索引快取的複合部分結構化變數語法已棄用。

共用存取索引快取可提升效能,但無法完全消除工作階段之間的競爭。它們仍然會為了管理存取索引快取緩衝區的控制結構而競爭。為了進一步減少索引快取存取競爭,MySQL 還提供了多個索引快取。此功能可讓您將不同的資料表索引指派給不同的索引快取。

當有多個索引快取時,伺服器必須知道在處理給定 MyISAM 資料表的查詢時要使用哪個快取。預設情況下,所有 MyISAM 資料表索引都會快取在預設索引快取中。若要將資料表索引指派給特定的索引快取,請使用 CACHE INDEX 語句 (請參閱 第 15.7.8.2 節,「CACHE INDEX 語句」)。例如,下列語句將來自資料表 t1t2t3 的索引指派給名為 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_sizekeycache1 是快取變數名稱,而 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_cachecold_cache

CACHE INDEX db1.t1, db1.t2, db2.t3 IN hot_cache
CACHE INDEX db1.t4, db2.t5, db2.t6 IN cold_cache