1.union执行过程

首先我们创建一个表t1

create table t1(id int primary key, a int, b int, index(a));delimiter ;;create procedure idata()begin declare i int; set i=1; while(i<=1000)do insert into t1 values(i, i, i); set i=i+1; end while;end;;delimiter ;call idata();

然后我们执行一下这条语句

explain select 1000 as f union (select id from t1 order by id desc limit 2)

首先说下union的语义,union的语义是取两个结果的并集,重复的保留一行,然后我们来看下explain的结果,第二行的key=PRIMARY,说明用到了主键索引。

第三行的Extra的Using temporary说明用到了临时表

下面我们看下这条语句的执行流程:

1.创建一个临时表,只有f一个字段,且为主键

2.将1000这个数据插入临时表

3.子查询中步骤:

1.插入1000进入临时表,因为主键冲突,插入失败

2.插入第二行900,插入成功

4.将临时表数据作为结果返回,并删除临时表

这个过程的流程图如下:

如果我们把union改成union all,就不需要使用临时表了,因为union all是重复的也保留,

大家可以看到extra这一列已经没有了Using temporary

explain select 1000 as f union all (select id from t1 order by id desc limit 2)

2.group by执行过程

我们来看下面这条语句:

explain select id%10 as m, count(*) as c from t1 group by m;

可以看到explain结果

Using index(使用到了覆盖索引a,不需要回表); Using temporary(用到了临时表); Using filesort(对数据进行了排序)

这条语句的意思是将id%10进行分组统计,并按照m进行排序

执行流程如下:

1.创建临时表,增加m,c字段,m是主键

2.计算id%10的结果记为x

3.如果临时表里面没有主键为x的行,则插入(x,1),如果有的话,就将该行的c值加1

4.遍历完成后,按照m字段排序返回结果给客户端

流程图如下

接下来我们看下这条语句的执行结果

explain select id%10 as m, count(*) as c from t1 group by m

其实,如果我们不需要对查询结果进行排序,我们可以加一个order by null

我们执行一下这条语句

explain select id%10 as m, count(*) as c from t1 group by m order by null

可以看到这里没有进行排序,由于扫描是从表t的id是从1开始的,所以第一行是1

如果我们执行下列语句,会发生什么呢?

我们上面说的临时表,其实是内存临时表,如果我们把内存临时表的容量改的比我们要查询的数据的容量小,那么就会使用到磁盘临时表,磁盘临时表的默认引擎是innodb

set tmp_table_size=1024;select id%100 as m, count(*) as c from t1 group by m order by null limit 10

group by 优化方法--直接排序

其实在上面的关于从内存临时表转化成磁盘临时表是很浪费时间的,也就是说mysql,在执行过程中发现空间不够了,在转成磁盘临时表,但是如果我们直接告诉mysql,我要查询的数据很大,那么mysql优化器就会想到,既然你告诉我数据很大,那么我就直接用sort_buffer进行排序,如果sort_buffer内存不够大,会用到磁盘临时表辅助排序。

select SQL_BIG_RESULT id%100 as m, count(*) as c from t1 group by m;

小结一下:

1.如果我们不需要对统计结果进行排序,可以加上order by null省去排序流程。

2.尽量让排序过程用上内存临时表,可以通过适当调大tmp_table_size的值来避免用到磁盘临时表。

3.如果数据量实在太大,使用SQL_BIG_RESULT告诉优化器,直接使用排序算法。

mysql count 排序_MySQL什么时候会使用内部临时表?相关推荐

  1. mysql自动排序_MySQL中的排序

    文章正文: 在编写SQL 语句时常常会用到 order by 进行排序,那么排序过程是什么样的?为什么有些排序执行比较快,有些排序执行很慢?又该如何去优化? 索引排序 索引排序指的是在通过索引查询时就 ...

  2. mysql join 排序_MySQL查询优化:连接查询排序limit(join、order by、limit语句)

    本文链接:https://blog.csdn.net/xiao__gui/article/details/8616224 不知道有没有人碰到过这样恶心的问题:两张表连接查询并limit,SQL效率很高 ...

  3. mysql自动排序_mysql自动排序

    最近在写一个项目,在项目中有一个要求是按照指定的用户指定顺序,对数据进行排序!网上百度了一下,感觉还是挺有用的,但是不是很清楚工作原理! mysql的field()函数 filed(s,s1,s2.. ...

  4. mysql 拼音排序_MySQL按常规排序、自定义排序和按中文拼音字母排序的方法

    MySQL常规排序.自定义排序和按中文拼音字母排序,在实际的SQL编写时,我们有时候需要对条件集合进行排序. 下面给出3种比较常用的排序方式,mark一下 1.常规排序ASC DESC ASC 正序 ...

  5. mysql 临时表_第05问:MySQL 在处理临时结果集时,内部临时表会使用多少内存?...

    问题: MySQL 在处理临时结果集(UNION 运算 / 聚合运算等)时,会用到内部临时表(internal temporary table). 那么内部临时表会使用多少内存呢? 实验: 我们先创建 ...

  6. mysql++月份排序_Mysql 按月份为组进行统计排序_MySQL

    SELECT YEAR(established_time) AS 'year' , MONTH(established_time) AS 'month' , COUNT(*) AS 'count' F ...

  7. mysql count 排序_SQL进阶排序和窗口函数

    在使用数据库制作各种统计数据的时候,需要对数据进行排序,比如按照「分数.销量.人数」等数值进行排序,通常排序的方法有两种: 跳过之后的位次排序 不跳过之后的位次排序 窗口函数 窗口函数只在最新的MyS ...

  8. mysql a-z排序_mysql实现首字母从A-Z排序

    1.常规排序ASC DESC ASC 正序 DESC倒叙 - 此处不用多讲 2.自定义排序 自定义排序是根据自己想要的特定字符串(数字)顺序进行排序.主要是使用函数 FIELD(str,str1,st ...

  9. mysql 分组排序_MySQL如何实现Excel分组排序功能?

    Excel中分组排序只需要对数据进行升序降序,再利用if函数添加排序序号,即可筛选出分组top数据. Oracle也有row_number()函数对数据进行分组排序,而MySQL并没有此类函数,那么如 ...

最新文章

  1. Leetcode: Reverse Linked List II
  2. 读《大道至简-- 第二章 是懒人造就了方法》 有感
  3. linux_NandFlash_driver_超详细分析 .
  4. IOS之学习笔记六(可变形参)
  5. Java开发环境搭建详解
  6. zval php,PHP内核之zval
  7. 历时半载,我的新课上线了
  8. win10扬声器红叉_Win10系统的音量图标有一个红叉怎么办?
  9. MATLAB绘图——加强篇
  10. 网页设计配色应用实例剖析——蓝色系
  11. R语言七天入门教程七:项目实战
  12. 听说支付宝有一个“疯起来连自己都打”的项目
  13. ARM+DSP双核处理器应用程序攻略
  14. 解决win10笔记本睡眠后无法唤醒甚至自动关机的问题
  15. text to image(一):《GENERATING IMAGES FROM CAPTIONS WITH ATTENTION》
  16. ffmpeg合并(复用)音频和视频文件,组成mp4
  17. Serialize的使用
  18. autoware 1.14 lgvsl simulator仿真
  19. 将Excel中的文本转换为数字
  20. 用贝叶斯公式解决开奖问题

热门文章

  1. 《2019年数据及存储发展研究报告》十大洞察
  2. 10 月全国程序员工资统计,一半以上的职位 5 个月没招到人!
  3. 什么程度才算精通 Linux?
  4. 谁说 C++ 的强制类型转换很难懂?
  5. Linux 4.20 发布!35 万行代码都更新了啥?
  6. 华为郑叶来:致敬开发者,共创“ AI ”的世界
  7. 为什么鲍尔默时代的微软会一败再败?
  8. 硅谷程序员跳槽排行榜:最爱竟不是 Google 苹果 Facebook!
  9. 阿尔法狗 3 天走完人类千年棋史,被反超的我们该如何绝地求生?34 个开源项目告诉你!
  10. 为什么有人说Java开发不再吃香