MySQL中distinct和group by性能比较

distinc的使用

用法

select distinct columns from table_name where where_conditions;

示例:

DISTINCT 用于返回唯一不同的值(即去重后的值) ,使用时需要放在查询语句中第一个查询字段前使用。如果列有NULL值,会将所有NULL视为相同的值,返回一个NULL

DISTINCT多列去重

distinct的多列去重,针对指定的去重列去重。也就是当所有指定列的信息都完全相同时,才能去重

group by的使用

用法

select columns from table_name where where_conditions group by columns

示例

 多列去重

select column1,column1,... from table_name where where_conditions group by columns

示例:

group by当查询列多个,去重条件单个的时候,会以group by后面的字段去重为准。其实就是group by的原理会先对结果进行分组排序,然后只返回每组中的第一条数据。

而distinct有多个字段时,只能当几个字段的值都相同,才能算是重复

结论:

- 在语义相同,有索引的情况下,

group by和distinct都能使用索引,效率相同。因为group by和distinct近乎等价,distinct可以被看做是特殊的group by。

- 在语义相同,无索引的情况下,

distinct效率高于group by。原因是distinct 和group by都会进行分组操作,但group by在Mysql8.0之前会进行隐式排序,导致触发filesort,sql执行效率低下。

一般推荐使用group by

原因:(1)语义更为清晰 (2)可以对数据进行更为复杂的一些处理

当然,也不是说不使用distinct,的提前判断数据的重复量:

在重复量比较高的表中,使用distinct可以有效提高查询效率;而在重复量比较低的表中,使用distinct会严重降低查询效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值