按DATETIME值和时间范围加载行

时间:2018-03-11 17:55:32

标签: mysql sql

在我的mysql数据库中,我每分钟插入一行100行。名为' time'的列是DATETIME类型包含日期&插入时间(不包括秒数)。 我正在寻找一种有效的方法来从该表中获取行 - 在指定的时间范围内。 例如,如果我的时间范围是15分钟,则将获取以下行:

3-11-18 13:00:00
3-11-18 13:15:00
3-11-18 13:30:00
3-11-18 13:45:00
3-11-18 14:00:00

...等 对于一小时的时间范围,它将获取

3-11-18 13:00:00
3-11-18 14:00:00

目前,我正在使用LIKE运算符来执行此操作。例如,15分钟的时间范围查询如下所示:

SELECT * FROM my_table WHERE time LIKE '%:15:00' OR time LIKE '%:30:00' OR time LIKE '%:45:00' OR time LIKE '%:00:00';

但这些查询运行速度非常慢。 我该怎么做才能提高性能?

2 个答案:

答案 0 :(得分:0)

您可以尝试在几分钟内添加生成的列并在其上设置索引:

alter table my_table add column minute tinyint unsigned as (minute(time));
alter table my_table add index (minute);

这样的查询
select * from my_table where minute(time) = 0;

会使用该索引。

但我不确定它是否有助于查询

select * from my_table where minute(time) in (0, 15, 30, 45);

原因是WHERE条件的选择性在这里不是很好。跳过15行中的14行的全表扫描可以比索引搜索+聚集索引的第二次往返更快。在这种情况下,你无能为力。除了创建覆盖索引。但是,涵盖SELECT *的索引可能对每分钟100次插入有害。

答案 1 :(得分:0)

使用MOD按时间范围要求进行过滤。

对于15分钟的时间范围:

SELECT * 
from my_table
where mod(minute(time),15) = 0

30分钟的时间范围:

mod(minute(time),30)  = 0

一小时(60分钟)的时间范围:

mod(minute(time),60)  = 0

或者

minute(time) = 0

广义WHERE条款,适用于15,30或60分钟的时间范围:

mod( minute(time), <timeframeInMinutes>) = 0