java - TOP [N] 记录 Group By per user query in the best possible way

标签 java mysql spring jpa spring-data-jpa

我今天遇到了一个有趣的问题:

让我们假设以下条件

<强>1。有n个用户

<强>2。系统会收集每个司机移动时的 GPS 坐标

<强>3。我们必须查询每个用户的最后 10 条 GPS 坐标记录,按 LAST_UPDATE_DATE 降序排列

<强>4。表中有超过1982008条记录

我通过查询最后的 {(10 + [threshold value]) * n} 记录解决了这个问题,并使用 HashMap 在 java 中排列它们,其中用户是 Key,各个坐标的列表是值(value)观

这似乎不是最佳解决方案,因为它可能会选择随机记录并且可能不会覆盖每个用户的 10 条记录,

在 for 循环中按用户查询也不是最佳解决方案,因为它需要多次数据库调用

任何人都可以建议使用 Spring 数据 JPA 的最佳解决方案是什么,如果 Spring 数据 JPA 无法解决这个问题,我也愿意使用普通 JDBC

我为此使用 Spring 数据 JPA、Mysql、Java 8

这是创建表的命令

@RaymondNijland 好的,这是创建表的命令

CREATE TABLE `gps_coordinate` (
    `ID` BIGINT(50) NOT NULL AUTO_INCREMENT,
    `user_id` VARCHAR(255) NULL DEFAULT '0',
    `driver_id` INT(20) NULL DEFAULT '0',
    `latitude` VARCHAR(50) NULL DEFAULT '0.00000000',
    `longitude` VARCHAR(50) NULL DEFAULT '0.00000000',
    `distance_in_miles` VARCHAR(50) NULL DEFAULT '0.00',
    `distance_in_kms` VARCHAR(50) NULL DEFAULT '0.00',
    `device_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `created_by` VARCHAR(50) NULL DEFAULT 'Anonymous',
    `created_date` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_by` VARCHAR(50) NULL DEFAULT 'Anonymous',
    `updated_date` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`ID_HUB`),
    INDEX `user_fk` (`user_id`),
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=208445
;

最佳答案

最好的解决方案通常是将排序和提取留给数据库。 如果您需要在 java 中本地排序和提取数据,您需要将所有数据从数据库提取到您的 java 服务器。这会产生巨大的网络流量开销,导致性能不佳。

有许多数据库可以很好地处理地理空间数据,并且可以查询提供按距离或类似排序的表格。如果您只需要获取每个用户的最后 10 个位置,则不需要地理空间特征,任何数据库都可以正常工作。

有关 MySql 中的解决方案,请阅读 this article .

对于地理数据库,您也可以使用 MySql。这里有一个链接到 spatial data types由 MySql 支持。

关于java - TOP [N] 记录 Group By per user query in the best possible way,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51027253/

相关文章:

mysql - 根据另一个表的 ID 查询一个表中的数据

php - 在mysql php中将数组拆分为单独的列

mysql - 如何在 MySQL 右连接中对结果进行排序?

java - Apache Camel : What is the best way to reuse Camel routes from other routes?

java - 从目录创建依赖项

java - 不知道赋值运算符是怎么工作的[处理中]

java - "org.omg.CORBA.BAD_OPERATION: Cannot extract ulonglong"与 JacORB 客户端超时策略

java - 无法在Java中一起打印字符串和 boolean 值

java - Maven 测试失败 - 属性 Autowiring 不起作用

java - MySQL 的 Quartz JDBCJobStore 问题