MyISAM vs InnoDB

声明:此对比仅限于本人对公司的服务器情况所做的比较,并非通用和全面的比较。

随着公司业务的进一步扩展,服务器所承受的用户也越来越多,我也琢磨着怎么进一步提高数据库服务器的负载能力。我查到一些资料,InnoDB支持事务,支持行级锁,而且比MyISAM更具有伸缩性,MyISAM对于读取多写入少的数据库更好。

公司只有一台数据库服务器,是租用的万网双线机房的服务器(独享II型),配置并不好:

     

  • CPU:PD2.8G(双核)
  •  

  • 内存:1G DDRII
  •  

  • 硬盘:SATA -80G
  •  

  • 网卡:双1000M

安装的CentOS 3.2——万网没有别的Linux操作系统,可能都是预先安装好,拿来就可以用。

我安装了MySQL 5.0,用的是从MySQL网站上下载的RPM包。

公司的数据库的操作中,更新和插入占了大部分,而一般的网页型的网站则大部分仅仅是查询,很多还可以被缓存,将公司的数据库查询的记录和我的BLOG的数据库查询的记录做个对比:

公司本周MySQL查询
我的网站本周MySQL查询

(注:公司的服务器上使用了memcached,应用层将大部分记录缓存于此减轻数据库压力,所以在图上看不到多少Cache hit)
这样,我武断地认为,因为公司的数据库主要是插入和更新这些操作,所以应该采用InnoDB格式才能更好地发挥效果。而事与愿违,在转换了格式之后,性能却出现了大幅度下滑,在每天的定时数据统计期间,还可能会导致数据库大量连接阻塞,查看了性能图像之后,发现是CPU大量的时间都用于I/O等待上了:

公司服务器本周CPU占用率

对应的IO状态的性能图志:

公司本周IO状态

大家可以从图看上到,使用了InnoDB的几天在图中间反应为大量的磁盘写操作,于是之后我又切换回MyISAM,可见MyISAM的写操作少得多。

为什么会导致这种情况发生呢?

可能和InnoDB的性质有关。InnoDB是ACID的,这种ACID的数据库都对磁盘的IO性能要求很高,也要求更大的内存。很多数据库服务器往往都使用SCSI RAID,动辄4G、8G甚至16G内存——由于我对数据库的研究并不是很深,我隐约记得InnoDB有个会导致性能下降的双重写入问题,以及log的flush问题(向达人求证)。而公司租用的这台服务器,内存小,硬盘也只是SATA的,瓶颈是十分明显的。

当然,据很多测试表明,在高配的情况下,InnoDB有更大的优势——就好比谁会在这种机器上装Oracle呢?即使Oracle在这种机器上表现差,又有谁会质疑Oracle的强大呢?

所以我的结论是,如果数据库的硬件配置低,而应用又对事务等高级特性要求不是很高的话,可以依然采用MyISAM。

“MyISAM vs InnoDB”的8个回复

  1. 将公司的数据库查询的记录和我的BLOG的数据库查询的记录做个对比
    =
    很好奇,这是用哪个软件得得出的结果呢。
    还有,为什么不自己装服务器去托管而选择租用万网的呢?(自己的服务器怎么也装个centos5.1是吧)
    最后我想问一下,下面这个能发声音回复的验证码是哪个插件来的?

  2. @g.zhen.ning

    1. 租用万网的服务器和机房是老板决定的,当然也准备再购买新的服务器
    2. 图像都是用Munin记录的
    3. 插件的名字右下角有,叫reCaptcha

发表评论

电子邮件地址不会被公开。 必填项已用*标注