在我的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';
但这些查询运行速度非常慢。 我该怎么做才能提高性能?
答案 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