Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何优化这个MySQL查询?(移动窗口)_Mysql_Sql_Indexing_Window_Query Optimization - Fatal编程技术网

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

如何优化这个MySQL查询?(移动窗口),mysql,sql,indexing,window,query-optimization,Mysql,Sql,Indexing,Window,Query Optimization,我有一个巨大的表格(40万行以上),每一行都描述了外汇市场中的一个事件。表的主键是一个名为“pTime”的整数,它是事件发生的时间 在我不断运行的模拟过程中,我的计算机会反复查询我的数据库。在这个模拟过程中,我将输入pTime(我称之为qTime)传递给MySQL过程。qTime是来自同一个巨大表的查询点。使用qTime,我的过程根据以下规则筛选表: 仅选择pTime在任何一天距离输入qTime最多2小时的行 前 此查询后,查询点将移动1行(5分钟),并将启动一个新的查询: query poin

我有一个巨大的表格(40万行以上),每一行都描述了外汇市场中的一个事件。表的主键是一个名为“pTime”的整数,它是事件发生的时间

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

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

此查询后,查询点将移动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)预处理此语句,但我无法找到一种方法

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

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


(注意:编辑答案是为了修正我最初对问题的误解)

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

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


(注:编辑答案是为了修正我对问题最初的误解)

如果你只依赖时间-我建议你添加另一列时间分数为
pTime
的类型并对其执行查询如果你只依赖时间-我建议你添加另一列时间分数为
pTime
的类型并对其执行查询在这种情况下是错误的类型,因为如果只检查值的时间部分,我所知道的DATETIME存储系统将无法使用索引。正如其他人所说,简单的优化是将时间分别存储在数据类型time(或者某种整数偏移量)的字段中,并对其进行索引

如果您真的想将两条信息放在同一列中,那么您必须滚动自己的数据格式,以时间类型为主。您可以使用HH:MM:SS YYYY-MM-DD格式的字符串类型,也可以使用数字字段,其中整数部分是从午夜偏移量算起的秒,小数部分是从参考日期偏移量算起的天


也要考虑索引将有多大的价值。如果您的范围是4小时,假设在一天中分布均匀,则此索引将返回数据库的17%。虽然这会带来一些好处,但如果您正在进行任何其他筛选,我也会尝试将其应用到索引中。

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

如果您真的想将两条信息放在同一列中,那么您必须滚动自己的数据格式,以时间类型为主。您可以使用HH:MM:SS YYYY-MM-DD格式的字符串类型,也可以使用数字字段,其中整数部分是从午夜偏移量算起的秒,小数部分是从参考日期偏移量算起的天


也要考虑索引将有多大的价值。如果您的范围是4小时,假设在一天中分布均匀,则此索引将返回数据库的17%。虽然这会产生一些好处,但如果您正在进行任何其他筛选,我也会尝试将其应用到索引中。

在查询之外的代码中计算;他想要什么日期都行。只是不要为每一行计算它,与WHERE子句内联。“从任何一天的输入qTime”。您打算如何在条件之间为任何一天编写
?OP没有两个时间戳,这两个时间戳的行应该在里面,但是他有两个时间戳,每一个合适的行都应该在任何一天之内。我明白你的意思。编辑我的答案。在查询之外的代码中计算;他想要什么日期都行。只是不要为每一行计算它,与WHERE子句内联。“从任何一天的输入qTime”。您打算如何在
条件之间为任何一天编写
?OP没有两个时间戳,这两个时间戳的行应该在里面,但是他有两个时间戳,每一个合适的行都应该在任何一天之内。我明白你的意思。编辑了我的答案。
SELECT * FROM mergetbl WHERE
TIME_TO_SEC(TIMEDIFF(FROM_UNIXTIME(pTime,"%H:%i"),FROM_UNIXTIME(qTime,"%H:%i")))/3600
BETWEEN -2 AND 2