distinct和group by的功能、使用和底层原理

distinct和group by的功能、使用和底层原理
最新回答
无心

2026-10-21 15:44:05

distinct和group by的功能、使用和底层原理distinct的功能和使用

功能:DISTINCT 是一种用于去除 SELECT 语句返回结果中重复行的关键字。在使用 SELECT 语句查询数据时,如果结果集中包含重复的行,可以使用 SELECT DISTINCT 语句来去除这些重复的行。

使用:

  • 基本用法:SELECT DISTINCT columns FROM table_name WHERE where_conditions;

    DISTINCT 关键词用于返回唯一不同的值,放在查询语句中的第一个字段前使用,且作用于主句所有列。

    示例:SELECT DISTINCT column1 FROM table_name;

  • 处理NULL值:DISTINCT 子句将所有 NULL 值视为相同的值。如果列具有 NULL 值,并且对该列使用 DISTINCT 子句,MySQL 将保留一个 NULL 值,并删除其他的 NULL 值。
  • 多列去重:根据指定的去重列信息来进行,即只有所有指定的列信息都相同,才会被认为是重复的信息。

    示例:SELECT DISTINCT column1, column2 FROM table_name WHERE where_conditions;

group by的功能和使用

功能:GROUP BY 主要的使用场景是在分组聚合。具体来说,GROUP BY 子句通常用于将查询结果按照一个或多个列进行分组,然后对每个组进行聚合计算。

使用:

  • 基本用法:SELECT column1, COUNT(*) as num FROM table_name GROUP BY column1;

    通常与聚合函数(例如 COUNT、SUM、AVG、MAX 和 MIN)一起使用,以计算每个组的聚合值。

  • 数据去重:除了分组聚合,GROUP BY 还可以用来进行数据去重,并且在某些特定场景下,性能超过 DISTINCT。
  • 单列和多列去重:

    单列去重:SELECT column1, COUNT(*) as num FROM table_name GROUP BY column1;

    多列去重:SELECT column1, column2, COUNT(*) as num FROM table_name GROUP BY column1, column2;

distinct和group by的底层原理

distinct的底层原理:

  • DISTINCT 的实现基于分组操作,可以通过松散索引扫描、紧凑索引扫描来实现。
  • 在执行过程中,DISTINCT 会对结果集进行排序和去重的操作,这会对查询性能产生一定的影响。
  • 在 MySQL 中,DISTINCT 可以被看作是特殊的 GROUP BY。

group by的底层原理:

  • GROUP BY 语句根据一个或多个列对结果集进行分组。
  • 在分组的列上通常配合 COUNT, SUM, AVG 等函数一起使用。
  • 执行流程:

    创建内存临时表,表里有分组字段和聚合字段。

    扫描原表,依次取出一行数据,根据分组字段的值判断临时表中是否存在该分组。

    如果不存在,则插入一条新记录;如果存在,则更新该记录的聚合值。

    遍历完后,再根据分组字段进行排序(在 MySQL 8.0 之前默认会排序,但 8.0 之后已弃用此隐式排序行为)。

    最后将结果集返回给客户端。

  • 需要注意的是,GROUP BY 子句会对结果集进行排序(在 MySQL 8.0 之前),因此可能会导致使用临时文件排序。如果查询中包含 ORDER BY 子句,使用不当会产生临时文件排序,容易产生慢 SQL 问题。

distinct和group by去重原理分析:

  • 在大多数例子中,DISTINCT 可以被看作是特殊的 GROUP BY。
  • 在语义相同、有索引的情况下:

    GROUP BY 和 DISTINCT 都能使用索引,效率相同。

  • 在语义相同、无索引的情况下:

    在 MySQL 8.0 之前,由于 GROUP BY 会进行隐式排序,导致触发 filesort,SQL 执行效率低下。而 DISTINCT 不会进行排序操作,因此效率高于 GROUP BY。

    从 MySQL 8.0 开始,MySQL 删除了 GROUP BY 的隐式排序行为,所以此时在语义相同、无索引的情况下,GROUP BY 和 DISTINCT 的执行效率也是近乎等价的。

  • 在大数据量去重场景下,优先推荐使用 GROUP BY,因为 GROUP BY 的语义更为明确,且能对数据进行更为复杂的处理。

综上所述,DISTINCT 和 GROUP BY 在功能和使用上有所区别,但在底层原理上存在一定的联系。在实际应用中,应根据具体场景和需求选择合适的关键字来优化查询性能。