distinct与groupby的用法groupby_第1页
distinct与groupby的用法groupby_第2页
distinct与groupby的用法groupby_第3页
distinct与groupby的用法groupby_第4页
distinct与groupby的用法groupby_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、由於 GROUP BY上也同檬曾迤行排序操作,而且典 ORDER BY 相比,GROUP BY主要只是多了排序之彳爱的分操作。常然,如果在分的畴候逮使用了其他的一些聚合函数,那麽逮需要一些聚合函数的言十算。所以,在GROUP BY 的程中,典ORDER BY 一棣也可以利用到索引。在MySQL中,GROUP BY的同檬有多槿(三槿)方式,其中有丽重方式曾利用现 有的索引信息来完成 GROUP BY ,另外一槿篇完全瓢法使用索引的埸景下使用。下面我弓 分别金楼寸道三槿现方式做一彳固分析。1 .使用髭散(Loose)索引描描 GROUP BY何mt散索引描描簧琪GROUP BY呢? 除上就是富 M

2、ySQL完全利用索引描描来IT现GROUP BY 的畴候,It不需要捕描所有满足僚件的索引维即可完成操作得出结果。下面我凭通谩一彳固示例来描述髭散索引描描GROUP BY ,在示例之前我凭需要首先UI 整下 group_message 表的索弓I, > gmt_create 字段添力口至U group_id 和 user_id 字 段的索引中:skylocalhost : example08:49:45> createindexidx_gid_uid_gc- > ongroup_message(group_id,user_id,gmt_create);QueryOK, row

3、saffected(0.03sec)Records: 96 Duplicates: 0 Warnings: 0 skylocalhost : example09:07:30> dropindexidx_group_message_gid_uid- > ongroup_message;QueryOK, 96rowsaffected(0.02sec)Records: 96 Duplicates: 0 Warnings: 0然彳麦再看如下 Query的轨行言十副: skylocalhost : example09:26:15> EXPLAIN-> SELECTuser_id,

4、max(gmt_create)-> FROMgroup_message- > WHEREgroup_id < 10-> GROUPBYgroup_id,user_idG*1.row*id: 1select_type: SIMPLEtable: group_messagetype: rangepossible_keys: idx_gid_uid_gckey: idx_gid_uid_gckey_len: 8ref: NULLrows: 4Extra: Usingwhere; Usingindexforgroup-by1rowinset(0.00sec)我小号看到在轨行言十

5、副的Extra信息中有信息!示“Using index for group-by”,H除上造就是告我小力MySQL Query Optimizer通谩使用髭散索引描描来H现了我2号所需要的GROUP BY 操作。下面道张圈片描了描描谩程的大概iriL要利用到髭散索引描描group by ,需要至少满足以下黑彳固修件: GROUP BY修件字段必须在同一彳固索引中最前面的速位置; 在使用GROUP BY 的同畤,只能使用 MAX和MIN造丽彳固聚合函数; 如果引用到了索引中GROUP BY修件之外的字段修件的畴候,必须以常量形式存在;篇什麽髭散索引描描的效率曾很高?因篇在没有 WHERE子句,也

6、就是必谩全索引描描的畴候,髭散索引描描需要取的维值数量典分的数量一檬多,也就是比除存在的维值数目要少很多。而在WHERE子句包含靶凰判断式或者等值表逵式的畤候,髭散索引捕描查找满足靶凰修件的每彳固的第1彳固illl字,加且再次取儒可能最少数量的illl字。2.使用聚浅(Tight)索引描描 GROUP BY黯奏索引描描汽GROUP BY和髭散索引捕描的IM别主要在於他需要在捕描索引的畤 候,取所有满足僚件的索引维,然彳麦再根掳取悲的数掳t来完成GROUP BY操作得到相鹰结果。skylocalhost : example08:55:14> EXPLAIN-> SELECTmax(g

7、mt_create)- > FROMgroup_message- > WHEREgroup_id = 2- > GROUPBYuser_idG*1.row*id: 1select_type: SIMPLE table: group_message type: refpossible_keys: idx_group_message_gid_uid,idx_gid_uid_gc key: idx_gid_uid_gckey_len: 4 ref: const rows: 4 Extra: Usingwhere; Usingindex 1rowinset(0.01sec)道畴候的轨

8、彳TtHIU的Extra信息中已幺跖有"Using index for group-by”了,但It不是MySQL的GROUP BY操作她不是通谩索引完成的,只不谩是需要l&fWWHERE修件所限定的所有索引维信息之彳爱才能得出结果。道就是通谩聚浅索引捕描来GROUP BY 的轨行言十聋倬俞出信息。下面道弓H圃片展示了大概的整彳固轨行谩程:紧蒙索引扫描/ Tight Index ScanSELECT user_kiLma <(gmt_create)FHQM gnoup_messageWHERE grouped = 2GHOLi P BY ur_idA group id

9、- 2;B. group by userJd;C. max(gmt_createi;L all of group_id (=2);2. all of user_id.gmt_create that groGp_idi _ 2;3. return the last gmt create at every duplicate user id;group Jduseiid口deed ind吨旗gjgj在MySQL中,MySQL Query Optimizer首先11r逗择通谩髭散索引描描来fRU GROUP BY 操作,富彝现某些情况瓢法满足髭散索引描描GROUP BY 的要求之彳麦,通谩奏索引描描

10、来JT现。富 GROUP BY修件字段 她不速或者不是索引 前辍部分的畴候,MySQL Query Optimizer瓢法使用髭散索引描描,置瓢法直接通谩索引完成GROUP BY操作,因篇缺失的索引维信息瓢法得到。但是,如果 Query言吾句中存在一彳固常量值来引用缺失的索引 维,即可以使用聚浅索引描描完成GROUP BY 操作,因篇常量填充了搜索信昌维字中的差距”,可以形成完整的索引前道些索引前辍可以用於索引查找。而如果需要排序 GROUPBY结果,It且能别形成索引前辍的搜索信昌维字,MySQL逮可以避免I©外的排序操作,因焉使用有!序的索引的前迤行搜索已按!序检索到了所有ilt

11、t字。3.使用牖畴表 GROUP BYMySQL在迤行 GROUP BY 操作的畴候要想利用所有,必满足 GROUP BY 的字段必 须同畴存放於同一彳固索引中,且索引是一彳固有序索引(如 Hash索引就不能满足要求)。 而且,她不只是如此,是否能别利用索引来GROUP BY逮典使用的聚合函数也有 保。前面前重 GROUP BY的方式都是在有可以利用的索引的畴候使用的,富MySQLQuery Optimizer 瓢法找到合逾的索引可以利用的畴候,就不得不先it取需要的数掳I,然彳麦 通谩牖畴表来完成 GROUP BY 操作。skylocalhost : example09:02:40>

12、EXPLAIN-> SELECTmax(gmt_create)-> FROMgroup_message-> WHEREgroup_id > 1andgroup_id < 10-> GROUPBYuser_idG*1.row*id: 1select_type: SIMPLE table: group_message type: range |possible_keys: idx_group_message_gid_uid,idx_gid_uid_gc key: idx_gid_uid_gc key_len: 4 ref: NULL rows: 32Extra:

13、 Usingwhere; Usingindex; Usingtemporary; Usingfilesort道次的轨行言十副非常明!的告我凭MySQL通谩索引找到了我凭需要的数掳t,然彳初建了牖畴表,又迤行了排序操作,it得到我凭需要的 GROUP BY结果。整彳固轨行谩程大概 如下圈所展示:临时表排序分纽/ With Groups Tablewww.ji anz h aoy angxomTemp table.filesortgroupjd I userjd I gmt createn1 -grouped resu_ 一,9roL3W3Go富MySQL Query Optimizer 彝现便H堇通谩索引描描It不能直接得到 之彳

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论