如何优化这个MySQL查询? (移动窗口)

时间:2011-09-21 23:28:39

标签: mysql sql indexing window query-optimization

我有一张巨大的桌子(400k +行),其中每一行都描述了外汇市场中的一个事件。表的主键是一个名为“pTime”的整数 - 它是事件在POSIX时间内发生的时间。

在我经常运行的模拟过程中,我的计算机会反复查询我的数据库。在此模拟期间,我将输入pTime(我称之为qTime)传递给MySQL过程。 qTime是来自同一个巨大表的查询点。使用qTime,我的过程根据以下规则过滤表:

仅选择那些pTime在任何一天距离输入qTime最多2小时的行。

离。

query point: `2001-01-01  07:00`
                                 lower limit: `ANY-ANY-ANY 05:00`
                                 upper limit: `ANY-ANY-ANY 09:00`     

在此查询之后,查询点将移动1行(5分钟),并将启动新查询:

query point: `2001-01-01  07:05`
                                 lower limit: `ANY-ANY-ANY 05:05`
                                 upper limit: `ANY-ANY-ANY 09:05`     

这就是我实现这一目标的方式:

SELECT * FROM mergetbl WHERE
TIME_TO_SEC(TIMEDIFF(FROM_UNIXTIME(pTime,"%H:%i"),FROM_UNIXTIME(qTime,"%H:%i")))/3600
BETWEEN -2 AND 2

虽然我有一个关于pTime的索引,但是这段代码显着减慢了我的软件速度。

我想为pTime的每个值预先处理这个语句(稍后它将作为输入qTime),但我无法找到一种方法来做到这一点。

3 个答案:

答案 0 :(得分:2)

您的查询仍然需要扫描每个值,因为您正在测试未跨越索引的特定范围内的时间。

您需要将时间分成不同的字段和索引,以获得索引的好处。

(注意:答案被编辑以解决我对问题的原始误解)

答案 1 :(得分:2)

如果您依赖 - 我建议您添加另一列time类型,时间分数为pTime并对其执行查询

答案 2 :(得分:1)

在这种情况下,DATETIME是错误的类型,因为如果您只检查 值的TIME部分,我所知道的DATETIME存储系统将无法使用索引。正如其他人所说,简单优化是将时间分别存储在数据类型TIME(或者某种整数偏移量)和索引 的字段中。

如果您真的希望同一列中的两条信息,则必须滚动自己的数据格式,从而优先考虑时间类型。您可以使用格式为HH:MM:SS YYYY-MM-DD的字符串类型,或者您可以使用NUMERIC字段,其中整数部分是从午夜起的秒数,小数部分是从引用开始的天数 - 日期偏移。

另外,请考虑索引的价值。如果您的范围是四小时,假设在白天平均分配,则此索引将返回数据库的17%。虽然这会产生一些好处,但如果你正在进行任何其他过滤,我也会尝试将其用于你的索引。