我正在创建一个表来存储用户对站点的访问,并希望在继续使用该表之前对其进行正确索引。
我已经删除了{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应该包含在索引中。我的另一个担心是,由于该表将被频繁插入,因此会降低该表的插入性能。
答案 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
。索引将不会用于聚合,因此将需要其他排序。