distinct的作用
在mysql中,distinct关键字的主要作用就是对数据库表中一个或者多个字段重复的数据进行过滤,只返回其中的一条数据给用户,distinct只可以在select中使用
distinct的原理
distinct进行去重的主要原理是通过先对要进行去重的数据进行分组操作,然后从分组后的每组数据中去一条返回给客户端,在这个分组的过程可能会出现两种不同的情况:
distinct 依赖的字段全部包含索引:
该情况mysql直接通过操作索引对满足条件的数据进行分组,然后从分组后的每组数据中去一条数据。
distinct 依赖的字段未全部包含索引:
该情况由于索引不能满足整个去重分组的过程,所以需要用到临时表,mysql首先需要将满足条件的数据放到临时表中,然后在临时表中对该部分数据进行分组,然后从临时表中每个分组的数据中去一条数据,在临时表中进行分组的过程中不会对数据进行排序。
可用于先排序然后分组时分组返回的数据不是当前第一条的情况
例如:
这里我只想要id为1的数据(order by id asc 之后的),
本想着group by appid 之后 会得到的所有id为1 的数据,实际上:
SELECT * FROM
(SELECT * FROM work_department ORDER BY id ASC) as w
GROUP BY appid desc
sql运行之后
会发现并不是想要的,究其原因就是,sql在真正运行的时候,由于mysql 的优化导致我的order by 排序直接被优化了,加上distinct关键字之后
SELECT * FROM
(SELECT DISTINCT * FROM work_department ORDER BY id ASC) as w
GROUP BY appid desc
运行之后:
倒数第二条为id的最小值就是3而不是一,这样就得到正常结果