我试图运行我认为是一个相当大的数据集上的简单查询,它需要很长时间才能执行 - 它停止在“发送数据”状态3 -4小时以上。MySQL永远在“发送数据”。简单的查询,大量的数据
表看起来是这样的:
CREATE TABLE `transaction` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`uuid` varchar(36) NOT NULL,
`userId` varchar(64) NOT NULL,
`protocol` int(11) NOT NULL,
... A few other fields: ints and small varchars
`created` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `uuid` (`uuid`),
KEY `userId` (`userId`),
KEY `protocol` (`protocol`),
KEY `created` (`created`)
) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4 COMMENT='Transaction audit table'
和查询是在这里:
select protocol, count(distinct userId) as count from transaction
where created > '2012-01-15 23:59:59' and created <= '2012-02-14 23:59:59'
group by protocol;
表有大约2.22亿行,并在查询的WHERE子句过滤下降到约20百万行。不同的选项会将其降至大约700,000个不同的行,然后在分组后(以及查询最终完成时),实际返回4到5行。
我意识到这是很多的数据,但似乎4-5小时是这个查询非常长的时间。
谢谢。
编辑:作为参考,它在AWS上运行在db.m2.4xlarge RDS数据库实例上。
+1。添加另一个带有“created”列的索引会使OP索引在“created”列冗余;只有'created'列的索引可以被删除。有可能一个不同的覆盖索引,'协议'和'创建'列交换,也可能会提高性能。在这种情况下,只有'protocol'列的单独索引是多余的。 – spencer7593 2014-02-14 23:10:09