myisam引擎的查询性能与索引缓存大小有直接的关系。
1. 查看默认的索引缓冲区大小key_buffer_size
mysql> show variables like 'key_buffer%';
+-----------------+---------+
| Variable_name | Value |
+-----------------+---------+
| key_buffer_size | 8388608 |
+-----------------+---------+
1 row in set
计算一下,8388608 / 1024 / 1024 = 8M,这个值实在是太小了。
2. 动态调整(重启后需要再次设置,否则会失效)
mysql> set global key_buffer_size=512*1024*1024;
Query OK, 0 rows affected
mysql> show variables like 'key_buffer%';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| key_buffer_size | 536870912 |
+-----------------+-----------+
1 row in set
可以看到设置生效了。
配置文件my.cnf中设置后,重启生效。 [mysqld] key_buffer_size=128M
3. 查看缓冲区读取情况
mysql> show global status like 'key_read%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Key_read_requests | 63922 |
| Key_reads | 5384 |
+-------------------+-------+
2 rows in set
参数说明,
Key_read_requests #表示从缓存中读取索引的次数
Key_reads #表示从磁盘中读取索引的次数
因为当前没有执行查询操作,所以索引没有使用。
4. 查看缓冲区写入情况
mysql> show global status like 'key_write%';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| Key_write_requests | 0 |
| Key_writes | 0 |
+--------------------+-------+
Key_write_requests #写入到key buffer的请求数
Key_writes #写入到磁盘的请求数
5. 查看缓冲区使用情况
mysql> show global status like 'key_blocks_u%';
+-------------------+--------+
| Variable_name | Value |
+-------------------+--------+
| Key_blocks_unused | 428660 |
| Key_blocks_used | 24 |
+-------------------+--------+
可以看到索引块的使用了24,未使用428660。从未使用的缓冲区大小,可以看出是否需要扩大缓冲区的大小。
通常需要程序运行一段时间以后,再来看未使用的缓冲区块数,这样才有实际的参考意义。