Mysql

優化 GROUP BY 查詢

  • May 12, 2014

我正在執行以下查詢:

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 |                                                          
+----+-------------+--------+------+---------------+------+---------+------+---------+---------------------------------+

為什麼我的索引沒有被使用?我應該有不同的索引嗎?

您的索引不會被使用,因為它們不會縮小表掃描範圍。事實上,您需要timeeach的最大值type,因此即使首先使用類型索引,您仍然必須完全掃描該索引處的段以獲得給定類型的最大時間。結果,MySQL 將掃描整個表,作為類型索引段掃描的總和。

理論上,使用(type, time)索引可以直接訪問每種類型子樹的最後(最大)時間。但據我所知,一些較舊的 MySQL 版本在此類查詢的索引選擇方面存在問題。

引用自:https://dba.stackexchange.com/questions/64909