MYSQL数据库经常要分表分库,提高性能,和容量问题。
分表分库方案
1、取模。
就是用一个字段 比如userId=101,分成十张表 101%10=1。最后放在user_01表中。扩容困难,需要把所有数据重新分配
2、一致性哈西算法(自己百度下)
扩容较好,每次加一个,只需要把顺时针的库拆分即可。但是分布会不 均匀。要不然就要所有的库都变动部分数据,虽然不是所有的数据。
以上都不是重点。因为他们扩容都需要变动数据,操作不当就会有错。
重点如下
3、籍贯定位法
众所周知,每个人出生的时候就有自己的籍贯。比如广西桂林。然后我们都有自己的身份证号,代表着你是唯一的。从身份证号上就能知道你的籍贯。那么数据也可以这样,在你创建这条数据的时候,分配身份证号,就知道它是哪张表哪张库了。步骤如下
1、表中添加一个籍贯字段,每次创建数据时,分配全局唯一ID(全局唯一ID生成方式百度吧)。大多分布式系统都会有全局唯一ID功能。在这个ID上,加库后辍和表后辍。(以下只做分表,分库同理)比如user_info分成了3张表00~02。全局唯一ID生成时,我们在00~02随机选择一个数字。随机一定要按一定比例,比如权重 00-33% 01-33% 02-34%,这样保证公平性。
2、比如我们的全局唯一ID是 00XXXXXXX 那么我们就知道他属于 user_info_00这张表。插入这张表中
3、当数据达到一定量时,比如每张表已经使用50%,我们扩容了03这个表。那么我们现在的表是00~03,接着重新分配权重。我们都知道现在总容量是250 (00+01+02+03),算法是:表容量/总容量 00的权重就是 50/250=20% 就是他的新权重,而03同理是40%的权重。这样达到平衡。
(如果分库,在全局唯一ID里加上库的后辍)
权重的计算,也可以很灵活。比如每天凌晨,给这些库重新做一次权重计算。一些库满了,就让他权重为0,等于关闭,或者不让它参与选举。
具体我也还没实现,哈哈哈哈哈。等实现完了再写上去。