昨天我写了有关MySQL的loose index scan的相关博文(http://www.cnblogs.com/wingsless/p/5037625.html),后来我发现上次提到的那个优化方法中主要的目的就是实现loose index scan,而在执行计划的层面上看,Extra信息中应该是“Using index for group-by”。这样看来,可能MySQL在处理distinct时和group by用了同样的优化手段,即走索引,进行loose index scan。那么今天我研究了一下官方文档,发现确实如此。

其实对于group by来讲,最一般的实现方法就是进行一次全表扫描,将所有的group by的行按照顺序存放在一个temporary table中,然后在进行分组识别或者进行聚合操作。这样问题就是太复杂,时间上要好久,空间上的消耗也不小。这时,MySQL可以利用索引来优化group by。

这里就可以讲讲什么叫做loose index scan了,根据官方的定义,这种方法只需要扫描索引中的少部分数据,而不是所有满足where条件的数据,所以这个方法叫做loose index scan。

下面是什么情况下可以使用loose index scan的情况:

1 单一表查询

2 Group by中只有最左前缀列,没有其他列

3 只支持max和min聚合,而且,要聚合的列必须是group by中列所在的索引。

4 未被group by引用的索引其他部分必须是常量(这句我不是很理解)

5 不支持前缀索引。

假设t1(c1, c2, c3, c4)表有一个索引包括c1, c2, c3列,以下这些查询都是可以进行loose index scan的:

SELECT c1, c2 FROM t1 GROUP BY c1, c2;
SELECT DISTINCT c1, c2 FROM t1;
SELECT c1, MIN(c2) FROM t1 GROUP BY c1;
SELECT c1, c2 FROM t1 WHERE c1 < const GROUP BY c1, c2;
SELECT MAX(c3), MIN(c3), c1, c2 FROM t1 WHERE c2 > const GROUP BY c1, c2;
SELECT c2 FROM t1 WHERE c1 < const GROUP BY c1, c2;
SELECT c1, c2 FROM t1 WHERE c3 = const GROUP BY c1, c2;

这些都是抄的官方文档,正确性未完全验证。

下面这些SQL都没有办法使用loose index scan:

-- 因为聚合函数不是max或者min
SELECT c1, SUM(c2) FROM t1 GROUP BY c1;-- 因为不符合最左前缀原则
SELECT c1, c2 FROM t1 GROUP BY c2, c3;-- 查询涉及到了索引的一部分,紧跟group by中的列,但是没有常量等值语句,加上 WHERE c3 = const就好了
SELECT c1, c3 FROM t1 GROUP BY c1, c2;

另外一些聚合函数也是可以用到loose index scan的,比如:AVG(DISTINCT), SUM(DISTINCT), 和COUNT(DISTINCT)

以下这些语句也可以:

SELECT COUNT(DISTINCT c1), SUM(DISTINCT c1) FROM t1;SELECT COUNT(DISTINCT c1, c2), COUNT(DISTINCT c2, c1) FROM t1;

很多语句都是从5.7的文档上摘抄下来的,正确性没有得到验证,虽说官方文档是权威,但是尽信书不如无书,以及纸上得来终觉浅,绝知此事须躬行,明天周末,我逐条测试,然后再更。

MySQL有关Group By的优化相关推荐

  1. Mysql优化_ORDER BY和GROUP BY 的优化讲解(单路排序和双路排序)

    ORDER BY 子句尽量使用Index方式排序,避免使用FileSort方式排序,尽可能在索引列上外城排序操作,遵照索引键的最佳左前缀.如果不在索引列上,FileSort有两种算法,Mysql就要启 ...

  2. mysql group by 性能_记一次Mysql group by的优化

    直接上干货: 数据量:50万 mysql版本:5.6.26 表结构: CREATE TABLE bet_order_product ( bet_order_product_id varchar(40) ...

  3. MySQL高级- group by ,order by 索引优化

    一:索引失效 1. 2.最佳左前缀法则 4. 8. 使用覆盖索引解决这个问题. 二.索引优化 1.ORDER BY 子句,尽量使用Index方式排序,避免使用FileSort方式排序 MySQL支持两 ...

  4. mysql慢SQL探测与优化

    探测手法: 慢查询一般是由于sql逻辑过于复杂或者索引失效导致的.查找慢SQL的策略就不外乎从这两个方向入手了. 更为详细的操作: (1)mysql慢查询日志: (2)mysql之SQL热分析: (3 ...

  5. oracle group by效率问题,性能优化-group by的优化

    4.group by的优化 最好使用同一表中的列, 需求:每个演员所参演影片的数量-(影片表和演员表) explain select actor.first_name,actor.last_name, ...

  6. 读薄《高性能MySql》(四)查询性能优化

    读薄<高性能MySql>(一)MySql基本知识 读薄<高性能MySql>(二)Scheme与数据优化 读薄<高性能MySql>(三)索引优化 读薄<高性能M ...

  7. mysql笔记03 查询性能优化

    查询性能优化 1. 为什么查询速度会慢? 1). 如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减 ...

  8. 超详细图解!【MySQL进阶篇】SQL优化-索引-存储引擎

    1. Mysql的体系结构概览 整个MySQL Server由以下组成 Connection Pool : 连接池组件 Management Services & Utilities : 管理 ...

  9. mysql sql能力_MySQL SQL优化

    优化目标 1.减少 IO 次数 IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先 ...

最新文章

  1. 专家谈计算机体系架构研究获“图灵奖”
  2. 通过Java执行python文件
  3. LINUX文件系统介绍
  4. Redis 它是什么?它用来做什么?它的优势与短板如何?
  5. 【bzoj3676】
  6. 数学建模——人口预测模型
  7. python正版软件多少钱_多款正版软件 + 付费教程迎来史低价,少数派「双十一」活动全面开始...
  8. stm32f107rc使用系统时钟延时不准
  9. 计算机新建里没有word,为什么电脑右键新建里头没有WORD文档,如何加上
  10. python opencv rgb值判断红色_Python-opencv实现红绿两色识别操作
  11. VM ware下载教程
  12. 大数据技术之Spark(一)Spark Core
  13. sqlite C接口增删改查,数据库优化
  14. 学业水平计算机考试考点宣传标语,中考考点宣传标语(学生方面)
  15. property属性的使用
  16. Ubuntu 20.04.2.0 LTS 更改默认关联视频播放器VLC的方法
  17. ElasticSearch[03]SpringData集成ElasticSearch
  18. 分布式数据库或成为新增量
  19. Redis Essentials 读书笔记 - 第一章: Getting Started (The Baby Steps)
  20. date比较大小 mybatis_mybatis 日期比较

热门文章

  1. Linux python impala/sasl/thrift-sasl command not found
  2. Oracle中sysdba身份和dba角色区别
  3. HIbernate——hibernate中的各种查询
  4. selenium元素的定位以及操作 第二章
  5. Linux C 程序的开发环境
  6. SSH框架的简单搭建步骤
  7. debian7更换gcc版本的二种方法分享
  8. android:windowSoftInputMode属性
  9. Silverlight+WCF 新手实例 象棋 该谁下棋-B下A停(三十)
  10. vue-typescript-toast (一款适用于pc平台的简单toast)