当前位置:七道奇文章资讯数据防范MySQL防范
日期:2011-01-25 22:43:00  来源:本站整理

<b>MySQL Group By 实现原理解析</b>[MySQL防范]

赞助商链接



  本文“<b>MySQL Group By 实现原理解析</b>[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

   由于 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 字段的索引中:

   

 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   *************************** 1. row ***************************
12
13   id: 1
14
15   select_type: SIMPLE
16
17   table: group_message
18
19   type: range
20
21   possible_keys: idx_gid_uid_gc
22
23   key: idx_gid_uid_gc
24
25   key_len: 8
26
27   ref: NULL
28
29   rows: 4
30
31   Extra: Using where; Using index for group-by
32
33   1 row in set (0.00 sec)

    
    我们看到在履行筹划的 Extra 信息中有信息显示“Using index for group-by”,实际上这就是奉告我们,MySQL Query Optimizer 通过利用疏松索引扫描来实现了我们所需求的 GROUP BY 操作.

  下面这张图片描绘了扫描历程的大约实现:

   


    
    要操纵到疏松索引扫描实现 GROUP BY,需求至少满意以下几个条件:

  ◆GROUP BY 条件字段必须在同一个索引中最前面的持续位置;

  ◆在利用GROUP BY 的同时,只能利用 MAX 和 MIN 这两个聚合函数;

  ◆假如引用到了该索引中 GROUP BY 条件之外的字段条件的时刻,必须以常量情势存在;

  为什么疏松索引扫描的效率会很高?

  因为在没有WHERE子句,也就是必须经过全索引扫描的时刻, 疏松索引扫描需求读取的键值数目与分组的组数目一样多,也就是说比实际存在的键值数目要少量多.而在WHERE子句包含范围判断式大概等值表达式的时刻, 疏松索引扫描查找满意范围条件的每个组的第1个关键字,并且再次读取尽大概最少数目的关键字.


  以上是“<b>MySQL Group By 实现原理解析</b>[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .