作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个表来存储用户对网站的访问,并希望在继续使用该表之前正确索引该表。
我已经删除了 {HOUR | 的用法日 | 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、小时、日、月、年上有一个复合索引,但我觉得 start_time 应该包含在我的索引中。我的另一个担心是降低该表的插入性能,因为它会被频繁插入。
最佳答案
对于此查询:
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、小时、日、月、年)
。您可能应该在 SELECT
中包含日、月、年
。
这是查询的覆盖索引。这意味着查询中的所有列都在索引中,因此只需要扫描索引。
但是,只有前两列被真正使用。第一个是因为相等条件,第二个是因为BETWEEN
。索引不会用于聚合,因此需要额外的排序。
关于mysql - 我应该如何使用 BETWEEN 和 GROUP BY 为查询建立索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57263989/
我是一名优秀的程序员,十分优秀!