DISTINCT实际上和GROUP BY操作非常相似,只不过是在GROUP BY之后的每组中只取出一条记录而已
所以,DISTINCT的实现方式和GROUP BY基本相同,同样可以通过索引扫描来实现,当然,在仅使用索引无法完成DISTINCT时,MySQL只能通过临时表来完成。但是,DISTINCT并不须要进行排序。也就是说,当只进行DISTINCT操作的Query仅利用索引无法完成操作时,MySQL会利用临时表来做一次数据的“缓存”,但不会对临时表中的数据进行filesort操作
示例
EXPLAIN SELECT DISTINCT group_id FROM group_message\G
****** 1. row ******
id: 1
SELECT_type: SIMPLE
table: group_message
type: range
possible_keys: NULL
key: idx_gid_uid_gc
key_len: 4
ref: NULL
rows: 10
Extra: Using index for group-by
这条查询完全使用索引实现,并且可以看到,他的实现使用了和group-by同样的方式
对于DISTINCT的优化,思路和GROUP BY基本上一致,关键在于利用好索引,当无法利用索引时,就要确保尽量不要在大结果集上面进行DISTINCT操作