我正在模拟。
在此模拟中,代理移动,并且将移动以及坐标和时间步长记录在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万次移动记录。
答案 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)
上进行索引以获得更好的性能。