为了最小化磁盘的 I/O , MyISAM 存储引擎的表使用键高速缓存来缓存索引,这个键高速缓存的大小则通过 key-buffer-size 参数来设置。如果应用系统中使用的表以 MyISAM 存储引擎为主,则应该适当增加该参数的值,以便尽可能的缓存索引,提高访问的速度。 默认情况下,所有的索引都使用相同的键高速缓存,当访问的索引不在缓存中时,使用 LRU ( Least Recently Used 最近最少使用)算法来替换缓存中最近最少使用的索引块。为了进一步避免对键高速缓存的争用,从 MySQL5.1 开始,可以设置多个键高速缓存,并为不同的索引键指定使用的键高速缓存。下面的例子演示如何修改高速键缓存的值,如何设置多个键高速缓存,以及如何为不同的索引指定不同的缓存: 显示当前的参数大小,为16M: mysql> show variables like 'key_buffer_size'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | key_buffer_size | 16384 | +-----------------+-------+ 1 row in set (0.00 sec) 修改参数值到200M: mysql> set global key_buffer_size=204800; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'key_buffer_size'; +-----------------+--------+ | Variable_name | Value | +-----------------+--------+ | key_buffer_size | 204800 | +-----------------+--------+ 1 row in set (0.00 sec) 上面介绍的是默认的键缓存,下面介绍如何设置多个键缓存: 设置 hot_cache 的键缓存 100M , cold_cache 的键缓存 100M ,另外还有 200M 的默认的键缓存。如果索引不指定键缓存,则会放在默认的键缓存中。 mysql> set global hot_cache.key_buffer_size=102400; Query OK, 0 rows affected (0.00 sec) mysql> set global cold_cache.key_buffer_size= 1024 00; Query OK, 0 rows affected (0.01 sec) mysql> show variables like 'key_buffer_size'; +-----------------+--------+ | Variable_name | Value | +-----------------+--------+ | key_buffer_size | 204800 | +-----------------+--------+ 1 row in set (0.00 sec) 如果要显示设置的多键缓存的值,可以使用: mysql> SELECT @@global.hot_cache.key_buffer_size; +------------------------------------+ | @@global.hot_cache.key_buffer_size | +------------------------------------+ | 102400 | +------------------------------------+ 1 row in set (0.03 sec) mysql> SELECT @@global.cold_cache.key_buffer_size; +-------------------------------------+ | @@global.cold_cache.key_buffer_size | +-------------------------------------+ | 102400 | +-------------------------------------+ 1 row in set (0.00 sec) 指定不同的索引使用不同的键缓存: mysql> CACHE INDEX test1 in hot_cache; +------------+--------------------+----------+----------+ | Table | Op | Msg_type | Msg_text | +------------+--------------------+----------+----------+ | test .test1 | assign_to_keycache | status | OK | +------------+--------------------+----------+----------+ 1 row in set (0.00 sec) mysql> CACHE INDEX test2 in hot_cache; +------------+--------------------+----------+----------+ | Table | Op | Msg_type | Msg_text | +------------+--------------------+----------+----------+ | test .test2 | assign_to_keycache | status | OK | +------------+--------------------+----------+----------+ 1 row in set (0.00 sec) 通常在数据库刚刚启动的时候,需要等待数据库热起来,也就是等待数据被缓存到缓存区中,这段时间数据库会因为 buffer 的命中率低而导致应用的访问效率不高。使用键高速缓存的时候,可以通过命令将索引预加载到缓存区中,大大缩短了数据库预热的时间。具体的操作方式是: mysql> LOAD INDEX INTO CACHE test1,test2 IGNORE LEAVES; +------------+--------------+----------+----------+ | Table | Op | Msg_type | Msg_text | +------------+--------------+----------+----------+ | test .test1 | preload_keys | status | OK | | test .test2 | preload_keys | status | OK | +------------+--------------+----------+----------+ 2 rows in set (3.89 sec) 如果已经使用 CACHE INDEX 语句为索引分配了一个键高速缓冲,预加载可以将索引块放入该缓存,否则,索引块将被加载到默认的键高速缓冲。 |
|