好长时间没有写东西了,前几天去面试别人总是问我有没有处理过大数据的经验,说实话工作这3年来还真没有处理过太大的数据,呵呵。

不过个人对企业级应用中数据库的处理大致是如下思考的(只是自己的遇见,欢迎高手拍砖)。


(1)项目初期分析数据可能存储量,对可能存储大数据的数据进行垂直分表(把一个很多字段的表才分为多个小表,一定程度上遵循范式原则)。

(2)对于冷数据(不经常改变的数据,但查询观看)可以考虑使用缓存技术。

(3)对于日益增长的数据访问,可以使用数据库集群,双击热备。

优点:方便,风险低,基本上不需要改变原有程序代码。

缺点:数据库集群只是把读写分离了,但是数据表的数据还是会日益增长。

(4)水平分表,比方说淘宝双十一这天可能一天就会产生几千万或者上亿的数据集,那么我们这里只考虑订单这个数据集,我们可以按照时间(小时为单位)按照一定算法(hash也好,还是自己杜撰的也罢)把一张大的订单表按照相同结构不同表名称(小时为单位弄出来一定规律的表名称)来分辨存储这莫多订单数据,比方这里弄了24张表。

优点:可以解决大数据问题。

缺点:对以前的项目数据访问层要做修改(表名称变了),而且对于查询统计整个订单时候会有一定难度,如果不是24个表而是240个表,那我们要把这240个表全部查询一遍然后合并,可想而知噩梦啊。(这里还没有找到好的方法,请高手指点)


还有一点需要说明的是对Mysql引擎里面的MYISAM和INNODB。MYISAM在对表读写操作的时候会对表锁定,而INNODB只会对行锁定。所以这里我建议经常读取的表就用MYISAM,经常更新的表就用INNODB。还有一点就是INNODB支持对事物的处理。

下面是引用网上大神的一句话:

一般来说,MyISAM适合:(1)做很多count 的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。InnoDB适合:(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况。