具有日期范围和时间步长的MySQL查询性能

时间:2016-12-22 22:16:58

标签: mysql sql performance

我有一个包含以下列的表:incident_idcreation_dateevent_idsignature_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),我不知道如何计算每个时间范围。

1 个答案:

答案 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)很简单。否则,请详细说明您的用例。