Home > Database > Mysql Tutorial > MySQL中GROUP BY的基本实现原理

MySQL中GROUP BY的基本实现原理

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Release: 2016-06-07 16:22:04
Original
1116 people have browsed it

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

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

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

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

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

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

  以下为引用的内容:

  sky@localhost : example 08:49:45> create index idx_gid_uid_gc

  -> on group_message(group_id,user_id,gmt_create);

  Query OK, rows affected (0.03 sec)

  Records: 96 Duplicates: 0 Warnings: 0

  sky@localhost : example 09:07:30> drop index idx_group_message_gid_uid

  -> on group_message;

  Query OK, 96 rows affected (0.02 sec)

  Records: 96 Duplicates: 0 Warnings: 0

  然后再看如下 Query 的执行计划:

  以下为引用的内容:

  sky@localhost : example 09:26:15> EXPLAIN

  -> SELECT user_id,max(gmt_create)

  -> FROM group_message

  -> WHERE group_id

  -> GROUP BY group_id,user_idG

  *************************** 1. row ***************************

  id: 1

  select_type: SIMPLE

  table: group_message

  type: range

  possible_keys: idx_gid_uid_gc

  key: idx_gid_uid_gc

  key_len: 8

  ref: NULL

  rows: 4

  Extra: Using where; Using index for group-by

  1 row in set (0.00 sec)

  我们看到在执行计划的 Extra 信息中有信息显示“Using index for group-by”,实际上这就是告诉我们,MySQL Query Optimizer 通过使用松散索引扫描来实现了我们所需要的 GROUP BY 操作。

Related labels:
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Issues
MySQL stops process
From 1970-01-01 08:00:00
0
0
0
Error when installing mysql on linux
From 1970-01-01 08:00:00
0
0
0
phpstudy cannot start mysql?
From 1970-01-01 08:00:00
0
0
0
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template