<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[InnoDB还是MyISAM 再谈MySQL存储引擎的选择]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Wed, 15 Sep 2010 14:48:36 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	InnoDB存储引擎将InnoDB表保存在一个表空间内，该表空间可由数个文件创建。这样，表的大小就能超过单独文件的最大容量。表空间可包括原始磁盘分区，从而使得很大的表成为可能。表空间的最大容量为64TB。<br/>MySQL表最大能达到多少：<br/>事实上MySQL能承受的数据量的多少主要和数据表的结构有关，并不是一个固定的数值。表的结构简单，则能承受的数据量相对比结构复杂时大些。<br/><br/>据D.V.B团队以及Cmshelp团队做CMS系统评测时的结果看来，MySQL单表一般在2千万条记录（4G）下能够良好运行，经过数据库的优化后5千万条记录（10G）下运行良好。<br/>那些CMS厂商非但没有把内核做好反而还在添加很多花哨的功能，最终导致其产品自身负载过低。他们并没有针对自身负载效果作出相应的数据库优化方案及标准，而是继续保留着复杂的结构造成对MySQL的资源无休止的浪费，最终导致了其负载上的缺陷，于是他们便充分发挥中国人的传统优势——变通：避重就轻的采用了所谓的分表式存储，虽然在一定程度上缓解了自身负载的缺陷，但是导致了网站后期维护以及资源上的浪费，这样做是否是长久之计呢？虽然他们解决了眼前的问题，但以后呢？难道想无休止的分表来达到目的？MYLB.NET.CN博主追峰用一个不恰当的比喻来形容，MySQL中的的表就像一块地，单表就相当于利用这块地盖高层建筑充分利用达到高人员负载，但分表就相当于用这块地盖了一间平房，如果为了达到高人员负载的话那就需要另开地皮达到目的，但是我们要思考，是地不够，还是他的能力不够，如此做法让人感到资源的浪费以及规划的严重缺陷。那么对于这样的CMS系统，有谁敢用？难道为了达到让其良好的运行而无休止的更换着服务器配置么？况且大多情况下一台服务器中不是只有这么一个网站，那么我们就要思考，我们的腰包是否是为了满足这么庞大的小CMS而生。<br/><br/>InnoDB还是MyISAM 再谈MySQL存储引擎的选择<br/>两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用。<br/><br/>我作为使用MySQL的用户角度出发，Innodb和MyISAM都是比较喜欢的，但是从我目前运维的数据库平台要达到需求：99.9%的稳定性，方便的扩展性和高可用性来说的话，MyISAM绝对是我的首选。<br/><br/>原因如下：<br/><br/>1、首先我目前平台上承载的大部分项目是读多写少的项目，而MyISAM的读性能是比Innodb强不少的。<br/><br/>2、MyISAM的索引和数据是分开的，并且索引是有压缩的，内存使用率就对应提高了不少。能加载更多索引，而Innodb是索引和数据是紧密捆绑的，没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。<br/><br/>3、从平台角度来说，经常隔1，2个月就会发生应用开发人员不小心update一个表where写的范围不对，导致这个表没法正常用了，这个时候 MyISAM的优越性就体现出来了，随便从当天拷贝的压缩包取出对应表的文件，随便放到一个数据库目录下，然后dump成sql再导回到主库，并把对应的 binlog补上。如果是Innodb，恐怕不可能有这么快速度，别和我说让Innodb定期用导出xxx.sql机制备份，因为我平台上最小的一个数据库实例的数据量基本都是几十G大小。<br/><br/>4、从我接触的应用逻辑来说，select count(*) 和order by 是最频繁的，大概能占了整个sql总语句的60%以上的操作，而这种操作Innodb其实也是会锁表的，很多人以为Innodb是行级锁，那个只是 where对它主键是有效，非主键的都会锁全表的。<br/><br/>5、还有就是经常有很多应用部门需要我给他们定期某些表的数据，MyISAM的话很方便，只要发给他们对应那表的frm.MYD,MYI的文件，让他们自己在对应版本的数据库启动就行，而Innodb就需要导出xxx.sql了，因为光给别人文件，受字典数据文件的影响，对方是无法使用的。<br/><br/>6、如果和MyISAM比insert写操作的话，Innodb还达不到MyISAM的写性能，如果是针对基于索引的update操作，虽然 MyISAM可能会逊色Innodb,但是那么高并发的写，从库能否追的上也是一个问题，还不如通过多实例分库分表架构来解决。<br/><br/>7、如果是用MyISAM的话，merge引擎可以大大加快应用部门的开发速度，他们只要对这个merge表做一些select count(*)操作，非常适合大项目总量约几亿的rows某一类型(如日志，调查统计)的业务表。<br/><br/>当然Innodb也不是绝对不用，用事务的项目如模拟炒股项目，我就是用Innodb的，活跃用户20多万时候，也是很轻松应付了，因此我个人也是很喜欢Innodb的，只是如果从数据库平台应用出发，我还是会首选MyISAM。<br/><br/>另外，可能有人会说你MyISAM无法抗太多写操作，但是我可以通过架构来弥补，说个我现有用的数据库平台容量：主从数据总量在几百T以上，每天十多亿 pv的动态页面，还有几个大项目是通过数据接口方式调用未算进pv总数，(其中包括一个大项目因为初期memcached没部署,导致单台数据库每天处理 9千万的查询)。而我的整体数据库服务器平均负载都在0.5-1左右。<br/><br/><br/>mysql的merge引擎引发的性能问题：<br/>MERGE引擎类型可以把许多结构相同的表合并为一个表。通过对merge表的简单查询，可以轻松实现对多个子表进行查询的目的。<br/><br/>我们的日志系统按照月为单位进行分表，由merge联合所有月份子表，实现跨月（跨表）的日志查询。这样的做法是程序端的逻辑比较简单，无需关注多表的数据整合和处理。<br/><br/>随着子表越来越多、数据越来越大，查询的速度越来越慢。子表的数据量增长并非数量级的，那么从理论上讲通过merge进行查询，速度受到影响的浮动应该是很小的，但现实却非如此。<br/><br/>刚开始并不知道原因，通过profiling检查详细的耗时情况，发现Sending data占用了99%的时间，从官方解释来看，Sending data貌似是发送数据到client端的耗时，检查了一下，仅仅只有几K的数据发送，明显不是此原因。SQL挺简单的，基本的优化也都做了，那么是什么原因？<br/><br/>之后调试代码时无意中针对一个子表进行了一次查询，发现速度几十倍的提高，之前对merge的查询需要20多秒，现在仅仅不到1秒就执行完了，这个感觉是很明显的，于是进一步进行了测试，发现问题的确如此。<br/><br/>所以，建议还是在代码逻辑中对多表数据进行处理，避免使用Merge引擎。<br/><br/>有时间看一下源码中Sending data是如何计算的以及Merge是如何进行多表数据集合的。 希望Mysql能把Merge引擎做的更加稳定、高效，真正发挥Merge引擎的优势。<br/><br/>
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] InnoDB还是MyISAM 再谈MySQL存储引擎的选择]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>