Mysql 我应该如何使用BETWEEN和groupby为查询编制索引?
我正在创建一个表来存储用户对站点的访问,并希望在继续使用该表之前对其进行适当的索引 我已经删除了{HOUR | DAY | MONTH}(visit | u time)的用法,以及生成(存储)列,这样我就不会在GROUPBY子句中使用函数Mysql 我应该如何使用BETWEEN和groupby为查询编制索引?,mysql,sql,query-optimization,Mysql,Sql,Query Optimization,我正在创建一个表来存储用户对站点的访问,并希望在继续使用该表之前对其进行适当的索引 我已经删除了{HOUR | DAY | MONTH}(visit | u time)的用法,以及生成(存储)列,这样我就不会在GROUPBY子句中使用函数 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
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查询的经验,在我的应用程序中将经常使用此查询。到目前为止,我在站点id、小时、天、月、年上有一个综合指数,但我觉得开始时间应该包括在我的指数中。我担心的另一个问题是此表的插入性能会降低,因为它会频繁插入到中。对于此查询:
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;
最佳索引可能位于(站点id、开始时间、小时、天、月、年)
。您可能应该在选择中包括日、月、年
这是查询的覆盖索引。这意味着查询中的所有列都在索引中,因此只需要扫描索引
但是,只有前两列被真正使用。第一个原因是相等条件,第二个原因是介于
之间的。索引不会用于聚合,因此需要进行额外排序。当前索引的执行计划是什么样子的?分组依据是相当不相关的-尽管我确实想知道您如何知道哪一天属于哪一个计数?!?无论如何,(站点id,开始时间)上的索引似乎是合理的。每当我使用该索引时,查询计划都会将该键显示为站点id上的外键,而不是复合键。@DrewCutchins-请提供SHOW CREATE TABLE
。