介绍临时表之前,我们首先来看这么一句语句:

CREATE TABLE`words` (

`id`int(11) NOT NULLAUTO_INCREMENT,

`word`varchar(64) DEFAULT NULL,PRIMARY KEY(`id`)

) ENGINE=InnoDB;

这是一个单词表,除了一个主键id之外,只有一个word字段,再来看下面这段sql:

select word from words order by rand() limit 3;

这段sql的语义其实就是按照随意的规则进行排序,然后取出前三个单词并返回,这段sql看起来很简单,但实际上要做的事还是比较繁琐的:

(1)创建一个临时表。这个临时表使用的是 memory 引擎,表里有两个字段,第一个字段是 double 类型,为了后面描述方便,记为字段 R,第二个字段是 varchar(64) 类型,记为字段 W。并且,这个表没有建索引。从 words 表中,按主键顺序取出所有的 word 值。

(2)对于每一个 word 值,调用 rand() 函数生成一个大于 0 小于 1 的随机小数,并把这个随机小数和 word 分别存入临时表的 R 和 W 字段中,到此,扫描行数是 10000。

(3)现在临时表有 10000 行数据了,接下来你要在这个没有索引的内存临时表(memory引擎的特性之后再说)上,按照字段 R 排序。

(4)初始化 sort_buffer。sort_buffer 中有两个字段,一个是 double 类型,另一个是整型。从内存临时表中一行一行地取出 R 值和位置信息(我后面会和你解释这里为什么是“位置信息”),分别存入 sort_buffer 中的两个字段里。这个过程要对内存临时表做全表扫描,此时扫描行数增加 10000,变成了 20000。

(5)在 sort_buffer 中根据 R 的值进行排序。注意,这个过程没有涉及到表操作,所以不会增加扫描行数。排序完成后,取出前三个结果的位置信息,依次到内存临时表中取出 word 值(这里还是有涉及到回表的操作,但是是回的内存表,所以没有磁盘io的消耗),返回给客户端。这个过程中,访问了表的三行数据,总扫描行数变成了 20003。

当然除了内存临时表之外还有磁盘临时表,磁盘临时表是在内存不足时才会产生,所以尽可能的保证内存临时表的空间要足够大,否则磁盘的操作要比内存的操作要耗时的多!!

OK,我们再来看一个例子,首先定义一下表结构:

create table t1(id int primary key, a int, b int, index(a));

现在我们有这么一个sql:

explain select b,count(*) as c from t1 group by b

sql的语义很简单,对b字段进行分组,并且通过聚合函数统计每个组的个数并返回,但是需要注意的是b字段没有建立索引,于是返回的结果里:

可以看到有使用到临时表,但是后面居然还跟了个using filesort,这是为啥??我们可以先来看一下这句sql的执行流程:

(1)创建内存临时表,表里有两个字段 b 和 c,主键是 m;扫描表 t1,依次取出b的值;

(2)如果临时表中没有对应的b的值的行,就插入一个记录 (x,1);如果表中有对应的b的值的行,就将这一行的 c 值加 1;遍历完成后,再根据字段 b 做排序,得到结果集返回给客户端;

注意到了没,最后有一步是对b做排序,这一步是在内存中的sort_buffer区域完成的,这一步的诞生导致了using filesort,但是我们的sql寓意里并不需要排序啊,那么可以使用order by null使得group by 之后不需要做任何排序,执行完成后你会发现using filesort消失了。。。但是using temporary还是在的,那么我们可以尝试在b字段加索引,继续执行上面的sql,如果b有索引的话,那么b索引树的肯定是这样子的:

1-2-2-2-5-5-5-5

是一个有序的链表,mysql在扫描这个索引时,直接轧过去,到2的时候自然知道1的个数只有一个,到5的时候自然知道2的个数只有3个,统计的复杂度就是n,但是如果m没有索引,那么就是无序的,在统计时,扫到2的时候,得去一个中间表看是否存在,存在+1,不存在添加。。。到这里也就清晰了,因为b有了索引,所以这个统计操作,只需要遍历一遍索引即可:

可以看到临时表没有再使用了,因为有了索引后,b字段不再需要临时表进行辅助统计,结果perfect!

最后再提一提关于distinct和group by

mysql临时表是什么意思_来谈谈MySQL的临时表,到底是个什么东西,以及怎么样产生的...相关推荐

  1. mysql慢查询检查流程_简单谈谈MySQL优化利器-慢查询

    慢查询 首先,无论进行何种优化,开启慢查询都算是前置条件.慢查询机制,将记录过慢的查询语句(事件),从而为DB维护人员提供优化目标. 检查慢查询是否开启 通过show variables like ' ...

  2. mysql 跳表 b 树_简单谈谈Mysql索引与redis跳表

    摘要 面试时,交流有关mysql索引问题时,发现有些人能够涛涛不绝的说出B+树和B树,平衡二叉树的区别,却说不出B+树和hash索引的区别.这种一看就知道是死记硬背,没有理解索引的本质.本文旨在剖析这 ...

  3. MySQL什么用于左连接_简单谈谈mysql左连接内连接

    前言 最近忙着开发x省冷链追溯系统,天天干到晚上十一点多才回到家,周末也加班,没啥时间写博客,闲下来再好好写写 业务: sql语句统计出入库数据. 问题:只统计了X端入库单. 原因: 没有发现X端的数 ...

  4. mysql支持的并发数_重学MySQL系列(五):谈谈对MySQL的存储引擎的理解

    原创作者,公众号[程序员读书],欢迎关注公众号,转载文章请注明出处哦. MySQL关于存储引擎的架构设计,相较于其他关系数据库管理系统,比如Oracle,SQL Server等数据库,这是MySQL最 ...

  5. mysql 优惠卷表设计_这些年MySQL表设计踩过的坑!

    本文首发于个人微信公众号<andyqian>,期待你的关注! 前言 有朋友在后台留言.希望我能说说我在数据库表设计时踩过的坑.那么,我们今天就来聊聊我在数据库表设计时踩过的坑,以及现在对数 ...

  6. mysql update多个字段_常见的MySQL命令大全fourth

    1:使用SHOW语句找出在服务器上当前存在什么数据库: mysql> SHOW DATABASES; 2:2.创建一个数据库MYSQLDATA mysql> Create DATABASE ...

  7. mysql动力节点百度云_动力节点MySQL数据库视频 百度云 网盘 下载

    资源名称:动力节点MySQL数据库视频 百度云 网盘 下载 # o4 E. q% ]2 ?百度网盘下载链接:[/hide]- t4 L+ S# b2 T( }! d) n& d 密码:dff7 ...

  8. mysql自定义函数的优缺点_浅谈MySQL创建自定义函数漏洞的利用和防止

    前一阵子网上风靡的MySQL的udf.dll提权我有所了解-近日由于不再在IDC行业工作了-所以也有所淡忘- 只是最近实在手痒,就决定对我的站点所在的服务器下手--.正好用上这招了- 站点的服务器是W ...

  9. mysql不停止重启服务器_不停止MySQL服务增加从库的两种方式

    现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. ...

最新文章

  1. 2_vuex状态管理器
  2. Java学习笔记12
  3. dede mysql x_认识Dede的mysql数据库结构功能
  4. 私有云相对更流行的公有云和混合云有什么优势?
  5. null导入失败_当null检查非常失败时
  6. SpringBoot 集成 Nacos
  7. 记一次node项目重构改进
  8. SELU︱在keras、tensorflow中使用SELU激活函数
  9. i++与++i的区别+汇编分析
  10. 视频教程-IT必备技能Cisco认证CCNA全集-思科认证
  11. 泰坦尼克号生存预测python_用Python预测泰坦尼克号生存情况
  12. Linux下安装sublime汉化版及完美输入中文
  13. fps透视基础-3分钟快速定位矩阵基址-附3D坐标转屏幕坐标算法
  14. Win10开启远程桌面
  15. 计算机管理 服务无响应,电脑任务栏假死点击没反应的解决方法(win7与xp)
  16. JS高级——浏览器运行前端项目的原理及流程
  17. [Python]简单抓取百度blog
  18. 谷歌浏览器如何截全屏图片?
  19. Elasticsearch7学习笔记(中)
  20. 关于深度学习在生物学领域的应用分析

热门文章

  1. JMeter:No-GUI运行及生成漂亮的HTML报告
  2. CBC2020 第五届中国计算机学会生物信息学会议(The Fifth CCF Bioinformatics Conference,简称CBC 2020) 2020年10月16日-10月18日在哈尔滨
  3. Hybrid de novo tandem repeat detection using short and long reads 使用短读和长读的混合从头到尾串联重复检测
  4. 计算机组成微程序设计,计算机组成原理微程序设计.doc
  5. python pandas DataFrame 修改数据
  6. AI 利用BP算法及Sigmoid函数,研究函数f(x)=2sinx-0.7的逼近问题-实验报告
  7. Python常用函数与技巧总结(三)
  8. 可变形卷积网络--Deformable Convolutional Networks
  9. LeetCode 583. Delete Operation for Two Strings--动态规划 DP--Java,Python,C++解法
  10. 树莓派安装Ubuntu