CACHE INDEX {
tbl_index_list [, tbl_index_list] ...
| tbl_name PARTITION (partition_list)
}
IN key_cache_name
tbl_index_list:
tbl_name [{INDEX|KEY} (index_name[, index_name] ...)]
partition_list: {
partition_name[, partition_name] ...
| ALL
}
CACHE INDEX
語法會將資料表索引指派給特定的索引快取。它僅適用於 MyISAM
資料表,包括分割的 MyISAM
資料表。索引指派後,若有需要,可以使用 LOAD INDEX INTO CACHE
將其預先載入快取。
以下語法會將資料表 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 |
+---------+--------------------+----------+----------+
CACHE INDEX
的語法可讓您指定只有資料表中的特定索引應指派給快取。但是,實作方式是將資料表的所有索引指派給快取,因此沒有理由指定資料表名稱以外的任何內容。
在 CACHE INDEX
語法中參考的索引快取,可以透過設定參數語法或在伺服器參數設定中設定其大小來建立。例如:
SET GLOBAL keycache1.key_buffer_size=128*1024;
索引快取參數會以結構化系統變數的成員來存取。請參閱第 7.1.9.5 節「結構化系統變數」。
在您將索引指派給索引快取之前,該快取必須存在,否則會發生錯誤。
mysql> CACHE INDEX t1 IN non_existent_cache;
ERROR 1284 (HY000): Unknown key cache 'non_existent_cache'
預設情況下,資料表索引會指派給伺服器啟動時建立的主要(預設)索引快取。當索引快取被銷毀時,所有指派給它的索引都會重新指派給預設索引快取。
索引指派會影響伺服器全域:如果一個客戶端將索引指派給給定的快取,則無論哪個客戶端發出查詢,此快取都會用於所有涉及該索引的查詢。
分割的 MyISAM
資料表支援 CACHE INDEX
。您可以將一個或多個分割區的一個、數個或所有索引指派給給定的索引快取。例如,您可以執行以下操作:
CREATE TABLE pt (c1 INT, c2 VARCHAR(50), INDEX i(c1))
ENGINE=MyISAM
PARTITION BY HASH(c1)
PARTITIONS 4;
SET GLOBAL kc_fast.key_buffer_size = 128 * 1024;
SET GLOBAL kc_slow.key_buffer_size = 128 * 1024;
CACHE INDEX pt PARTITION (p0) IN kc_fast;
CACHE INDEX pt PARTITION (p1, p3) IN kc_slow;
先前的語法集會執行以下動作:
建立一個具有 4 個分割區的分割資料表;這些分割區會自動命名為
p0
、...、p3
;此資料表在c1
資料行上具有名為i
的索引。建立 2 個名為
kc_fast
和kc_slow
的索引快取。將分割區
p0
的索引指派給kc_fast
索引快取,並將分割區p1
和p3
的索引指派給kc_slow
索引快取;剩餘分割區(p2
)的索引會使用伺服器的預設索引快取。
如果您希望將資料表 pt
中所有分割區的索引指派給名為 kc_all
的單一索引快取,您可以使用以下兩個語法中的任何一個:
CACHE INDEX pt PARTITION (ALL) IN kc_all;
CACHE INDEX pt IN kc_all;
剛才顯示的兩個語法是等效的,並且發出任一語法都具有完全相同的效果。換句話說,如果您希望將分割資料表的所有分割區的索引指派給相同的索引快取,則 PARTITION (ALL)
子句是可選的。
將多個分割區的索引指派給索引快取時,分割區不必是連續的,而且您不必按任何特定順序列出它們的名稱。任何未明確指派給索引快取的分割區索引都會自動使用伺服器預設索引快取。
分割的 MyISAM
資料表也支援索引預先載入。如需更多資訊,請參閱第 15.7.8.5 節「LOAD INDEX INTO CACHE 語法」。