浅谈Mysql在什么情况下会使用内部临时表

 更新时间:2021年10月26日 09:18:48   作者:我和宁拼啦  
内部临时表是一种特殊轻量级的临时表,本文主要介绍了Mysql在什么情况下会使用内部临时表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

union执行

为了便于分析,使用一下sql来进行举例

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 ( );

然后我们执行以下sql

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

这段sql的语义是,取两个子查询的的并集,并且去重

可以看到,第二行的key是primary,说明第二个子查询使用索引id。第三行的Extra字段,表示在子查询union的时候,使用了临时表(Using temporary)。
这个语句的执行流程是这样的:
1)创建一个内存临时表,这个临时表只有一个整形字段f,并且f是主键字段
2)执行第一个子查询,将1000存在临时表
3)执行第二个子查询,拿到第一行id=1000,并试图插入到临时表,但是由于1000这个值已经存在临时表了,违法了唯一性约束,所以插入失败,接着取到第二行数据999,插入临时表成功
4)从临时表中按行取出数据,返回结果,并删除临时表,结果中包含两条数据就是1000和999
可以看到,临时表起到了暂存数据的作用,而且存在唯一性约束,实现了union去重的语义

group by

另外一个常见的使用临时表的例子就是group by,我们看一下以下sql

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

这个语句就是根据t1表的数据,根据id%10进行分组,并按照m的结果排序后输出

在Extra字段中,我们看到了三个信息:

1)Using index,表示这个语句使用了覆盖索引,选择了索引 a;
2)Using temporary,表示使用了临时表;
3)Using filesort,表示需要排序;

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

1)创建内存临时表,表里有字段m和c,主键是m;
2)扫描表t1的索引a,依次取出叶子节点上面的id值,计算id%10的结果,记为x;

  • 如果临时表没有主键x,就插入一个记录(x,1);
  • 如果表中有主键x的行,就将x这一行的c值加1;

3)遍历完成之后,再根据字段m做排序,得到结果

内存临时表的大小是有限制的,参数tmp_table_size就是控制这个内存大小的,默认是16M,如果内存临时表大小达到了上线,这时候就会把内存临时表转成磁盘临时表,磁盘临时表的默认引擎是InnoDB,如果表的数据量很大,很可能查询就会占用大量的磁盘空间

到此这篇关于浅谈Mysql在什么情况下会使用内部临时表的文章就介绍到这了,更多相关Mysql 内部临时表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL插入时间戳字段的值实现

    MySQL插入时间戳字段的值实现

    在MySQL中,我们经常会遇到需要插入时间戳字段的情况,包括使用NOW()函数插入当前时间戳,使用FROM_UNIXTIME()插入指定时间戳,本文就来介绍一下,感兴趣的可以了解一下
    2024-09-09
  • Mysql存储引擎特性总结

    Mysql存储引擎特性总结

    这篇文章主要介绍了Mysql存储引擎特性总结,同时总结了最常用的2种存储引擎的特性,以及各引擎的适用环境,需要的朋友可以参考下
    2014-07-07
  • MySQL如何运行sql文件图文详解(以Navicat做演示)

    MySQL如何运行sql文件图文详解(以Navicat做演示)

    Navicat是MySQL非常好用的可视化管理工具,功能非常强大,能满足我们日常数据库开发的所有需求,这篇文章主要给大家介绍了关于MySQL如何运行sql文件(以Navicat做演示)的相关资料,需要的朋友可以参考下
    2024-08-08
  • 使用Linux的Shell脚本定时处理MySQL超时

    使用Linux的Shell脚本定时处理MySQL超时

    本文提供使用Linux的Shell脚本定时处理MySQL超时Locked进程脚本
    2013-11-11
  • mysql存储过程之if语句用法实例详解

    mysql存储过程之if语句用法实例详解

    这篇文章主要介绍了mysql存储过程之if语句用法,结合实例形式详细分析了mysql存储过程中if语句相关原理、使用技巧与操作注意事项,需要的朋友可以参考下
    2019-12-12
  • MySQL InnoDB 二级索引的排序示例详解

    MySQL InnoDB 二级索引的排序示例详解

    这篇文章主要给大家介绍了关于MySQL InnoDB 二级索引的排序的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • 史上最简单的MySQL数据备份与还原教程(下)(三十七)

    史上最简单的MySQL数据备份与还原教程(下)(三十七)

    这篇文章主要为大家详细介绍了史上最简单的MySQL数据备份与还原教程下篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • MySQL8.0升级的踩坑历险记

    MySQL8.0升级的踩坑历险记

    听说mysql8的性能提升了很多,对于我这种喜欢把所有软件升级到最新版的人来说,二话不说直接升级,这篇文章主要给大家介绍了关于MySQL8.0升级踩坑的相关资料,需要的朋友可以参考下
    2021-10-10
  • sql语句优化的一般步骤详解

    sql语句优化的一般步骤详解

    网上关于SQL优化的教程很多,但是比较杂乱,近日有空整理了一下,写出来跟大家分享,下面这篇文章主要给大家分享介绍了关于sql语句优化的一般步骤,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-09-09
  • MySQL 5.7增强版Semisync Replication性能优化

    MySQL 5.7增强版Semisync Replication性能优化

    这篇文章主要介绍了MySQL 5.7增强版Semisync Replication性能优化,本文着重讲解支持发送binlog和接受ack的异步化、支持在事务commit前等待ACK两项内容,需要的朋友可以参考下
    2015-05-05

最新评论