一个db的查询优化记录

h2 DB中有一个表:
CREATE TABLE ASSET(
ASSET NUMERIC ,
REAL NUMERIC ,
TIMESTAMP NUMERIC ,
TIMESTRING VARCHAR(100)
)
其中TIMESTAMP是UnixTime,表的索引是TIMESTAMP

需要将某天之前的最后一条记录找出来:
因为计算前一天还是有点小复杂,各种case,因此直接将UnixTime转成天,就是从1970-1-1到timestamp的天数

int day = (new Date())/1000/60/60/24;

最早考虑在h2中查询:
select top 1 * FROM ASSET where TRUNCATE( TIMESTAMP/1000/60/60/24) < day order by TIMESTAMP desc;
(1 row, 3061 ms)

稍微看一下就能发现,时间花在TRUNCATE和order by上了,先优化TRUNCATE,不用每条记录都计算一次:
select top 1 * from asset where TIMESTAMP < day*1000*60*60*24 order by TIMESTAMP desc,
其实这个查询是有问题的,详情可以见前一篇blog,时间已经大大减少
(1 row, 669 ms)

能完成任务,美中不足的是,时间有点久,能不能继续优化呢?
此查询我们只需要一条记录,但是此查询实际上是要遍历一遍此表的,主要是需要order by desc,能不能不遍历呢?
答案是肯定的:我们只需要查询出满足条件的timestamp < day*1000*60*60*24最大的timestap就可以
使用max
select max(TIMESTAMP) from asset where TIMESTAMP< day*1000*60*60*24
这样我们就获得到了timestamp了,如果只需要此字段,我们已经完成了任务,如果还需要其它字段,则需要查询出相应的记录即可:
select * from asset
where TIMESTAMP= select max(TIMESTAMP) from asset where TIMESTAMP< day*1000*60*60*24
(1 row, 1 ms)

怎么样,时间大大缩短了,基本上可以忽略不计了,是不是很有感应感?

你可能感兴趣的:(h2-db)