2008年12月23日星期二

什么时候该增加MySQL数据库的内存?

除了优化好数据库配置文件外,更换/增加MySQL数据库服务器的硬件,是提高数据库性能最直接有效的方法。

这里先从最便宜的内存入手。(服务器内存和硬盘价格一般是台式机的5倍左右)

最便捷的方法是使用mysqlreport,来持续关注报告里面‘Key’和‘InnoDB Buffer Pool’这两个部分。如果你的my.cnf参数设置正确,但是Read hit一直低于99%,那么就要考虑增加内存了。

那么Read hit是怎么计算出来的呢?为什么要持续关注?在MySQL的命令行下:

mysql> show status like 'key_read%';
+-------------------+------------+
| Variable_name | Value |
+-------------------+------------+
| Key_read_requests | 3041374401 |
| Key_reads | 60959876 |
+-------------------+------------+
2 rows in set (0.02 sec)

key_efficiency(Read hit) = 1 - (Key_reads / Key_read_requests) = 97.995647100207184%

mysql> show status like 'Innodb_buffer_pool_read%';
+-----------------------------------+------------+
| Variable_name | Value |
+-----------------------------------+------------+
| Innodb_buffer_pool_read_ahead_rnd | 1660545 |
| Innodb_buffer_pool_read_ahead_seq | 576767 |
| Innodb_buffer_pool_read_requests | 2080081461 |
| Innodb_buffer_pool_reads | 292415839 |
+-----------------------------------+------------+
4 rows in set (0.02 sec)

key_efficiency(Read hit)= 1 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) = 85.942096764834353%

从文档里面找出这几个参数的意义:
  • Key_read_requests:从缓存读键的数据块的请求数。
  • Key_reads:从硬盘读取键的数据块的次数
  • Innodb_buffer_pool_read_ahead_rnd:InnoDB初始化的“随机read-aheads数。当查询以随机顺序扫描表的一大部分时发生。
  • Innodb_buffer_pool_read_ahead_seq:InnoDB初始化的顺序read-aheads数。当InnoDB执行顺序全表扫描时发生。
  • Innodb_buffer_pool_read_requests:InnoDB已经完成的逻辑读请求数。
  • Innodb_buffer_pool_reads:不能满足InnoDB必须单页读取的缓冲池中的逻辑读数量。
这几个都是时刻在变化的,一两次的查询并不能暴露问题。

没有评论: