更多学习资料戳!!!
key_buffer_size 的设置
首先看看 MySQL(MySQL 服务器启动命令,加“--verbose -help”显示全部启动选项)中是如何定义的 key_buffer_size 参数的:
[root@localhost zzx]# mysql -vrebose --help|grep key_buffer_size=
--key_buffer_size=# The size of the buffer used for index for index blocks for MyISAM
复制代码
从以上定义可以看出,这个参数是用来设置索引快(Index Blocks)缓存的大小,它被所有线程共享,此参数只适用于 MyISAM 存储引擎。MySQL5.1 以前允许使用一个系统默认的 key_buffer,这样可以更小地降低线程之间的竞争。
可以这样建立一个索引缓存:
mysql>set global hot_cache2.key_buffer_size=128*1024;
Query OK, 0 rows affected(0.01 sec)
复制代码
其中,global 表示对每一个新的连接,此参数都将生效。hot_cache2 是新的 key_buffer 名称。
如果需要更改参数值,可以随时进行重建,例如;
mysql>set global hot_cache2.key_buffer_size=200*1024;
Query OK,0 rows affected(0.00sec)
复制代码
然后可以把相关表的索引放到指定的索引缓存中,如下:
mysql> cache index sales,sales2 in hot_cache2;
+---------------+--------------------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------------+--------------------+----------+----------+
| sakila.sales | assign_to_keycache | status | OK |
| sakila.sales2 | assign_to_keycache | status | OK |
+---------------+--------------------+----------+----------+
2 rows in set (0.04 sec)
复制代码
想要将索引预装到默认 key_buffer 中,可以使用 LOAD INDEX INTO CACHE 语句。例如,下面的语句可以预装表 sales 的所有索引:
mysql> load index into cache sales ;
+--------------+--------------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------+--------------+----------+----------+
| sakila.sales | preload_keys | status | OK |
+--------------+--------------+----------+----------+
1 row in set (0.00 sec)
复制代码
如果需要删除索引缓存,则要使用下面命令;
mysql> set global hot_cache2.key_buffer_size=();
Query OK,0 rows affected(0.00 sec)
复制代码
请注意不能删除默认可以_buffer。来看一下实际删除结果:
mysql> show variables like 'key_buffer_size';
+-----------------+---------+
| Variable_name | Value |
+-----------------+---------+
| key_buffer_size | 8388600 |
+-----------------+---------+
1 row in set (0.00 sec)
mysql> set global key_buffer_size=0;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show warnings;
+---------+------+------------------------------+
| Level | Code | Message |
+---------+------+------------------------------+
| Warning | 1438 | Cannot drop default keycache |
+---------+------+------------------------------+
1 row in set (0.01 sec)
复制代码
可以看出,虽然提示设置成功,但是有一个 warning “Cannot drop default keycache”,提示不能删除默认 key_buffer。重新创建一个连接后,参数值果然没有更改:
[zzx@localhost ~]$ mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.0.41-community-log MySQL Community Edition (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show variables like 'key_buffer_size';
+-----------------+---------+
| Variable_name | Value |
+-----------------+---------+
| key_buffer_size | 8388600 |
+-----------------+---------+
1 row in set (0.00 sec)
复制代码
cache index 命令在一个表和 key_buffer 之间建立一种联系,但每次服务器重启时 key_buffer 中的数据将清空。如果想要每次服务器重启时响应表的索引能自动放到 key_buffer 中,可以在配置文件中设置 init-file 选项来制定包含 cache index 语句的文件路径,然后在对应的文件中写入 cache index 语句。下面是一个例子:
[zzx@localhost ~]$ more /etc/my.cnf
…
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
…
复制代码
每次服务器启动时执行 mysql_init.sql 中的雨具,该文件每行应包含一个 SQL 语句。下面的例子分配几个表,分别对应 hot_cache 和 cold_cache:
CACHE INDEX a.t1, a.t2, b.t3 IN hot_cache;
CACHE INDEX a.t4, b.t5, b.t6 IN cold_cache;
复制代码
评论