TOP [N]记录组按用户查询以最佳方式查询

Kal*_*han 5 java mysql spring jpa spring-data-jpa

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

让我们假设以下条件

1.有n个用户

2.系统在移动时收集每个驾驶员的GPS坐标

3.我们必须按降序排序按LAST_UPDATE_DATE排序的每个用户的最后10个GPS坐标记录

4.表中有超过1982008条记录

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

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

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

任何人都可以使用Spring数据JPA建议什么是最好的解决方案,我也打开使用Normal JDBC,以防Spring数据JPA无法解决这个问题

我正在使用Spring数据JPA,Mysql,Java 8

这是create table命令

@RaymondNijland好的,这是create table命令

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
;
Run Code Online (Sandbox Code Playgroud)

Dav*_*INO 1

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

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

有关 MySql 中的解决方案,请阅读这篇文章

对于地理数据库,您还可以使用 MySql。这里是MySql 支持的空间数据类型的链接。