key_buffer_size 指定索引缓冲区的大小, 它决定索引处理的速度, 尤其是索引读的速度. 通过检查状态值 Key_read_requests 和 Key_reads, 可以知道 key_buffer_size 设置是否合理
key_buffer_size 对 MyISAM 表性能影响很大.
1, 查询
- mysql> show variables like 'key_buffer_size';
- +-----------------+------------+
- | Variable_name | Value |
- +-----------------+------------+
- | key_buffer_size | 536870912 |
- +-----------------+------------+
分配了 512MB 内存给 mysql key_buffer_size, 我们再看一下 key_buffer_size 的使用情况:
- mysql> show global status like 'key_read%';
- +------------------------+-------------+
- | Variable_name | Value |
- +------------------------+-------------+
- | Key_read_requests | 27813678764 |
- | Key_reads | 6798830 |
- +------------------------+-------------+
一共有 27813678764 个索引读取请求, 有 6798830 个请求在内存中没有找到直接从硬盘读取索引, 计算索引未命中缓存的概率:
key_cache_miss_rate = Key_reads / Key_read_requests * 100%
比如上面的数据, key_cache_miss_rate 为 0.0244%,4000 个索引读取请求才有一个直接读硬盘, 已经很 BT 了, key_cache_miss_rate 在 0.1% 以下都很好(每 1000 个请求有一个直接读硬盘), 如果 key_cache_miss_rate 在 0.01% 以下的话, key_buffer_size 分配的过多, 可以适当减少.
MySQL 服务器还提供了 key_blocks_* 参数:
- mysql> show global status like 'key_blocks_u%';
- +------------------------+-------------+
- | Variable_name | Value |
- +------------------------+-------------+
- | Key_blocks_unused | 0 |
- | Key_blocks_used | 413543 |
- +------------------------+-------------+
ey_blocks_unused 表示未使用的缓存簇 (blocks) 数, Key_blocks_used 表示曾经用到的最大的 blocks 数, 比如这台服务器, 所有的缓存都用到了, 要么增加 key_buffer_size, 要么就是过渡索引了, 把缓存占满了. 比较理想的设置:
- Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% 80%
- mysql> show global status like 'key_writ%';
- +--------------------+-------+
- | Variable_name | Value |
- +--------------------+-------+
- | Key_write_requests | 10 |
- | Key_writes | 1 |
- +--------------------+-------+
- 2 rows in set (0.01 sec)
来源: http://www.bubuko.com/infodetail-2650397.html