后端工程师的高阶面经
邓明
前 Shopee 高级工程师,Beego PMC
6888 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
后端工程师的高阶面经
15
15
1.0x
00:00/00:00
登录|注册

19|分库分表无分库分表键查询:你按照买家分库分表,那我卖家怎么查?

广播
使用其他中间件支持查询
二次分库分表
引入中间表
主键生成策略
思考题
面试思路总结
亮点方案
数据同步问题
引入中间表和二次分库分表
基本思路
面试准备
重试方案
分库分表键选择
分库分表无分库分表键查询

该思维导图由 AI 生成,仅供参考

你好,我是大明,今天我和你来聊一聊分库分表下的一种特殊的查询——无分库分表键查询。
在很多业务里面,分库分表键都是根据主要查询筛选出来的。那么就会有这样一个问题,那些不怎么重要的查询怎么解决呢?
比如说大多数电商的订单都是按照买家 ID 来进行分库分表的,那么商家该怎么查询订单呢?又或者买家找客服,客服要找到对应的订单,又该怎么找?在面试分库分表的过程中,这也算是一个常见的问题。
如果你对分库分表不是很熟悉,可能根本想不到这里面会有什么难点。那么今天我就带你看看怎么解决这个问题,以及如何将多个解决方案整合在一起打造一个复杂的亮点方案。

分库分表键选择

分库分表键是指你选择进行分库分表的业务字段,有些时候会有多个字段。那怎么选择合适的字段呢?
一句话:根据查询来选择。例如在订单里面,最常见的是按照买家进行分库分表。理由很简单,买家查询自己的订单是最主要的场景。既然买家查得多,买家的服务体验也更加重要,所以选择买家 ID 进行分库分表收益最大。
你也可以看到这个完全是业务驱动的。最常用的分库分表键有主键、外键、索引列。如果是范围分库分表,那么日期类型的列也很常用。
有些人喜欢把分库分表键的选择说得仿佛非常艰难,实践中根本不是这样的,因为事实上你根本没有多少个候选项。再结合业务,很快你就能选出合适的分库分表键。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了解决分库分表无法通过分库分表键进行查询的多种方案。首先强调了选择合适的分库分表键的重要性,其次讨论了设计重试方案时需要考虑的因素,以及面试准备中需要了解的相关内容。文章还介绍了在面试中如何回答与无分库分表键查询相关的问题,并提出了解决方案,包括引入中间表、二次分库分表、使用其他中间件等。这些方案详细介绍了每种解决方案的优缺点,以及如何优化和应对可能出现的问题。最后,提出了一个综合方案,结合了引入中间表、二次分库分表和Elasticsearch的应用,以满足不同查询需求。文章还总结了面试要点,并提出了思考题,引发读者深入思考。整体而言,本文内容详实,涵盖了分库分表的关键技术点,为读者提供了解决无分库分表键查询问题的思路和方法。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《后端工程师的高阶面经》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • nadream
    引入中间表的问题:中间表包含了全部分表的全部行,虽然只包含了少量字段,那么这个表数据行数会非常大,查询也存在很大的性能问题吧?

    作者回复: 确实有这个问题。但是中间表说到底是一个窄表,所以说有性能问题,但是相对来说还好。如果要是不能接受的话,就可以考虑用 Redis,但是 Redis 不太能支撑复杂的查询。

    2024-01-22归属地:浙江
  • Geek_be29f8
    老师,有一种查询场景帮忙分析下: 数据量级很小,万级,但是字段数极多,成百上千的字段,且存在一些查询场景,最差情况下真的要求允许上百个查询字段条件同时存在,建立这么多字段的联合索引根本不现实。这种情况下应该怎么做,使用es 等来做合适吗,帮忙分析下

    作者回复: 在少数关键列上创建索引就可以了,毕竟你只需要有一两个列能命中索引,过滤掉大部分数据,少部分回表查询也无所谓。因为你这里的数据量级很小。 使用 ES 也行,或者可以看看列式数据库。

    2024-01-14归属地:北京
    2
  • sheep
    老师有几个问题,没接触过分库分表场景有点懵: (1) "比如说大多数电商的订单都是按照买家 ID 来进行分库分表的,那么商家该怎么查询订单呢?又或者买家找客服,客服要找到对应的订单,又该怎么找",这里查询对应订单的话,一般都是用订单id直接去查的吧,然后订单id中如果夹带买家ID信息,不就可以定位到对应库和表了么?那这里担忧的是什么个场景呢(难道是订单id可能不是通过夹带买家ID这种情况?也就是订单id内啥用户信息都没有的情况?),可以展开sql说一下咩 (2) “引入中间表”这里,"记录了 ID、卖家 ID、买家 ID 三个数据",这里第一个ID指的是订单id? (3) ES用来解决分库分表中间件解决不了的问题,那MongoDB也同样可以使用吧?

    作者回复: 1. 我商家上来,要拉出我今天成交的订单,你去哪里找订单 ID?就有点像是你点开某宝的订单中心,你也不知道你有啥订单。 2. 是的 3. 是,而且我一般都是觉得如果没有很复杂的关系型运算的话,还不如用 mongodb,自己分库分表麻烦死了。

    2023-11-10归属地:广东
  • 浩仔是程序员
    老师讲的挺好的。之前我也想过这个问题,比如短视频的存储,一般按照视频id去分表,但通过用户id查询自己的视频很正常,后面了解到除了视频id分表外,还有根据建表的索引如用户id去构建另外一个分表,当然存储的字段比较少,这个是代理proxy做的,空间换时间

    作者回复: 嘿嘿,反正没有完美的解决方案,业务能接受就可以。

    2023-09-16归属地:广东
  • Jason Ding
    面试的时候被问到这个问题我都会加一个回答,公司有实时数仓,对 TO B实时性要求不高的查询 我们都会基于数仓做成宽表,再基于es提供查询。

    作者回复: 赞!然后你就可以接着数仓或者 ES 使劲吹嘘了

    2023-09-01归属地:上海
  • peter
    请教老师几个问题: Q1:老师工作的公司一般怎么用分库分表的,包括中间件的选型等。 Q2:文中老师对业务查询用了“变幻莫测”,在比较大的互联网公司,业务查询是一件非常麻烦的事情吗?(本人没有在互联网公司工作过,没有体会) Q3:ES也可以当做分库分表中间件吗?第一次听说。

    作者回复: 1. 嘿嘿,我做过分库分表中间件,所以什么样的分库分表规则我都见到过,因为做过分库分表,所以我建议你选shardsingsphere,它还是很强的。 2. 显然……而且越是复杂的业务,查询越是脑洞大。 3. 不是用来充当分库分表中间件,而是用来解决分库分表中间件解决不了的问题。

    2023-07-29归属地:北京
  • ZhiguoXue_IT
    1)关于跨进程重试,简单来说就是不在一个进程执行任务,作为异步mq的消费方是一套集群,重试的时候轮循选择节点进行重试,阿里的rocketmq重试16次进行死刑队列,人工处理 2)之前也没涉及过这种业务,数据如果存放两份,高并发的情况下必然会出现数据不一致 2)对于大数据量的搜索,业界内大部分厂商会借助Elasticsearch的搜索能力,我在用Elasticsearch会发现在创建索引的时候,要制定刷盘的时间,一般都是设置的1s,为了减少压力,此时就会出现用户在插入es后,然后进行查询,并没有获取到,作者有遇到过吗

    作者回复: 哈哈哈,我自己没遇到过,但是听别人提到过。我遇到过类似的场景,但是基本上都是要么缓存的问题,要么数据同步的问题。

    2023-07-29归属地:北京
  • Johar
    1. 我们目前主要是使用分布式任务调度对失败的任务进行重试 2. 有可能,造成原因是商家服务,订单服务收到的事件的时序不一样造成 3. 老师有没有什么好的方法解决分库分表在扩容或者缩容或者节点故障造成数据迁移的方案?

    作者回复: 数据迁移是一个很麻烦的事情……你可以看我专栏另外一篇讲数据迁移的,没有开箱即用点开即用的工具,都很麻烦。

    2023-07-28归属地:重庆
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部