10.10.2.2 多个键缓存
从MySQL 8.4开始,讨论在多个MyISAM键缓存中引用多个MyISAM key caches的 compound-part structured-variable 语法已经弃用。
共享键缓存可以提高性能,但不能完全消除会话之间的竞争。它们仍然竞争控制结构,以管理对键缓存缓冲区的访问。为了进一步减少键缓存访问竞争,MySQL还提供了多个键缓存。这一特性使您可以将不同的表索引分配给不同的键缓存。
在有多个键缓存时,服务器必须知道在处理给定MyISAM表的查询时使用哪个缓存。默认情况下,所有MyISAM表索引都被缓存在默认键缓存中。要将表索引分配给特定的键缓存,请使用CACHE INDEX
语句(见第15.7.8.2节,“CACHE INDEX Statement”)。例如,以下语句将来自表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%。将其作为默认键缓存,用于其他所有表。
使用三种键缓存的一个原因是访问一个键缓存结构不阻塞对另一个键缓存的访问。访问一个缓存中的表的语句不会与访问另一个缓存中的表的语句竞争。性能提高还来自其他原因:
-
热缓存仅用于检索查询,因此其内容从不被修改。因此,每当需要从磁盘中pull一个索引块时,选择替换的缓存块的内容无需首先刷新。
-
对于分配给热缓存的索引,如果没有需要扫描索引的查询,那么非叶子节点对应的索引块在缓存中保持的可能性很高。
-
更新临时表中的操作最频繁地执行速度更快,当更新的节点在缓存中且不需要从磁盘中读取时。如果临时表的索引大小与冷键缓存的大小相似,那么更新节点在缓存中的可能性非常高。
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 语句 per 行。以下示例将几个表分配给 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