MySQL 存储引擎实战

发表于:2011-8-11 10:20

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:sataerman    来源:51Testing软件测试博客

  最近被这个CDN的系统是折腾的半死,仔细想来其实最最折腾的就是数据库。目前我们的系统是使用的MySQL来存储。用过mysql的人很多,目前mysql已经成为了最最主流的开源数据库的选择。不过mysql能否用来做海量存储,在这次的系统测试过程中,让我深有体会。

  先大概介绍一下系统的情况,每天的insert ,delete,update 的操作差不多在5亿左右,然后select的表的大小最最大的在5亿和5000万左右。那么我们就通过我的实际血泪史来看看mysql的存储引擎的区别吧。

  系统一开始在线上模拟测试的时候,因为我的不小心,把engine设置成为了myisam引擎。在实际的模拟测试的过程中,发现任务队列堆积非常严重。后来OP帮忙一查,发现原来是错用了存储引擎,myisam的存储引擎对于写的操作是表锁。这样导致我们大量对数据库写的操作被pending住了,汗。

  立马把数据库引擎换成了innodb,innodb的写操作是行锁,写的效率比myisam要高很多,但是相对应的其读的速度肯定要比myisam低了,因为它是用的Btree的索引。但是我们又发现了一个问题。我们每天的insert操作是一个定时的任务,差不多在1亿5千万左右,差不多高峰时候每秒的insert有1万个左右。我们发现磁盘IO完全成为了瓶颈,磁盘的使用率在100%左右徘徊。而且还导致了系统load升高,升值导致db挂了。可是这个怎么办呢,innodb是目前我们的最佳选择?

  写磁盘是innodb不可避免的,团队开始考虑迁移到内存数据库。可以那种key-value值对类型的数据库对于我们当前的业务不太适合。而且我们也没有那么多时间去重写底层的系统。DBA提出用memory的存储引擎。memory是内存数据库存储引擎,所以的数据存储在内存里面,一旦重启数据库就数据全没了。不过我们的系统对于数据的持久性要求不高。不过问题是我们的数据量大,所有我们迁移到了一台72G内存的数据库上面。不过我们只是把一部分的表变成了memory引擎,还有一部分还是innodb的引擎。

  上线后的第一个周末,又出问题了,innodb的磁盘扛不住了。我们一看,汗,怎么还是一个sata的硬盘,起码数据库服务器好歹也是一个sas硬盘+raid的配置啊。哎 ,我们就顾着内存大,忽视了磁盘。没把发,把所有的表都换成memory,总算系统是稳定的,低load的跑了下来。

版权声明:本文出自 sataerman 的51Testing软件测试博客:http://www.51testing.com/?285091

原创作品,转载时请务必以超链接形式标明本文原始出处、作者信息和本声明,否则将追究法律责任。

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号