多数据源分页查询拼接订单
在工作的项目中遇到了一个问题,
描述:订单列表中原本是单库单表存储订单历史,因为有对接第三方服务,所以出现了多数据的查询,需要整合到同一列表中,并根据时间倒序进行排序,分页展示,每页展示十条数据
思路:
因考虑数据量可能太大,整合成新表进行查询不太现实,经过以下几步思考结果
1。从两个数据库各获取五条订单,按时间顺序进行排序展示。
查询sql语句:
第一页:SELECT * FROM table_order ORDER BY date DESC OFFSET 0 LIMIT 5
拼接多个数据库的列表并排序后展示。
第二页:SELECT * FROM table_order ORDER BY date DESC OFFSET 5 LIMIT 5
拼接多个数据库的列表并排序后展示。
第N页:SELECT * FROM table_order ORDER BY date DESC OFFSET 5*(N-1) LIMIT 5
拼接多个数据库的列表并排序后展示。
缺点:订单列表非常乱,可读性巨差,两个服务的数量差距也比较大。(按两边大概比例拉取同样被否决)
2。每个数据库取10条数据缓存到内存中进行排序,提取前10条展示;第二页时各缓存20条,排序后取前20条展示;第N页各数据库缓存N*10条数据,排序后展示前N*10条。
查询sql语句:
第一页:SELECT * FROM table_order ORDER BY date DESC LIMIT 10
拼接多个数据库的列表并排序后展示列表中前10条
第二页:SELECT * FROM table_order ORDER BY date DESC LIMIT 20
拼接多个数据库的列表并排序后展示列表中第11~20条
第N页:SELECT * FROM table_order ORDER BY date DESC LIMIT 10*N
拼接多个数据库的列表并排序后展示列表中第10*N-9~10*N条
此方案中,能够得到业务所需要的准确数据,而不会产生乱序的情况,但是性能会差很多,并且往后翻页性能会急剧下降。服务端进行排序的数据量也比较大,对服务器的压力会有较大。
3。改进想法
(1)第一页在数据库中各取前十条,拼接列表后排序并展示前十数据。并保存最后一条记录的时间theLastDate
(2)第二页根据theLastDate进行查找,每个数据库各取十条,进行拼接后排序并把前十条数据添加进列表中,并更新最后一条记录的时间theLastDate
(3)第N页根据第N-1页的theLastDate进行查找,每个数据库各取十条,进行拼接后排序并把前十条数据添加进列表中,并更新最后一条记录的时间theLastDate
sql查询语句:
第一页:SELECT * FROM table_order ORDER BY date DESC LIMIT 10
拼接多个数据库的列表并排序后展示列表中前10条,并记录最后一条记录的时间
第二页:SELECT * FROM table_order ORDER BY date DESC WHERE date<theLastDate LIMIT 10
拼接多个数据库的列表并排序,把列表中前10条添加进订单列表中,并更新最后一条的时间
第一页:SELECT * FROM table_order ORDER BY date DESC WHERE date<theLastDate LIMIT 10
拼接多个数据库的列表并排序,把列表中前10条添加进订单列表中,并更新最后一条的时间
此方案中,可以精准的取出所需的数据,并不会产生乱序的列表;性能也比较稳定,不会因为列表的增多而使加载时间过长,但是无法跳页展示,必须是邻页跳转,跟产品经理沟通后决定改变展现方式。并不会产生太多影响。
至此, 其实问题已经基本解决,改变后的列表为上滑加载下一页内容直接拼接在列表后面,并不会出现跳页的情况。
但是,晚上回家又想了一些。
最终产生了结合2和3的方案,有再更新了一个想法:
(1)第一页在数据库中各取前十条,拼接列表后排序并展示前十数据。并保存最后一条记录的时间theLastDate
(2)页数展示时可以点击当前页的附近几页和首尾几页,中间省略~
当选择首尾几页的内容时,通过ORDER BY和LIMIT来取值,并进行排序后选取合适的数据进行展示;
当选择当前页的附近几页时,通过当前页的最值来加WHERE条件,ORDER BY和LIMIT组合取值后,进行排序并选取合适的数据进行展示。
此方法可以保证列表的精准性,并允许了简单的跳页功能,暂时来说是我自己想到最好的办法了。
Last updated
Was this helpful?