我有这个问题:
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
答案 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添加索引将为您提供最佳的性能提升。