软件测试 | 影响MySQL性能的重要参数
  p1prOQge3cDY 2023年11月02日 32 0

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;
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  5mc8dZxYLJl1   2023年11月02日   264   0   0 HTML根目录服务器
p1prOQge3cDY
最新推荐 更多