Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 我应该如何使用BETWEEN和groupby为查询编制索引?_Mysql_Sql_Query Optimization - Fatal编程技术网

Mysql 我应该如何使用BETWEEN和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

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

我已经删除了{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: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