Mysql
優化 GROUP BY 查詢
我正在執行以下查詢:
SELECT `type`, MAX(`time`) AS `last_updated` FROM `stocks` GROUP BY `type`
在下表中:
CREATE TABLE `stocks` ( `id` int(11) NOT NULL AUTO_INCREMENT, `time` int(11) NOT NULL, `type` varchar(6) NOT NULL, );
我有以下索引:
PRIMARY KEY (`id`), KEY `type` (`type`), KEY `time` (`time`)
然而,查詢執行大約需要 4 分鐘,並且只有大約 360 萬行。
這是我的解釋:
+----+-------------+--------+------+---------------+------+---------+------+---------+---------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+--------+------+---------------+------+---------+------+---------+---------------------------------+ | 1 | SIMPLE | stocks | ALL | NULL | NULL | NULL | NULL | 3684211 | Using temporary; Using filesort | +----+-------------+--------+------+---------------+------+---------+------+---------+---------------------------------+
為什麼我的索引沒有被使用?我應該有不同的索引嗎?
您的索引不會被使用,因為它們不會縮小表掃描範圍。事實上,您需要
time
each的最大值type
,因此即使首先使用類型索引,您仍然必須完全掃描該索引處的段以獲得給定類型的最大時間。結果,MySQL 將掃描整個表,作為類型索引段掃描的總和。理論上,使用
(type, time)
索引可以直接訪問每種類型子樹的最後(最大)時間。但據我所知,一些較舊的 MySQL 版本在此類查詢的索引選擇方面存在問題。