前[N]个记录组,按最佳方式按用户查询

时间:2018-06-25 15:40:24

标签: 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来解决此问题的最佳方法吗,如果Spring数据JPA无法解决此问题,我也愿意使用Normal JDBC

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

这是为此创建表的命令

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

require('dotenv').config();
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
var request = require('request-promise');

var get = function(arg1, arg2, arg3, arg4) {
    request(`https://www.googleapis.com/customsearch/v1?key=${process.env.API_KEY}&cx=${process.env.CX}&q=${arg1}`, async function(err, res, body) {
        var obj = JSON.parse(body);
        var url =  obj.items[0].formattedUrl;
        var part = await request(`${url}/staffel-${arg2}/episode-${arg3}`, function(err, res, body) {
            const dom = new JSDOM(`${body}`);
            var part = dom.window.document.getElementsByClassName(arg4)[0];
            return part;
        });
        console.log(part);
    });
};

1 个答案:

答案 0 :(得分:1)

最好的解决方案通常是将排序和提取留给数据库。 如果需要使用Java在本地对数据进行排序和提取,则需要将所有数据从数据库提取到Java服务器。这会产生巨大的网络流量开销,从而导致性能下降。

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

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

对于地理数据库,您也可以使用MySql。这里是MySql支持的spatial data types的链接。