MySQL优化选择计数不同组

时间:2016-04-21 14:05:10

标签: mysql

我有这个问题:

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

需要花费大量时间来查询。如何加快查询速度。

  

select_type表类型possible_keys键key_len ref行   过滤的额外SIMPLE数据
  ref dc3_testIDPage,dc3_testIDvarIDPage,user_test_varID_url
  dc3_testIDvarIDPage 8 const 33106102 100.00使用where

这是create table的输出:

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

1 个答案:

答案 0 :(得分:1)

您可以采取的最简单的方法是确保您不进行全表扫描。 where子句中的所有列都应出现在索引中。所以在你的情况下testID和访问应该有索引,甚至更好,你可以创建一个同时具有testID和访问的索引。如果访问是一个真/假布尔,它不会帮助缩小索引搜索范围,但testID肯定会。

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

基于create table,你有id和testID在一个主键中。添加一个只有testID的新密钥或索引。这应该会有所帮助。因为看起来访问不是布尔值,所以使用visit和testID添加索引将为您提供最佳的性能提升。