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必须单页读取的缓冲池中的逻辑读数量。
这几个都是时刻在变化的,一两次的查询并不能暴露问题。

2008年12月21日星期日

人人为我,我为人人

开源软件为什么在中国走的这么艰辛?我觉得这个和BT,电驴在中国走下坡路的原因是一样的:可以人人为我,不能我为人人

国内用到开源代码的软件太多了,可是大家用的都很‘低调’:怕别人知道自己用了开源代码,改了bug怕别人知道,有了bug又埋怨开源的质量。

中国大陆忽视知识产权,不仅仅表现在盗版横行,也表现在软件行业中对开源代码的‘单向’使用和篡改版权。

只有‘人人为我,我为人人’,中国的软件才能真正拥抱开源,才能让世界了解中国软件。这个不仅仅适用于软件,其他的都是这个道理。

2008年12月17日星期三

2007年泛珠三角大学生计算机作品大赛之黄果树瀑布

今天梁老师在论坛上面把一年前去贵州的照片贴了出来,还有一篇很有文采的游记。可以去这里看详情

这里贴几张图吧,不舞文弄墨了。







2008年12月7日星期日

MySQL海量数据优化

经常见到有人对MySQL处理海量数据(几百万,几千万的数据就不要往海量上面扯了)的能力持怀疑的态度,根据我的经验,MySQL处理单表亿级数据没有任何问题。

数据库最重要的是安全稳定,速度其次。在做任何优化之前,你都必须做好最坏的打算,一定要有备份和应急方案!

要有一个稳定安全的数据库,你必须:
  • 至少要有一个热备
  • UPS
  • 做合适的RAID。RAID0+1,RAID5或者RAID6
如果可以,最好:
  • 使用xfs而不是ext3。哪天reboot后,你发现磁盘检查要半天,还不能停止,哭都来不及
  • 将数据库数据放入盘柜。更安全,访问更快
现在切入正题,开始优化:
  • 使用64位系统。这是老生常谈了,只要谈优化就少不了这个。不仅MySQL的性能有提升,内存也能使用超过4G。
  • 选择合适的引擎。一般来讲,innodb适合写频繁的表,myisam适合读频繁的表。
  • 建立正确的索引。推荐这篇文章。虽然比较老了,但很经典。
  • 优化my.cnf里面的参数。主要关心和buffer有关的参数,innodb_buffer_pool_size之类的
  • 使用memcache。可以把访问频繁,不经常改动的小表放入memcache;程序对数据库的读操作之前最好访问一下memcache。
  • 打开slow_query_log选项。解决出现的慢查询语句。
  • 优化sql语句。
  • 使用SAS而不是SATA。数据库对硬盘要求很高,很多时候,换个快的硬盘就能有立竿见影的效果。
优化不可能一蹴而就,它是一个长期持续的过程,比如一些参数要在长期的运行中观察测试才能得到一个最优的值。

ps:这篇文章不要错过