当前位置:首页 >百科 >详解MySQL分组查询Group By实现原理 详解询并与ORDER BY进行比较

详解MySQL分组查询Group By实现原理 详解询并与ORDER BY进行比较

2024-06-30 20:45:23 [百科] 来源:避面尹邢网

详解MySQL分组查询Group By实现原理

作者:简朝阳 数据库 Oracle 本文将为大家讲述怎么用GROUP BY实现排序操作,详解询并与ORDER BY进行比较。组查GROUP BY有三种实现方式,实现我们也将为大家一一做分析。原理

由于GROUP BY 实际上也同样会进行排序操作,详解询而且与ORDER BY 相比,组查GROUP BY 主要只是实现多了排序之后的分组操作。当然,原理如果在分组的详解询时候还使用了其他的一些聚合函数,那么还需要一些聚合函数的组查计算。所以,实现在GROUP BY 的原理实现过程中,与 ORDER BY 一样也可以利用到索引。详解询

在MySQL 中,组查GROUP BY 的实现实现同样有多种(三种)方式,其中有两种方式会利用现有的索引信息来完成 GROUP BY,另外一种为完全无法使用索引的场景下使用。下面我们分别针对这三种实现方式做一个分析。

详解MySQL分组查询Group By实现原理 详解询并与ORDER BY进行比较

1.使用松散(Loose)索引扫描实现 GROUP BY

详解MySQL分组查询Group By实现原理 详解询并与ORDER BY进行比较

何谓松散索引扫描实现 GROUP BY 呢?实际上就是当 MySQL 完全利用索引扫描来实现 GROUP BY 的时候,并不需要扫描所有满足条件的索引键即可完成操作得出结果。

详解MySQL分组查询Group By实现原理 详解询并与ORDER BY进行比较

下面我们通过一个示例来描述松散索引扫描实现 GROUP BY,在示例之前我们需要首先调整一下 group_message 表的索引,将 gmt_create 字段添加到 group_id 和 user_id 字段的索引中:

1 sky@localhost : example 08:49:45> create index idx_gid_uid_gc
2
3 -> on group_message(group_id,user_id,gmt_create);
4
5 Query OK, rows affected (0.03 sec)
6
7 Records: 96 Duplicates: 0 Warnings: 0
8
9 sky@localhost : example 09:07:30> drop index idx_group_message_gid_uid
10
11 -> on group_message;
12
13 Query OK, 96 rows affected (0.02 sec)
14
15 Records: 96 Duplicates: 0 Warnings: 0
然后再看如下 Query 的执行计划:

1 sky@localhost : example 09:26:15> EXPLAIN
2
3 -> SELECT user_id,max(gmt_create)
4
5 -> FROM group_message
6
7 -> WHERE group_id < 10
8
9 -> GROUP BY group_id,user_id\G
10
11

(责任编辑:焦点)

    推荐文章
    热点阅读