本文转自 位鹏飞 51CTO博客,原文链接:http://blog.51cto.com/weipengfei/1333460,如需转载请自行联系原作者为提高业务响应时间,避免OS处理过大的文件,修改MySQL表结构应用更顺畅,分库分表是最好的选择;大致的两个思路是:
1、数据表容量一定,表的个数不限;
2、数据表的个数一定,容量递增;
针对表容量一定,有以下思路:称之为step方式:
按照splitField取整存放:databasesize 代表该数据库总记录行数,tablesize 代表 表的记录数
例如一个数据表里最多100万条记录,每个数据库最多放10个表。则databaseSize=1000万。tableSize=100万.
假定splitField=N时,则该记录在dbPrefix + (int)Math.ceil((N/(databaseSize*1.0)))数据库
数据表为 tbPrefix + (int)Math.ceil((N/(tableSize*1.0)))
则数据库的编号从1开始,db1,db2,....,dbN(N根据splitField的无限增大而动态扩张)
db1里面的表为tb1,tb2,...,tb10
db2里面的表为tb11,tb12,...,tb20.
db10里面的表为tb91,tb92,...,tb100.
这样已经做好扩展,每个表的容量一定,表的个数不限,比较适合QQ群的方式,也不存在数据冷热问题;
按照以上的方式,对于像视频评论,或者微博评论来说 就容易出现 访问没有实现负载均衡,易出现太多的热点;
用取模mode方式还是比较合适的:
下面讨论下标的个数一定,容量递增;取模是最好的负载均衡,针对热门评论,可以实现很好的负载均衡;
其实这个大家一看是有一个明显问题的,就是扩容时需要迁移数据的;所以规定表的个数是很关键的;
splitType=mode时,数据库的数量恒定为databaseSize,每个库的表的数量恒定为tableSize张表,按照splitField取模存放
假定splitField=N时,则该记录在dbPrefix + (N%databaseSize)数据库
数据表为 tbPrefix + N%(tableSize*databaseSize)
例如分拆4个库,每个数据库里四张表。则数据库编号从0开始,db0,db1,db2,db3
db0里面的数据表为db0,db4,db8,db12
db1里面的数据表为db1,db5,db9,db13
db2里面的数据表为db2,db6,db10,db14
db3里面的数据表为db3,db7,db11,db15
感谢总监的帮助!