我做了一个选择last secods
的查询,例如:如果现在是10:30:30,我通过了last 20 seconds
它应该仅在10:30:10
和{{之间返回值1}},所以这里是:
10:30:30
但即使对于小的差异,例如10秒,这个查询也会花费太长时间。
修改
public List<Log> listLastSeconds(Integer id_point, int seconds) {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.SECOND, -seconds);
Date today = new Date();
Date lastSeconds = calendar.getTime();
Query query = em.createQuery("SELECT l FROM Log l WHERE l.point.id =:id AND l.time >= :lastSeconds AND l.time <= :today", Log.class);
query.setParameter("id", id_point);
query.setParameter("lastSeconds", lastSeconds);
query.setParameter("today", today);
return query.getResultList();
}
如何才能更快地改进此查询?
答案 0 :(得分:1)
您需要time
列上的索引。这样就可以了:
CREATE INDEX time_index using btree on log(time);
答案 1 :(得分:0)
我会使用DATE_ADD
。首先摆脱today
和lastSeconds
变量;使用此查询并将方法参数设置为查询的参数。
SELECT l
FROM Log l
WHERE l.point.id =:id
AND l.time >= DATE_ADD(CURTIME(), INTERVAL :seconds SECOND)
我很想测试它,但目前没有mysql访问权限。将尽快测试:)
然而,这可能不会提供很好的性能提升,因为它仍会搜索整个表格。
如果您对所使用数据的性质有所了解,例如在过去10秒内可能添加的行数最多,那么您可以添加一个表格,其中表格更大比max(id) - N,这只是例如,任何其他可以限制搜索空间并具有商业意义的指标将为您带来真正的性能提升。
时间列上的索引是一个选项,但我不是很熟悉那么实用或快速?有人对使用索引有意见吗?