Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Multiple Key Caches

10.10.2.2 多个键高速缓存

Note

从 MySQL 8.3 开始,讨论的复合部分结构变量语法用于引用多个 MyISAM 键高速缓存已弃用。

共享访问键高速缓存可以提高性能,但不能完全消除会话之间的竞争。它们仍然竞争控制结构,以访问键高速缓存缓冲区。为了进一步减少键高速缓存访问竞争,MySQL 还提供了多个键高速缓存。该功能使您可以将不同的表索引分配给不同的键高速缓存。

在存在多个键高速缓存时,服务器必须知道在处理查询时使用哪个高速缓存。默认情况下,所有 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       |
+---------+--------------------+----------+----------+

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_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