2019独角兽企业重金招聘Python工程师标准>>>

在web应用中,提倡sql简单,避免复杂度。所以在我们公司的应用中看不到jon,子查询等语句的存在,所以间接GROUP BY 与 索引的使用占据大多数,其实很多技巧,别人都是总结过的,仔细分析,仔细学习别人的经验才是正道.而不可浮躁,凭经验主义.

满足GROUP BY子句的最一般的方法是扫描整个表并创建一个新的临时表,表中每个组的所有行应为连续的,然后使用该临时表来找到组并应用累积函数(如 果有)。(用通俗的语言就是,建立一个临时表。然后利用mysql内部算法。算出来结果)

在某些情况中,MySQL能够做得更好,通过索引访问而不用创建临时表。 (其实就是因为临时表的东西,我们才应该优化。)

一般GROUP BY 优化分为2种优化方式:

1。松散索引扫描

2,。紧凑索引扫描

何为松散索引扫描:

其实就是:

通过该访问方法,MySQL使用某些关键字排序的索引类型的 属性。该属性允许使用 索引中的查找组而不需要考虑满足所有WHERE条件的索引中的所有关键字。既然该访问方法只考虑索引中的关键字的一小 部分,它被称为松散索引列表。(官方语言就是精辟)

例如:

explain select TeamID from competeinfo where TeamID >10 group by TeamID

id

select_type

table

type

possible_keys

key

key_len

ref

rows

Extra

1

SIMPLE

competeinfo

range

TeamID

TeamID

4

NULL

26

Using where; Using index for group-by

这里的explain 代表查看索引应用情况。我简单介绍一下.

id->SELECT识别符。这是SELECT的查询序列号。

select_type -> SELECT类型, SIMPLE代表比较简单的查询。(还包括union,primary等,具体去查下手册)

table 代表所引用的表。

type->联接类型 。可以说索引应用状况。这里range只检索给定范围的行,使用一个索引来选择行 。大多数我们将对索引用到 > < 等之类的符号。(还包括其他的联接类型,all代表扫描整个表。至于其他关键字。还查手册吧)

possible_keys->MySQL能使用哪个索引在该表中找到行(这里不是真正应用到)

key ->MYSQL实际应用到的索引。

key_len->索引长度

ref使用哪个列或常数与key一起从表中选择行。

rows-》影响多少行

Extra-》一些索引应用状况信息。这里的Using index for group-by 表示松散索引。

如果这里出现useing tempoary useingfilesort这个是比较严重的。这证明你的索引,没有用用到。解决方式:改索引吧。

言归正传。这里select TeamID from competeinfo where TeamID >10 group by TeamID。就是通过TeamID 来查找组。完成group by .这个也是一种方式。

但是大家注意。查询字段必须和后面GROUP BY 一致.

第二种优化方式,也是最常用的。紧凑索引扫描。

何为紧凑索引扫描:索引扫描或一个范围索引扫描,取决于查询条件。

其实啊就是联合索引的应用。

explain select TeamID from competeinfo where TeamID >10 and CompeteID > 100020 group by CompeteID

这个表建立了。 CompeteID, TeamID的联合索引。

id

select_type

table

type

possible_keys

key

key_len

ref

rows

Extra

1

SIMPLE

competeinfo

range

CompeteID,TeamID

CompeteID

4

NULL

22

Using where; Using index

大家已经看到了。这里我们会发现。可能应用索引有2个。实际应用到索引名为CompeteID.返回应用信息也是Using where; Using index。应用到索引。

下面我说下:哪些情况应用不到。

1. 对不同的索引键做 GROUP BY

SELECT * FROM a1 group by key1, key2;

2. 在非连续的索引键部分上做 group by

SELECT * FROM t1 WHERE key2=constant group by key_part2;

非连续索引:上面的索引CompeteID。他是由CompeteID, TeamID建立联合索引。

explain select TeamID from competeinfo where TeamID >10 and CompeteID > 100020 group by TeamID

这样的话。

id

select_type

table

type

possible_keys

key

key_len

ref

rows

Extra

1

SIMPLE

competeinfo

range

CompeteID,TeamID

CompeteID

4

NULL

22

Using where; Using index; Using temporary; Using filesort

大家看见了。EXTRA的信息。这样的话group by 没用应用索引。影响效率。

所以一定注意到。GROUP BY 顺序.问题.

  1. 用于搜索记录的索引键和做 GROUP BY 的不是同一个:

其实意思是。Where 条件和GROUP BY 字段得是一个索引里面的。

这个就不举例了。

我相信通过这篇文章大家也了解了GROUP BY 的索引应用了吧!

其实我们多尝试,多分析下就可以了。

如有有疑问,请大家多多指出,我将会修正。

转载于:https://my.oschina.net/weiweiblog/blog/1558945

MYSQL优化-之GROUP BY相关推荐

  1. Mysql优化之GROUP BY语句优化

    一.首先看Group By创建临时表的情况,因为有临时表的存在所以索引失效. 如果GROUP BY 的列没有索引,产生临时表 如果GROUP BY时,SELECT的列不止GROUP BY列一个,并且G ...

  2. 盘点开发中那些常用的MySQL优化

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:jian www.cnblogs.com/jian0110/ ...

  3. mysql优化 博客园_MySQL优化

    MySQL优化步骤 首先学会如何定位到SQL语句 1.1查看SQL语句的执行次数 在MySQL中可以通过命令查看服务器该表状态信息 show status like 'Com_______'; 如果想 ...

  4. mysql 优化_常用MySQL优化

    1.大批量插入数据优化 (1)对于MyISAM存储引擎的表,可以使用:DISABLE KEYS 和 ENABLE KEYS 用来打开或者关闭 MyISAM 表非唯一索引的更新. ALTER TABLE ...

  5. 项目中常用的19条MySQL优化

    声明一下:下面的优化方案都是基于 " Mysql-索引-BTree类型 " 的 一.EXPLAIN 做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划. 下面来个简单 ...

  6. MySQL优化系列(二)--查找优化(1)(非索引设计)

    MySQL优化系列(二)--查找优化(1)(非索引设计) 接下来这篇是查询优化,用户80%的操作基本都在查询,我们有什么理由不去优化他呢??所以这篇博客将会讲解大量的查询优化(索引以及库表结构优化等高 ...

  7. 项目中常用的 19 条 MySQL 优化总结

    作者:zhangqh 地址:segmentfault.com/a/1190000012155267 本文总结了19条关于Mysql的优化方案,本文的优化方案都是基于 " Mysql-索引-B ...

  8. 8.2.1.2 How MySQL Optimizes WHERE Clauses MySQL 优化WHERE 子句

    8.2.1.2 How MySQL Optimizes WHERE Clauses MySQL 优化WHERE 子句本节讨论优化用于处理WHERE子句, 例子是使用SELECT 语句,但是相同的优化应 ...

  9. MySQL优化学习总结

    MySQL 性能优化的最佳20多条经验分享 http://www.jb51.net/article/24392.htm 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关 ...

最新文章

  1. 美国诚实签经验——着装,戒指,手表装土豪,医生预约单,流水、房产和工作证明...
  2. 过滤器、拦截器、监听器的区别与使用
  3. Qt 如何发送和接收UDP数据报
  4. eclipse注释日期格式修改
  5. Java 阶段面试 知识点合集 - 我们到底能走多远系列(15)
  6. PHP 安全:如何防范用户上传 PHP 可执行文件
  7. 如何完整卸载wxpython_TextCtrl的WXPython C++部分被删除
  8. Building a Console Application on Windows Mobile
  9. 分布式大数据引擎Presto和Apache Spark
  10. win7 下 qwt安装教程
  11. markDown 下载安装教程
  12. 沙普利算法java实现_Java实现婚姻稳定匹配Gale- Shapley算法
  13. 阿里云ECS迁移至腾讯云
  14. 每一篇博文都是与自己的一次对话
  15. 手披云雾开鸿蒙,赞美泰山的诗句
  16. 基于SSM框架的狼途汽车门店管理系统的设计与实现
  17. 在微型计算机系统中 视频适配器为,一级计算机基础知识整理解说.xls
  18. codesensor:将代码转化为ast后再转化为文本向量
  19. java开发社交网站_仿知乎问答社交平台网站
  20. 组合计数——车的放置(逆元)+数三角形+序列统计(lucas定理)

热门文章

  1. gamma校正 matlab,Gamma校正 ——图像灰度变化 OpenCV (十)
  2. 七年级 初步使用计算机教案,七年级计算机教案
  3. wordpress社交主题_9个WordPress插件可帮助获取更多社交分享
  4. linux ipv6动态解析,家庭宽带ipv6搭建外网访问方案,ddns动态解析ipv6,ipv6建站等
  5. 分布式锁之Zookeeper实现
  6. 数字生活网络联盟(DLNA)
  7. JAVA堆排序有监视哨吗_数据结构-各类排序算法总结
  8. java如何实现课表添加功能_[求助]如何编写课程表问题
  9. 淘客项目coupons在 Linux 环境部署指南
  10. sklearn.neighbors.KNeighborsClassifier