前言
这两天知识星球中有位球友问了我一个问题,这个问题非常有代表性,今天分享给大家,希望对你会有所帮助。
球友:三哥又来提问了,现在的需求是需要分页展示一个列表,列表的数据来源于两张表A,B,但表A查询的数据需要优先展示在最前面,这个需要怎么处理啊?
方案1
刚开始我看到这个需求,以为只是单纯的join一下表就可以解决问题了。
我的回复:这个问题很简单,只需要改成下面的sql就可以满足需求了。
selectxxx,sortIndexfrom
(selectxxx,1assortIndexfromA
unionall
selectxxx,2assortIndexfromB
)s1
orderbysortIndexasc
limit0,20这样可以保证既使用了分页功能,又让表A的数据排在前面。
当然还有其他排序字段的要求,可以加在sortIndex的后面。
但球友看完方案之后。
说:我也是想着union all,但是被技术leader否决了,说性能很差,不让我用。
我此时有点懵,我问:性能差在哪里?
他回复:列表数据来源表比较特殊,是从一个字段解析出来的json数据,

再和表A查出来的数据组合。
终于搞明白,他真正的需求了。
他们系统有两张表:A和B,其中A表的数据保存在几个字段中,而B表的数据保存在一个json字段中。现在要将这两张表的数据做成分页查询的功能,又要保证性能。
方案2
我继续问了一下:表A的数据有多少条?
球友回复:表A数据应该不多,其实就是查表A的暂存数据,暂存数据在表单提交完就会删掉。
我回复:如果不多可以一次性加载到内存中,做一个假分页。
完整的方案是这样的:
- 表A每次查全量数据,计算一个count值。表B查count值,两个count相加,就是总的记录条数。
- 然后根据每页大小,计算有多少页。
- 根据具体参数传入第几页,判断是从内存中获取表A的数据,还是从表B中分页查询数据。
- 当然还有一种极端情况,有一部分是从表A中获取数据,另一部分是从表B中获取数据。这种情况也好处理,分页查询表B时,将pageSize改成每页大小 - 表A中分页查出的数据数量。
他回复:我大概明白了,我先试一下哈,三哥。