かなり大きなデータセットに対して単純なクエリと思われるものを実行しようとしていますが、実行に非常に時間がかかります。「データを送信中」状態で 3 ~ 4 時間以上停止します。
テーブルは次のようになります。
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 億 2,200 万行あり、クエリの where 句は約 2,000 万行に絞り込みます。個別のオプションを使用すると、約 700,000 の個別の行に削減され、グループ化後 (およびクエリが最終的に終了したとき)、実際には 4 ~ 5 行が返されます。
大量のデータであることは認識していますが、このクエリの場合、4 ~ 5 時間は非常に長いようです。
ありがとう。
編集: 参考までに、これは db.m2.4xlarge RDS データベース インスタンスの AWS で実行されています。