如何同时使用BETWEEN和GROUP BY为查询建立索引?

时间:2019-07-30 03:40:50

标签: mysql sql query-optimization

我正在创建一个表来存储用户对站点的访问,并希望在继续使用该表之前对其进行正确索引。

我已经删除了{HOUR | DAY | MONTH}(visit_time),其中包含生成的(存储的)列,因此我没有在GROUP BY子句中使用函数。

SELECT COUNT(id)
     , hour 
  FROM Visits
 WHERE site_id = 9 
   AND start_time BETWEEN '2019-07-23 21:29:49' AND '2019-07-29 21:03:33'
GROUP BY hour, day, month, year 
ORDER BY hour;

我在优化mysql查询方面没有太多经验,并且会在我的应用程序中经常使用此查询。到目前为止,我在site_id,hour,day,month,year上有一个综合索引,但是我觉得好像start_time应该包含在索引中。我的另一个担心是,由于该表将被频繁插入,因此会降低该表的插入性能。

1 个答案:

答案 0 :(得分:1)

对于此查询:

SELECT COUNT(*), hour 
FROM Visits
 WHERE site_id = 9 AND
       start_time BETWEEN '2019-07-23 21:29:49' AND '2019-07-29 21:03:33'
GROUP BY hour, day, month, year 
ORDER BY hour;

最佳索引可能位于(site_id, start_time, hour, day, month, year)上。您可能应该在day, month, year中加入SELECT

这是查询的覆盖索引。这意味着查询中的所有列都在索引中,因此只需要扫描索引。

但是,实际上只使用了前两列。第一个是因为相等条件,第二个是BETWEEN。索引将不会用于聚合,因此将需要其他排序。

相关问题