MySQL - SQLite如何改进这个非常简单的查询?

时间:2010-09-02 10:57:38

标签: mysql sqlite

我有一张简单但很大的桌子。

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来避免子查询,但它不会改善执行时间。)

我目前只使用一个月的数据,但在某些时候我将不得不使用几年。

我的问题如下:

  1. 有没有办法改善我的查询?
  2. 给定大数据集,我应该使用其他数据库引擎吗?
  3. 任何提示?
  4. 谢谢!

4 个答案:

答案 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

谢谢!