假设我有一个这样的表:
CREATE TABLE foo (
gid BIGINT PRIMARY KEY,
starttime BIGINT,
endtime BIGINT
);
此表存储一系列游戏的开始和结束时间(以“从纪元开始的秒数”格式)。现在,我想知道某个时刻有多少游戏正在运行。这是自然查询:
SET @t = UNIX_TIMESTAMP('2012-07-12 12:00:00');
SELECT COUNT(f.gid) FROM foo f WHERE @t BETWEEN f.starttime AND f.endtime;
复杂的是我需要每五分钟做一次(每场比赛只持续几分钟,我们每小时有几千场),并且可能持续六个月。我确实有循环遍历我感兴趣的日期范围并每隔五分钟生成@t 的程序。问题是查询太慢了。我目前将所有@t 存储在我已编制索引的单独表中,如下所示:
CREATE TABLE bar (
interval BIGINT PRIMARY KEY
);
所以我现在的查询是:
SELECT b.interval, COUNT(f.gid)
FROM bar b LEFT JOIN foo f
ON b.interval BETWEEN f.starttime AND f.endtime
GROUP BY b.interval;
这太慢了,对表“foo”的索引似乎没有任何帮助。我觉得这可能是一个标准查询模式的标准问题,因此在此不胜感激。