MySQL临时表排查Using temporary详细过程(不是一句小提示)

 更新时间:2026年07月14日 09:49:02   作者:程序员小一  
这篇文章主要介绍了MySQL临时表排查Using temporary的相关资料,文中通过代码详细介绍了临时表如何拖慢排序、分组和去重操作,教你用EXPLAIN ANALYZE和状态变量精准定位问题,需要的朋友可以参考下

前言

MySQL 执行计划里的 Using temporary 经常被当成普通提示,但它可能意味着排序、分组或去重过程中需要额外临时表。数据量小的时候不明显,数据量上来以后,临时表可能落盘,查询延迟直接变脸。

看到 Using temporary,不要只皱一下眉就过去。它值得被认真排查。

一、临时表从哪里来

flowchart TD
  A[SQL] --> B[GROUP BY]
  A --> C[ORDER BY]
  A --> D[DISTINCT]
  A --> E[UNION]
  B --> F[Temporary Table]
  C --> F
  D --> F
  E --> F

临时表不是一定有问题,但它表示执行器需要额外中间结果。是否危险,要看数据量、内存阈值和是否落盘。

二、先看执行计划和实际执行

EXPLAIN
SELECT user_id, COUNT(*)
FROM orders
WHERE created_at >= '2026-07-01'
GROUP BY user_id
ORDER BY COUNT(*) DESC;

如果 Extra 里出现 Using temporary; Using filesort,就要继续看实际扫描行数、排序行数和耗时。MySQL 8 可以用 EXPLAIN ANALYZE 获取更接近真实的执行信息。

三、内存临时表和磁盘临时表差很多

内存临时表还好,落盘后延迟会明显上升。可以看状态变量:

SHOW GLOBAL STATUS LIKE 'Created_tmp%';

重点关注 Created_tmp_disk_tables。如果它随某类查询明显增长,说明临时表已经进入磁盘路径。

四、优化要从 SQL 形态开始

有时可以通过合适索引减少临时表,有时需要改写查询,把大范围聚合拆到离线任务或汇总表。

CREATE INDEX idx_orders_created_user ON orders(created_at, user_id);

但索引不是万能。ORDER BY COUNT(*) 这类聚合排序,本质上仍需要中间结果。不要幻想一个索引解决所有分组排序。

还要关注临时表字段类型。包含 TEXT、BLOB 或宽 VARCHAR 的中间结果,更容易触发磁盘临时表。查询中如果只需要少数列,就不要把宽列带进子查询或派生表。

SELECT user_id, COUNT(*) AS cnt
FROM (
  SELECT user_id
  FROM orders
  WHERE created_at >= '2026-07-01'
) t
GROUP BY user_id;

这类改写不一定总是更快,但能提醒我们:中间结果越窄,临时表越可控。

五、总结

MySQL Using temporary 不是一句小提示。它可能来自 group by、order by、distinct、union 等操作,关键要看是否落盘、扫描行数和实际耗时。

排查时结合 EXPLAIN ANALYZE、状态变量和 SQL 形态判断。该加索引就加,该改查询就改,别把临时表当空气。

如果临时表来自业务必需的大范围聚合,就该把问题上升到数据模型或报表链路,而不是继续在单条 SQL 上拧螺丝。

这时更应该考虑汇总表、异步计算或分析库,而不是让在线库每天重复做同一批昂贵中间结果。

把计算放到合适位置,本身就是优化。

别让在线查询承担离线报表的重量。

到此这篇关于MySQL临时表排查Using temporary详细过程的文章就介绍到这了,更多相关MySQL临时表排查Using temporary内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql函数全面总结

    mysql函数全面总结

    这篇文章主要介绍了mysql函数,下面文章从MySQL常用的函数开始介绍、还有数值函数,利用举例说明的形式展开内容,需要的朋友可以参考一下
    2021-11-11
  • MySQL之InnoDB中的redo日志类型详解

    MySQL之InnoDB中的redo日志类型详解

    这篇文章主要介绍了MySQL之InnoDB中的redo日志类型,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • MYSQL explain 执行计划

    MYSQL explain 执行计划

    explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。
    2009-08-08
  • Mac 下 MySQL5.7.22的安装过程

    Mac 下 MySQL5.7.22的安装过程

    这篇文章主要介绍了Mac 下 MySQL5.7.22的安装过程,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • 深度解析如何正确使用MySQL日期时间类型

    深度解析如何正确使用MySQL日期时间类型

    MySQL作为主流关系型数据库,其日期时间类型的选择策略对系统性能与功能实现至关重要,本文将从技术原理与工程实践角度展开深度分析,感兴趣的小伙伴可以了解下
    2025-06-06
  • MySQL高级查询示例详细介绍

    MySQL高级查询示例详细介绍

    这篇文章主要介绍了MySQL高级查询示例,在面试过程中经常会遇到sq查询问题,今天小编通过本文给大家介绍下MySQL高级查询语法分析,感兴趣的朋友跟随小编一起看看吧
    2023-02-02
  • mysql 教程 存储过程

    mysql 教程 存储过程

    最近用mysql + asp.net来写网站,既然mysql已经支持存储过程了,那么像分页这么常用的东西,当然要用存储过程啦
    2009-06-06
  • Mysql主从复制作用和工作原理详解

    Mysql主从复制作用和工作原理详解

    这篇文章主要介绍了Mysql主从复制作用和工作原理详解,主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库,主数据库一般是准实时的业务数据库,需要的朋友可以参考下
    2019-07-07
  • 详解MySQL 表中非主键列溢出情况监控

    详解MySQL 表中非主键列溢出情况监控

    这篇文章主要介绍了详解MySQL 表中非主键列溢出情况监控,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • mysql出现“Incorrect key file for table”处理方法

    mysql出现“Incorrect key file for table”处理方法

    今天在恢复一个客户数据的时候。发现了一贯问题。有多个表损坏了。因为都是直接把表复制进去的。然后就出现了这个问题问题
    2013-07-07

最新评论