更多学习资料戳!!!
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;
复制代码
评论