0

関心のあるイベントの開始時刻と終了時刻を記録したテーブルがあります。

CREATE TABLE event_log (start_time DATETIME, end_time DATETIME);
INSERT INTO event_log VALUES ("2013-06-03 09:00:00","2013-06-03 09:00:05"), ("2013-06-03 09:00:03","2013-06-03 09:00:07"), ("2013-06-03 09:00:10","2013-06-03 09:00:12");

+---------------------+---------------------+
| start_time          | end_time            |
+---------------------+---------------------+
| 2013-06-03 09:00:00 | 2013-06-03 09:00:05 |
| 2013-06-03 09:00:03 | 2013-06-03 09:00:07 |
| 2013-06-03 09:00:10 | 2013-06-03 09:00:12 |
+---------------------+---------------------+

1 つの列が時間インデックスで、別の列がその時点で進行中のイベントの数である「時系列」テーブルを作成する方法を探しています。サブクエリとジェネレーターでそれを行うことができます:

SET @first_time := (SELECT MIN(start_time) FROM event_log);
SET @last_time := (SELECT MAX(end_time) FROM event_log);

CREATE OR REPLACE VIEW generator_16
AS SELECT 0 n UNION ALL SELECT 1  UNION ALL SELECT 2  UNION ALL 
   SELECT 3   UNION ALL SELECT 4  UNION ALL SELECT 5  UNION ALL
   SELECT 6   UNION ALL SELECT 7  UNION ALL SELECT 8  UNION ALL
   SELECT 9   UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL
   SELECT 12  UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL 
   SELECT 15;

CREATE TABLE time_series (t DATETIME, event_count INT(11))
SELECT @first_time + INTERVAL n SECOND t, NULL AS event_count
  FROM generator_16
  WHERE @first_time + INTERVAL n SECOND <= @last_time;

UPDATE time_series 
  SET event_count= (SELECT COUNT(*) FROM event_log 
  WHERE start_time<=t AND end_time>=t);

+---------------------+-------------+
| t                   | event_count |
+---------------------+-------------+
| 2013-06-03 09:00:00 |           1 |
| 2013-06-03 09:00:01 |           1 |
| 2013-06-03 09:00:02 |           1 |
| 2013-06-03 09:00:03 |           2 |
| 2013-06-03 09:00:04 |           2 |
| 2013-06-03 09:00:05 |           2 |
| 2013-06-03 09:00:06 |           1 |
| 2013-06-03 09:00:07 |           1 |
| 2013-06-03 09:00:08 |           0 |
| 2013-06-03 09:00:09 |           0 |
| 2013-06-03 09:00:10 |           1 |
| 2013-06-03 09:00:11 |           1 |
| 2013-06-03 09:00:12 |           1 |
+---------------------+-------------+

それを行うためのより効率的な方法はありますか?この方法では、時間インデックスごとにサブクエリが必要です。たとえば、「event_log」レコードごとに 1 つのサブクエリを必要とする方法はありますか? 私の本当の問題には、500k のタイム インデックス エントリと 1k のイベントがあります。思ったよりも少し時間がかかります (約 90 秒)。

「ジェネレーター」スニペットはhttp://use-the-index-luke.com/blog/2011-07-30/mysql-row-generatorからのものです。より大きな問題には、64k バージョンや 1M バージョンなどのより大きなジェネレーターの 1 つが必要になることは明らかです。

4

1 に答える 1