【问题标题】:MySQL optimize select count distinct group byMySQL 优化 select count distinct group by
【发布时间】:2016-08-14 19:14:17
【问题描述】:

我有这个问题:

SELECT `variationID`, count(DISTINCT(`userID`)) 
FROM data WHERE `testID` = XXXX AND `visit` = 1  GROUP BY `variationID`
;

查询需要很多时间。如何加快查询速度。

select_type 表类型 possible_keys key key_len ref rows 过滤的额外简单数据
ref dc3_testIDPage,dc3_testIDvarIDPage,user_test_varID_url
dc3_testIDvarIDPage 8 const 33106102 100.00 在哪里使用

这是创建表的输出:

CREATE TABLE `data` (
   `id` bigint(20) NOT NULL AUTO_INCREMENT,
   `userID` bigint(17) NOT NULL,
   `testID` bigint(20) NOT NULL,
   `variationID` bigint(20) NOT NULL,
   `url` bigint(20) NOT NULL,
   `time` bigint(20) NOT NULL,
   `visit` bigint(20) NOT NULL DEFAULT '1',
   `isTestPage` tinyint(1) NOT NULL,
   PRIMARY KEY (`id`,`testID`),
   KEY `url` (`url`),
   KEY `dc3_testIDPage` (`testID`,`url`),
   KEY `dc3_testIDvarIDPage` (`testID`,`variationID`,`url`),
   KEY `user_test_url` (`userID`,`testID`,`url`),
   KEY `user_test_varID_url` (`userID`,`testID`,`variationID`,`url`)
 ) ENGINE=InnoDB AUTO_INCREMENT=67153224 DEFAULT CHARSET=latin1

【问题讨论】:

  • 欢迎来到 Stack Overflow。感谢您发布 EXPLAIN 计划。您还可以编辑上面的帖子以添加来自SHOW CREATE TABLE data 的输出吗?要将其格式化为代码块,请突出显示它并使用ctl-k{} 编辑器工具栏按钮。

标签: mysql


【解决方案1】:

要加快查询速度,您可以做的最简单的事情是确保您没有进行全表扫描。 where 子句中的所有列都应该出现在索引中。因此,在您的情况下 testID 和 visit 应该有索引,甚至更好的是,您可以创建一个同时包含 testID 和 visit 的索引。如果访问是一个真/假布尔值,它不会帮助缩小索引搜索范围,但 testID 肯定会。

创建索引文档在这里:http://dev.mysql.com/doc/refman/5.7/en/create-index.html

根据创建表,您的 id 和 testID 在单个主键中。添加一个仅包含 testID 的新键或索引。这应该会有所帮助。因为看起来 visit 不是布尔值,所以添加一个带有 visit 和 testID 的索引会给你带来最好的性能提升。

【讨论】:

  • 感谢 MBA,但由于生产和空间的限制,我们无法在数据库中添加更多索引;还有其他选项可以重写查询以获得更高的性能吗?
  • @oasi711 只要进行全表扫描,无论您做什么,全表扫描都将主导性能。我看到你有五个二级索引。你都需要它们吗?如果空间也是一个主要考虑因素,那么我建议您分析哪些索引最重要并确定优先级。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多