Neal's Space
  • Introduction
  • Algorithm
    • 数学基础
    • Normal
      • 一致性哈希分布
      • A star 寻路
      • 蓄水池抽样 Reservoir Sampling
    • Machine Learning
      • k-近邻算法
      • k-平均演算法
      • kd-Tree算法
      • TF-IDF 特征加权
      • 机器学习模型评价
      • 数据的归一化和标准化
      • 线性回归 - "模型之母"
      • 逻辑回归 - "出场率最高算法"
      • 决策树
  • Programming Language
    • Java
      • Lombok
      • 多数据源分页查询拼接订单
      • 集群 分布式 微服务
      • 反射
      • JAVA类加载器
      • JVM内存
      • Garbage Collection(JVM的垃圾回收机制)
      • Synchronized
      • Java跨域访问
    • Scala
      • Scala使用
  • MySQL
    • MySQL事务
    • MySQL插入多条数据时遇到的问题
    • MySQL经典50题
  • Linux
    • Linux
      • Vim
      • Ubuntu换源
      • Linux内存
    • Docker
      • Docker
      • Docker容器
      • Docker镜像
      • Docker创建本地镜像
  • Data
    • DataWarehouse
      • Sqoop
      • 多维计算
    • Hadoop
      • Hadoop
        • Docker运行Hadoop
      • Hdfs
        • HDFS块丢失过多导致进入安全模式
        • NameNode内存解析
        • HDFS的Router-Based Federation
    • Hive
      • Hive安装配置
      • Hive使用DDL
      • Hive引擎Tez
      • Sqoop与Hive出现的问题
      • Hive与Hook
    • Flume
    • Hbase
      • Hbase安装配置
      • Hbase的Bloom Filters
    • Spark
      • Spark基础
      • Spark SQL
      • Spark Streaming
      • Spark On Yarn
      • Tuning Spark 数据序列化和内存调整
      • Tuning Spark Job
    • Kafka
      • Kafka文件存储
      • 偏移量提交 与 分区再平衡
    • Flink
      • Flink遇到的坑
Powered by GitBook
On this page

Was this helpful?

  1. Programming Language
  2. Java

多数据源分页查询拼接订单

在工作的项目中遇到了一个问题,

描述:订单列表中原本是单库单表存储订单历史,因为有对接第三方服务,所以出现了多数据的查询,需要整合到同一列表中,并根据时间倒序进行排序,分页展示,每页展示十条数据

思路:

因考虑数据量可能太大,整合成新表进行查询不太现实,经过以下几步思考结果

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组合取值后,进行排序并选取合适的数据进行展示。

此方法可以保证列表的精准性,并允许了简单的跳页功能,暂时来说是我自己想到最好的办法了。

PreviousLombokNext集群 分布式 微服务

Last updated 5 years ago

Was this helpful?