我有一个包含以下列的表:incident_id
,creation_date
,event_id
,signature_id
。
此子程序(简化版)查询表:
while time1 < end_date and time2 < end_date do
stmt = "SELECT incident_id, COUNT(event_id) AS total
FROM table
WHERE creation_date BETWEEN #{time1} AND #{time2}
AND signature_id IN (29476,9935,16353,35726,40340,45471,36047,
105630,105730,73274)
GROUP BY signature_id "
results = db_connect.fetch_all(stmt)
foreach result in results do
... some post processing ...
end
time1 = time1 + time_step
time2 = time2 + time_step
end
这个问题是列没有索引,行数很大,所以性能现在非常糟糕。有没有办法在不在循环中获取结果的情况下进行查询?
更新:我想我应该首先在循环中预先计算时间范围,然后在SQL查询中对所有这些进行OR运算。唯一的问题是COUNT(event_id),我不知道如何计算每个时间范围。
答案 0 :(得分:0)
添加此复合索引:
INDEX(signature_id, creation_date)
您可以在单个查询中收集所有数据。那是你在找什么?如果是这样,那么你需要像
这样的东西GROUP BY signature_id, some_function(creation_date)
some_function
背后的想法是花时间,除以time_step,并将其用于分组。如果它很简单,例如DAY
,则LEFT(creation_date, 10)
或DATE(creation_date)
很简单。否则,请详细说明您的用例。