天天看点

关于MySQL分库分表--简单想法

本文转自 位鹏飞 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

        感谢总监的帮助!