我有一张简单但很大的桌子。
id_tick INTEGER eg: 1622911
price DOUBLE eg: 1.31723
timestamp DATETIME eg: '2010-04-28 09:34:23'
对于1个月的数据,我有230万行(150MB)
我的查询旨在在给定时间返回最新价格。
我首先设置一个SQLite表并使用查询:
SELECT max(id_tick), price, timestamp
FROM EURUSD
WHERE timestamp <='2010-04-16 15:22:05'
它在1.6s内运行。
因为我需要运行这个查询数千次,所以1.6s太长了......
然后我设置了一个MySQL表并修改了查询(max函数从MySQL到SQLite不同):
SELECT id_tick, price, timestamp
FROM EURUSD
WHERE id_tick = (SELECT MAX(id_tick)
FROM EURUSD WHERE timestamp <='2010-04-16 15:22:05')
执行时间越来越差3.6秒 (我知道我可以使用ORDER BY和LIMIT 1来避免子查询,但它不会改善执行时间。)
我目前只使用一个月的数据,但在某些时候我将不得不使用几年。
我的问题如下:
谢谢!
答案 0 :(得分:1)
1)确保您有时间戳索引
2)假设id_tick既是PRIMARY KEY又是Clustered Index,并假设id_tick作为时间的函数递增(因为你正在做MAX)
你可以试试这个:
SELECT id_tick, price, timestamp
FROM EURUSD
WHERE id_tick = (SELECT id_tick
FROM EURUSD WHERE timestamp <='2010-04-16 15:22:05'
ORDER BY id_tick DESC
LIMIT 1)
这应该类似于janmoesen的表现,因为在任何情况下id_tick和timestamp之间应该存在高页面相关性
答案 1 :(得分:0)
你有任何索引字段吗?
索引timestamp
和/或id_tick
可能会改变很多事情。
另外,为什么不使用时间间隔作为时间戳?
WHERE timestamp >= '2010-04-15 15:22:05' AND timestamp <= '2010-04-16 15:22:05'
这将减轻MAX功能的负担。
答案 2 :(得分:0)
您是否正在使用大间隔的所有刻度进行分析?我试图将数据过滤成分钟/小时/天等图表。
答案 3 :(得分:0)
好吧,我猜我的索引在某种程度上已经损坏,重新索引会大大提高性能。
现在以0.0012秒(非缓存)
执行以下操作SELECT id_tick, price, timestamp
FROM EURUSD
WHERE timestamp <= '2010-05-11 05:30:10'
ORDER by id_tick desc
LIMIT 1
谢谢!