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 語法」。