次のようなテーブルがあるとします。
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;
厄介なのは、これを5分ごとに行う必要があることです(各ゲームは数分しか続かず、1時間ごとに数千あります)。おそらく6か月間です。興味のある日付範囲をループして、5分間隔で@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」のインデックス作成の量は役に立たないようです。これはおそらく標準的なクエリパターンの標準的な問題であると私は感じているので、ここで助けていただければ幸いです。