MySQL 用id分库使用name查询

对用户表最常见的分库方式是水平切分方式并按照id取模分库。查询时可以对id取模后能够直接定位db。对于name无法定位到库,查询时往往需要遍历所有库,当分库数量多起来,性能会显著降低。

下面介绍几种优化思路:

索引表法

建立一个索引表记录name到id的映射关系,通过name查询时,先用索引表查询到id,再定位相应的库。

缓存映射法

将name:id的映射关系放在缓存里性能更佳,先通过缓存获取id,然后再定位相应的库。

name生成id

设计f(name)函数生成唯一id,在插入数据时,先使用name生产id再插入,查询时通过f(name)得到id再查询id。

基因法 name基因融入id

假设分8库,采用id%8路由,潜台词是,id的最后3个bit决定这条数据落在哪个库上,这3个bit就是所谓的“基因”。

设计f(name)函数生成3bit基因,同时生成61bit的全局唯一id作为用户的标识,然后将3bit拼接到61bit后面形成64bit的主键id。

使用name查询时,先通过f(name)函数计算出3bit,再取模3bit%8,就可以定位到所属库。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值