我有一张表(logs
),它包含以下列(还有其他列,但这些是重要的):
- id(PK,int)
- Timestamp(datetime)(索引)
- Duration(int)
基本上,这是一个在某个时间开始并在某个时间结束的事件记录。该表目前有几十万行数据。我希望它能够增长到数百万行。为了加快查询速度,我添加了另一列并预先计算了值:
- EndTime(datetime)(索引)
为了计算EndTime,我将Duration
中的秒数加到Timestamp
字段中。
现在我想运行一个查询,其中结果计算起始时间(Timestamp
)和结束时间(EndTime
)都落在特定时间点之外的行数。然后我想针对一个很长的时间段(比如一年)每秒运行此查询。我还想计算在特定时间点开始并在特定时间点结束的行数。
我创建了以下查询:
SELECT
`dates`.`date`,
COUNT(*) AS `total`,
SUM(IF(`dates`.`date`=`logs`.`Timestamp`, 1, 0)) AS `new`,
SUM(IF(`dates`.`date`=`logs`.`EndTime`, 1, 0)) AS `dropped`
FROM
`logs`,
(SELECT
DATE_ADD("2010-04-13 09:45:00", INTERVAL `number` SECOND) AS `date`
FROM numbers LIMIT 120) AS dates
WHERE dates.`date` BETWEEN `logs`.`Timestamp` AND `logs`.`EndTime`
GROUP BY `dates`.`date`;
请注意,数字表格严格用于方便地枚举日期范围。它是一个只有一列
number
的表格,包含值 1、2、3、4、5 等等。这正好给了我我所需要的东西……一个有 4 列的表格:
- 日期
- 总数(起始和结束时间在当前时间点之外的行数)
- 新的(从此时间点开始的行数)
- 删除的(在此时间点结束的行数)
任何建议都将非常有帮助。谢谢您的时间。
编辑:我在时间戳和结束时间上建立了索引。
查询 EXPLAIN 的输出:
"id";"select_type";"table";"type";"possible_keys";"key";"key_len";"ref";"rows";"Extra"
"1";"PRIMARY";"<derived2>";"ALL";NULL;NULL;NULL;NULL;"120";"Using temporary; Using filesort"
"1";"PRIMARY";"logs";"ALL";"Timestamp,EndTime";NULL;NULL;NULL;"296159";"Range checked for each record (index map: 0x6)"
"2";"DERIVED";"numbers";"index";NULL;"PRIMARY";"4";NULL;"35546940";"Using index"
当我在日志表上运行分析时,它显示状态为“OK”。
EXPLAIN
输出是什么?你是否已经对logs
表进行了分析? - outisEXPLAIN EXTENDED
查询后发布SHOW WARNINGS
的结果。 - outis