分库分表概念

       顾名思义,即把原本存放在一个库中的数据分块存储到多个库中,把原本存放在一张表中的数据分块存放到多张表上。

分库分表的实施策略

   垂直切分

         将表按功能模块、关系密切程度进行划分,部署到不同的库中。如产品库productDB,订单库orderDB, 用户库userDB,日志库logDB等。

   水平切分

         当一个表中的数据量过大时,就需要将表中数据按照某种规则(userid区间划分或者散列),存储到不同库中的相同结构的表中。如userTable表中数据可以切分到不同数据库的多个结构相同的userTable0、userTable1、userTable2等表中。

分库分表的策略选择

       1)数据库中表太多(门票订单系统已有30个表)而造成海量数据,且各项业务逻辑划分清晰、低耦合,则首选垂直划分。

       2)数据库中表不多,但单个表中数据量很大或数据热度很高则需要考虑进行水平切分。

       3)多数情况下,为达到最佳效果,往往采取垂直切分和水平切分共同进行的方式。

水平切分方式和规则

          要想做到水平切分,在每一个表中都要有冗余字段作为切分依据和标识字段,通常选用userid作为区分字段。

         1)按区间划分,比如1~1000的对应到DB1 , 1001~2000的对应到DB2,以此类推。

                优点:可部分迁移。

                 缺点:数据分布不均(老用户活跃度肯定没有新用户高)。

          2)hash取余运算, 对userid进行hash运算,一般取512或1024,视具体数据量大小。比如userid%512, 结果为1的对应到DB1,结果为2的对应到DB2,以此类推。

                优点:数据分布均匀。

                缺点:数据迁移的时候麻烦,不能按照机器性能进行分摊数据。

         3)采用映射表进行映射的方式,存储到DB或者ES

              单独建立一个DB,用于映射userid到DB的映射关系。

               优点:灵活性强,一对一的关系

               缺点:多一次RPC查询。