userId分库,怎么通过其他字段查询

用户中心是几乎每一个公司必备的基础服务,用户注册、登录、信息查询与修改都离不开用户中心。

当数据量越来越大时,需要多用户中心进行水平切分。最常见的水平切分方式,按照userId取模分库

例如:

通过userId取模,将数据分布到多个数据库实例上去,提高服务实例个数,降低单库数据量,以达到扩容的目的。

这样水平切分之后,userId属性上的查询可以直接路由到库,如上图,假设访问uid=10的数据,取模后能够直接定位db1。

但是分库之后,对于其他字段的查询,就不能这么幸运了。假设访问userName=”lizhi”的数据,由于不知道数据落在哪个库上,往往需要遍历所有库,当分库数量多起来,性能会显著降低

所以我要们寻找如何高效查询的方法!(以下用userName为例)

索引表法

思路:userId直接定位到库,userName不能直接定位到库,如果通过userName能查询到userId,问题解决。

解决方案:
1)建立一个索引表记录userName->userId的映射关系
2)用userName来访问时,先通过索引表查询到userId,再定位相应的库
3)索引表属性较少,可以容纳非常多数据,一般不需要分库
4)如果数据量过大,可以通过userName来分库

潜在不足:多一次数据库查询,性能下降一倍。

缓存映射法

思路:访问索引表性能较低,把映射关系放在缓存里性能更佳。

解决方案:
1)userName查询先到cache中查询userId,再根据userId定位数据库
2)假设cache miss,采用扫全库法获取userName对应的userId,放入cache
3)userName到userId的映射关系不会变化,映射关系一旦放入缓存,不会更改,无需淘汰,缓存命中率超高
4)如果数据量过大,可以通过userName进行cache水平切分

潜在不足:多一次cache查询

userName生成userId

思路:不进行远程查询,由userName直接得到userId

解决方案:
1)在用户注册时,设计函数userName生成userId,userId=f(userName),按userId分库插入数据
2)用userName来访问时,先通过函数计算出userId,即userId=f(userName)再来一遍,由userId路由到对应库

潜在不足:该函数设计需要非常讲究技巧,有userId生成冲突风险

userName基因融入userId

思路:不能用userName生成userId,可以从userName抽取“基因”,融入userId中

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

解决方案:
1)在用户注册时,设计函数userName生成3bit基因,userName_gene=f(userName)
2)同时,生成61bit的全局唯一id,作为用户的标识
3)接着把3bit的userName_gene也作为userId的一部分
4)生成64bit的userId,由id和userName_gene拼装而成,并按照userId库插入数据
5)用userName来访问时,先通过函数由userName再次复原3bit基因,userName_gene=f(userName),通过userName_gene%8直接定位到库

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ClickHouse是一个用于分布式数据存储和分析的开源列式数据库管理系统。在进行ClickHouse的分库分表时,可以采用以下方法: 1. 分库:将数据划分到不同的数据库中。可以根据业务需求、数据量、访问频率等因素来确定分库的策略。一种常见的方式是按照用户ID或其他关键字段进行分库,确保数据均匀分布在不同的数据库中。例如,可以将userID为4、8、12、16等的数据分配到db_index为0的库中。这样做可以避免数据不均衡的问题。 2. 分表:将数据划分到不同的表中。与分库类似,分表的策略也可以根据业务需求和数据特点来确定。可以按照时间范围、业务类型等关键字段进行分表。例如,可以将数据按照table_index进行划分,确保每个表上的数据量相对均衡。 3. 跨库查询:在进行跨库查询时,可以通过编写SQL语句来实现。可以使用ClickHouse提供的分布式查询功能,通过指定不同的数据库和表来进行跨库查询。可以根据需要选择需要查询数据库和表,以及需要关联的字段。 要注意,在进行分库分表时,需要考虑数据均衡性、可扩展性和查询性能等因素。同时,也需要注意数据一致性和事务处理。 以上是关于ClickHouse分库分表的一些方法和注意事项。具体的实施方法可以根据业务需求和数据特点进行调整和优化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [分库分表要怎么做?](https://blog.csdn.net/qq_28762295/article/details/109064550)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [数据源管理 | 关系型分库分表,列式库分布式计算](https://blog.csdn.net/cicada_smile/article/details/105658282)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值