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

时间:2019-02-26 10:43:25

标签: sql database sqlite

我正在模拟。

在此模拟中,代理移动,并且将移动以及坐标和时间步长记录在sqlite数据库中。

模拟完成后,我需要在特定时间显示代理的位置。为此,我使用类似

的查询
SELECT x,y,z,t from movement where t <= ?1 and id = ?2;

,我只记录max(t)的记录。效果很好,但是非常慢。

我需要加快速度,我认为我可以更改数据库的结构。但是我无法为每个代理插入职位记录,因为数据库会增长太多。

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

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

谢谢

更新: 对于问题,Movements表仅包含一堆字段,用于表示位置(x,y INTEGERS)时间(t INTEGER)和代理的ID(Integer)。 记录数:时间步长最多为50.000,座席最多可以为10.000,移动最多可以发生1/10个时间步长。因此,在一个大型模拟中,对于10.000个业务代表,我们可以进行约5.000次移动= 500万次移动记录。

2 个答案:

答案 0 :(得分:0)

如果您是这样创建表的,则主键分别位于 id t

CREATE TABLE `Movement` (
    `ID`    INTEGER,
    `T` INTEGER,
    `X` INTEGER,
    `Y` INTEGER,
    `Z` INTEGER,
    PRIMARY KEY(`ID`,`T`)
);

并这样查询:

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 对。

答案 1 :(得分:0)

按如下方式查询:

select x, y, z, t
from movement
where t <= ?1 and id = ?2
order by t desc
limit 1;

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