对密钥缓存的共享访问提高了性能,但并没有完全消除会话之间的争用。它们仍在争夺管理对关键缓存缓冲区的访问的控制结构。为了进一步减少键缓存访问争用,MySQL 还提供了多个键缓存。此功能使您能够将不同的表索引分配给不同的键缓存。
如果有多个键缓存,服务器必须知道在处理给定
MyISAM
表的查询时使用哪个缓存。默认情况下,所有
MyISAM
表索引都缓存在默认键缓存中。要将表索引分配给特定的键缓存,请使用该CACHE INDEX
语句(请参阅第 13.7.6.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
是缓存组件。有关用于引用结构化键缓存系统变量的语法的描述,
请参见第 5.1.8.3 节,“结构化系统变量” 。
默认情况下,表索引分配给在服务器启动时创建的主(默认)键缓存。当键缓存被销毁时,分配给它的所有索引都将重新分配给默认键缓存。
对于繁忙的服务器,您可以使用涉及三个密钥缓存的策略:
“热”键缓存占用分配给所有键缓存的空间的 20% 。将此用于大量用于搜索但未更新的表。
“冷”键缓存,占用分配给所有键缓存的空间的 20% 。将此缓存用于中型、密集修改的表,例如临时表。
占用 60% 键缓存空间 的“温”键缓存。将其用作默认键缓存,默认用于所有其他表。
使用三个键缓存的好处之一是访问一个键缓存结构不会阻止对其他键的访问。访问分配给一个缓存的表的语句不会与访问分配给另一个缓存的表的语句竞争。其他原因也会导致性能提升:
热缓存仅用于检索查询,因此其内容永远不会被修改。因此,无论何时需要从磁盘中提取索引块,都不需要首先刷新选择用于替换的缓存块的内容。
对于分配到热缓存的索引,如果没有需要索引扫描的查询,那么索引B-tree的非叶子节点对应的索引块很可能留在缓存中。
当更新的节点在缓存中并且不需要首先从磁盘读取时,对临时表执行最频繁的更新操作执行得更快。如果临时表索引的大小与冷键缓存的大小相当,则更新的节点在缓存中的可能性很高。
该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