从 MySQL 8.3 开始,讨论的复合部分结构变量语法用于引用多个 MyISAM
键高速缓存已弃用。
共享访问键高速缓存可以提高性能,但不能完全消除会话之间的竞争。它们仍然竞争控制结构,以访问键高速缓存缓冲区。为了进一步减少键高速缓存访问竞争,MySQL 还提供了多个键高速缓存。该功能使您可以将不同的表索引分配给不同的键高速缓存。
在存在多个键高速缓存时,服务器必须知道在处理查询时使用哪个高速缓存。默认情况下,所有 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 |
+---------+--------------------+----------+----------+
在 CACHE INDEX
语句中引用的键高速缓存可以通过设置其大小使用 SET GLOBAL
参数设置语句或使用服务器启动选项创建。例如:
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