かなり大きなデータセットの単純なクエリであると思うものを実行しようとしていますが、実行に非常に時間がかかります。 -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にまでフィルタ百万行distinctオプションはそれを約700,000の別個の行にし、グループ化した後(そして最後にクエリが終了すると)、実際には4〜5行が返されます。
私はそれが大量のデータであることを認識していますが、このクエリでは4時間から5時間が非常に長いようです。
ありがとうございました。
編集:参考のために、これはAWSのdb.m2.4xlarge RDSデータベースインスタンスで実行されています。
+1。先行列 'created'を持つ別の索引を追加すると、' created'列のOP索引が冗長になります。 'created'カラムのインデックスを削除することができます。 'protocols'列と' created'列を入れ替えて別のカバー索引を作成すると、パフォーマンスが向上する可能性があります。その場合、 'protocol'列の別のインデックスは冗長になります。 – spencer7593