首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加速特定sqlite查询的正确方法

加速特定sqlite查询的正确方法
EN

Stack Overflow用户
提问于 2019-02-26 18:43:25
回答 2查看 43关注 0票数 0

我正在做一个模拟。

在这个模拟中,智能体的移动和移动,以及坐标和时间步长,被记录在sqlite数据库中。

当模拟完成时,我需要显示智能体在某个时间的位置。为此,我使用如下查询

代码语言:javascript
复制
SELECT x,y,z,t from movement where t <= ?1 and id = ?2;

我只接受max(t)的记录。这工作得很好,但速度非常慢。

我需要加速它,我想我可以改变数据库的结构。但我不能为每个代理插入位置记录,因为db会增长太多。

与在每个时间步添加代理的“最后有效位置”的记录相同。

那么,我还有其他选择吗?

谢谢

更新:对于这个问题,Movements表只有一堆字段,用于位置(x,y整数)、时间(t整数)和代理的id (整数)。记录数量:时间步数高达50.000,代理可以高达10.000,移动频率可以达到1/10的时间步长。因此,在一个大型模拟中,我们可能有大约5.000个移动,10.000个代理= 5M个移动记录。

EN

回答 2

Stack Overflow用户

发布于 2019-02-26 19:28:41

如果您创建的表是这样的,那么主键在id和t上

代码语言:javascript
复制
CREATE TABLE `Movement` (
    `ID`    INTEGER,
    `T` INTEGER,
    `X` INTEGER,
    `Y` INTEGER,
    `Z` INTEGER,
    PRIMARY KEY(`ID`,`T`)
);

并像这样查询:

代码语言:javascript
复制
select id,t,x,y,z
from Movement
where id=?2 and t = (select max(t) from Movement where id=?2 and t <= ?1);

这会有帮助吗?在这种情况下,不能有任何重复的id /t对。

票数 0
EN

Stack Overflow用户

发布于 2019-02-26 20:28:00

对查询进行如下表述:

代码语言:javascript
复制
select x, y, z, t
from movement
where t <= ?1 and id = ?2
order by t desc
limit 1;

您可以在movement(id, t, x, y)上尝试索引以获得更好的性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54883643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档