MySQL的临时表的原理以及优化手段。

文章目录

  • 1 临时表
  • 2 union临时表优化
  • 3 group by临时表优化

1 临时表

sort buffer、内存临时表和join buffer,这三个数据结构都是用来存放语句执行过程中的中间数据,以辅助SQL语句的执行的。其中,在排序的时候用到了sort buffer,在使用join语句的时候用到了join buffer。

而使用临时表的时候,ExplainExtra字段中具有Using temporary标记。union、group by、distinct等等查询都有可能使用到临时表。

2 union临时表优化

使用union的时候,就需要用到内存临时表来进行去重。

union语句的执行流程为:

  1. 创建一个内存临时表。
  2. 执行第一个子查询,得到值,并存入临时表中。
  3. 执行第二个子查询:依次拿每一行数据和临时表中的每一行数据比较,如果重复则不会插入,这样就实现了去重的功能
  4. 从临时表中按行取出数据,返回结果,并删除临时表。在最后这一步还可以对临时表进行其他操作,比如limit、ORDER BY。

如果使用union all,则不需要去重,也就不需要临时表了。在执行的时候,就依次执行子查询,得到的结果直接作为结果集的一部分,发给客户端。因此,除非确实需要服务器消除重复的行,否则就一定要使用UNION ALL,这一点很重要。如果没有ALL关键字,MySQL会给临时表加上DISTINCT选项,这会导致对整个临时我的数据做唯一性检查。这样做的代价非常高。如果不需要这些检查,那么甚至都不需要临时表。

另外,避免对于union之后的结果集进行操作,也能避免临时表的使用,通常需要手工地将MHERE、LIMIT、ORDER BY等子句“下推”到UNION的各个子查询中,以便优化器可以充分利用这些条件进行优化,使得union的结果就是最终的结果(例如,直接将这些子句冗余地写一份到各个子查询)。

3 group by临时表优化

另外一个使用临时表的例子是group by,group by还具有隐藏的排序的语句,即在对某些字段进行分组之后,将数据再根据这些字段进行排序,最后返回排序后的结果。

如下sql:

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

这个语句的执行流程是这样的:

  1. 创建内存临时表,表里有两个字段m和c,主键是m;
  2. 扫描表t1的索引a,依次取出叶子节点上的id值,计算id%10的结果,记为x;
    1. 如果临时表中没有主键为x的行,就插入一个记录(x,1);
    2. 如果表中有主键为x的行,就将x这一行的c值加1;
  3. 遍历完成后,再根据字段m做排序,得到结果集返回给客户端。

此时,Explain的Extra字段中具有Using temporary; Using filesort标记。

如果并不需要对结果进行排序,那可以在SQL语句末尾增加order by null,即:

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

这样就跳过了最后排序的阶段,直接从临时表中取数据返回。

内存临时表的大小是有限制的,参数tmp_table_size就是控制这个内存大小的,默认是16M。如果要处理的数据超过了最大大小,那么MySQL会把内存临时表转成磁盘临时表,而磁盘临时表默认使用的引擎是InnoDB,因此会按主键顺序存储数据,所以最终取出的结果还是默认有序的。

对于Group By的临时表的优化,同样是使用索引:因为如果进行Group By字段是有序的,那么在处理时(比如计算每组数量、个数等等),因为跟着的字段有索引,那么相同的值肯定是在一起的、连续的,所以直接顺序扫描输入的数据即可,不需要临时表,也不需要再额外排序。

总结:

  1. 如果语句执行过程可以一边读数据,一边直接得到结果,是不需要额外内存的,否则就需要额外的内存,来保存中间结果;
  2. join_buffer是无序数组,sort_buffer是有序数组,临时表是二维表结构;

如果执行逻辑需要用到二维表特性,就会优先考虑使用临时表。比如我们的例子中,union需要用到唯一索引约束, group by还需要用到另外一个字段来存累积计数。

另外,对于distinct查询来说,如果无法使用索引,则也会使用到临时表,也会进行分组,它和group by的区别是不需要排序。

参考资料:

  1. 《 MySQL 技术内幕: InnoDB 存储引擎》
  2. 《高性能 MySQL》
  3. 《MySQL实战45讲 | 极客时间 | 丁奇》

如有需要交流,或者文章有误,请直接留言。另外希望点赞、收藏、关注,我将不间断更新各种Java学习博客!

MySQL 临时表的原理以及优化手段相关推荐

  1. MySQL中order by语句的实现原理以及优化手段

    相信很多人在面试过程中,总被问到有没有 SQL 调优经验,对于工作经验年限较少的求职者,通常都是在面试之前从网上百度一些答案,提前背熟,然后面试的时候直接将提前背好的答案说出来.笔者作为一名菜鸟,在刚 ...

  2. 【重要】MySQL中order by语句的实现原理以及优化手段

    写在前面 filesort排序算法参考 :https://blog.csdn.net/lijingkuan/article/details/70341176 双路排序:是首先根据相应的条件取出相应的排 ...

  3. 40-400-040-运维-优化-MySQL File Sort 原理以及优化

    文章目录 1.概述 2.fileSort两种排序方式 5. 建议 1.概述 在MySQL中的ORDER BY有两种排序实现方式: 利用有序索引获取有序数据 文件排序 在explain中分析查询的时候, ...

  4. mysql order by 原理及优化详解

    前言 日常开发中,我们经常会使用到order by,亲爱的小伙伴,你是否知道order by 的工作原理呢?order by的优化思路是怎样的呢?使用order by有哪些注意的问题呢?本文将跟大家一 ...

  5. Word2vec原理+常见优化手段

    官网地址:https://code.google.com/archive/p/word2vec/ 我觉得原理讲的比较好的:https://www.cnblogs.com/pinard/p/716033 ...

  6. mysql占用cpu_Mysql占用过高CPU时的优化手段(必看)

    Mysql占用CPU过高的时候,该从哪些方面下手进行优化? 占用CPU过高,可以做如下考虑: 1)一般来讲,排除高并发的因素,还是要找到导致你CPU过高的哪几条在执行的SQL,show process ...

  7. mysql哪些优化手段_mysql explain 及常见优化手段

    在工作中如果遇到慢sql通常都可以用explain进行解析. 先列一下各个列名以及含义 列名 描述 id 在一个大的查询中每一个查询关键字都对应一个id select type select关键字对应 ...

  8. mysql 优化关键字_Mysql之Explain关键字及常见的优化手段

    Explain关键字字段描述: Explain关键字字段详情描述 id 我们写的查询语句一般都以SELECT关键字开头,比较简单的查询语句里只有一个SELECT关键字,但是下边两种情况下在一条查询语句 ...

  9. MySQL索引和锁实现原理及优化

    存储引擎 先来了解一下存储引擎,因为不同存储引擎索引和锁的实现是不同的. MySQL存储引擎其实就是对于数据库文件的一种存取机制,如何实现存储数据,如何为存储的数据建立索引以及如何更新,查询数据等技术 ...

  10. 深入理解MySQL索引和优化丨MySQL的核心原理

    索引介绍 文章相关视频讲解: C/C++ Linux服务器开发高级架构学习视频点击:C/C++Linux服务器开发/Linux后台架构师-学习视频 理解mysql-索引及其优化 MySQL的核心原理分 ...

最新文章

  1. 利用反射光电管 ITR9909 制作节能信标光电感应开关
  2. java中一些对象(po,vo,dao,pojo)等的解释
  3. 双中心单电子积分计算氢分子离子H2+的轨道能量
  4. 带你了解DDoS攻击的原理,让你轻松学会DDoS攻击原理及防护措施
  5. 低功耗STM32F411开发板(原理图+PCB源文件+官方例程+驱动等)
  6. 关于静态库与动态库【Linux 】【C】
  7. rac san+oracle_Oracle11g1+RAC+install+for+CentOS5(ASM+to+FC+SAN)_IT168文库
  8. Qt编程'hello world
  9. 【牛客 - 368C】流星雨(概率dp,乘法逆元)
  10. laravel increment出现了翻倍递增_股票连续多少个涨停板就可以市值翻倍?
  11. Nginx下root指令问题
  12. 对待谈判:对方耍赖咱也耍赖
  13. ajax submit 文件上传,ajaxSubmit() 上传文件和进度条显示
  14. 苹果鼠标驱动_一款鼠标让工作更高效——咪鼠S2智能语音鼠标测评
  15. python移动文件到指定文件夹
  16. 电脑没有声音(未安装任何音频输出设备)解决方案
  17. 大学数据结构课程设计题目
  18. python面试常问
  19. “有一只鸟来到这个世界,它该做什么?”你知道么?
  20. 太极拳经验谈 --- 董英杰

热门文章

  1. java免费单机游戏中心_虚拟网游(单机游戏)
  2. 数据结构_树状数组 详解
  3. 腾讯全套人力资源管理资料大全(职位能力模型图+人力资源管理+招聘体系+培训体系+薪酬绩效+员工职业发展,共174M)
  4. EasyTouch5学习笔记
  5. cad线加粗怎么设置_CAD图形中线条如何加粗?
  6. 解决Word2013光标乱跳的问题
  7. linux+gps测试流程图,卫星导航产品(GPS)测试方案详解
  8. 浅谈我是如何从简单的系统功能需求书写规范的需求分析说明书
  9. 2010.5.7 MFC中弹对话框以跟踪和程序运行中修改Static Text的Caption属性
  10. 构建KEGG pathway、Entrez ID、Ensemble ID的对应关系