我試圖運行我認爲是一個相當大的數據集上的簡單查詢,它需要很長時間才能執行 - 它停止在「發送數據」狀態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