面试官:分库分表怎么分页 #Java #Java程序员 #Java面试 #编程#分库分表
✅ 已完成任务ID: 1647
30秒速读
核心摘要
本视频讲解分库分表分页的问题场景、落地方案及相关面试应答技巧。
可执行建议
- 面试应答该问题时,先说明问题触发前提,再分层输出不同方案,体现技术深度。
- 实际开发中优先结合业务特性选择适配方案,避免盲目实现复杂分页逻辑。
标签与备注
标签
备注
暂无备注
转录文本
哈喽,大家好,我是徐述。 最近有同学面试被问到了分库分表下如何进行分页。 那首先我们要搞清楚,并不是说用了分库分表,分页它就一定是个问题。 给大家举个例子,就比如说我们有一个订单表,我按照范围的分片策略来进行分片。 我一个月分一个片,或者我按照订单的区域来进行分片。 那这个时候假如说我只查询当前这个分片的数据,并且我的排序字段以及我的条件,都是用的当前的这个分片键。 那这个时候哪怕你用到了分库分表,也不会有任何的分页问题,因为它就是操作单表,对不对? 所以只有出现了跨库跨表的查询,分页才是一个问题。 那我先来给大家介绍一下,目前现成的一些比较成熟的解决方案。 就比如说我们可以用ES这种分布式的搜索引擎,或者我们也可以用分布式的数据库。 由于它们天然就适用于这种复杂的查询,还有分页场景,所以我们可以轻松地实现分库分表的分页查询。 当然我们也需要去思考,假如说我将分库分表的分页数据保存到ES当中,怎么跟我的MySQL保证数据的一致性。 当然这个我不在这里细说。 那另外,我们也可以用ShardingSphere这个分库分表的开源框架,它内置了一些分页的优化,我们只需要面向逻辑表来进行查询。 那它会自动地帮我们改写成多个分片的SQL语句,并且把查询到的数据进行合并,通过流式的方式,在应用程序当中进行实时的排序和过滤。 那它利用的是一种所谓的全局查找法,什么是全局查找法呢?我待会会给大家去介绍,好吧。 那最后,就是业务妥协的方案了,这种方式,也是徐硕老师惯用的一种解决方案。有经验的程序员,面对一些需要付出非常复杂的代码逻辑去实现的这些需求,通常都会去跟产品进行沟通:我能不能换一种更简单的方式,总归也满足你的需求来进行实现。比如说我只提供用户查询当前这个分片的数据,我的数据量太大了,我不允许你去查询全局的数据。那只查询当前分片的话,它不会出现跨库跨表,就像我们操作单表一样简单,肯定就不是问题了。对吧?当然也可以提示用户,我仅显示部分结果。那这种方式,产品它可能不一定会同意,对吧?但是上面这种方案,我相信很多产品,它是会同意的。 好吧,那通过这三种解决方案,我们可以去解决分库分表下的分页问题。当然如果你去面试,面试官他可能就是想要深挖你、拷打你,他并不想你去用一些现成的解决方案,他就想你去用一些有深度的解决方案。那这个时候我们其实就可以利用 用ShardingSphere这个全局查找法来进行回答。 那我们来介绍一下什么是全局查找法。 举个例子,就比如说在单表的情况下,我们需要查询3和4这条数据。 那我们的SQL语句呢,就可以写成Limit,从第二条开始找,然后每一页两条数据。 这个SQL语句,我相信大家都会写,对吧。 那如果我们进行了分库分表,我们按照取模的分表策略来进行分表。 那这个时候3和4呢,它就分布在了多个节点当中。 那如果你每一个分表都通过这个Limit 2,2来进行查询的话,那查询的将不是3和4了,对吧,而是5、6、7、8了。 所以这就是分库分表下面的分页问题。 那全局查找法是怎么解决的呢?也就是我们把涉及到的全局的数据都给它查出来。 比如我们从第零条开始找,然后去找二加偏移量的数据。 也就是在单表下面呢,我们的偏移量是二,对吧。那么相当于,就是二加我们需要找到0到4的数据。 那有同学可能就会问,为什么要从第零条开始找啊?1跟2明显不是我们需要的呀。 那我告诉你,你这样是站在上帝的视角来看。但是我们在实际的情况下,假如我通过条件进行了过滤,那数据可能只会在某一个节点当中,当然这是比较极端的情况。 所以有可能,三跟四它就会在第一条和第二条,对吧? 当然也有可能一、二、三、四,对不对? 所以,这是最极端的情况下,所有的数据,它只在一个节点当中。 所以这就是为什么我们要从第零条开始找,找的范围也会更大。 所以此时,我们就会找到第零条到第四条的数据。 当然找到之后,我们还需要在应用程序当中进行合并,以及还需再分页,最终拿到我们翻页所需要的数据。 那有同学看到这里,我相信你会认识到一个问题,也就是翻页越深,耗时会越长。 因为我们是从第零条开始找,对不对? 那假如说我翻到了第十万条呢,就像我们之前所说的这种极端情况,它有可能都在一个节点当中。 所以我们必须从第零条开始去找,这里涉及到的数据量就会很大。 所以面对这个问题,我们可以采用禁止跳页查询法,我们可以拿到上一页的最大ID作为过滤的条件,这样我们就不用从第零条开始找了,只需要过滤出当前这一页的数据即可。 不过这种方式,我们就可以禁止跳页,但网络上面还有一些所谓的二次查询法,但是这种方式时间复杂度高,并且不可靠,所以我不建议大家用这种方式。其实我自己也推演过很多种数据情况,就用二次查询法…… 也没有办法去实现,所以这种方式我就不在这里介绍了。 好,所以在面试的时候,如果被问到了分库分表的分页,那首先你要告诉面试官,并不是说所有的情况,分库分表的分页都需要去解决。只有出现了跨库跨表的分页,我们才需要去解决。 那通常解决方案,我们可以采用这三种,但是如果面试官想考倒你的话,我们可以采用全局查询法来进行回答。但是全局查询法也会有一个问题,就是翻页越深,性能越差,那我们可以采用禁止跳表法来进行解决。 好吧,OK,那这个面试题,我就给大家讲到这里。如果视频对你有帮助,可以给许老师一键三连。我们下期见。