Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > Mysql临时表

Mysql临时表的具体使用

作者:剑之所向

本文主要介绍了主要介绍了Mysql临时表的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

MySQL中哪些具体场景会触发临时表的创建,这是优化数据库性能的关键问题——临时表如果频繁落到磁盘(而非内存),会显著消耗IO和CPU资源。

一、临时表的核心分类(先理清概念)

首先要明确:MySQL的临时表分两种,性能影响天差地别:

  1. 内存临时表:默认使用TempTable引擎(MySQL 8.0+)或MEMORY引擎,基于内存创建,速度快,受tmp_table_size/temptable_max_ram限制;
  2. 磁盘临时表:内存临时表超出阈值后,自动转为InnoDB/MyISAM引擎的磁盘临时表,IO开销大,是优化重点。

所有场景最终都是先尝试创建内存临时表,触发特定条件后才会落到磁盘。

二、触发临时表的核心业务场景(附案例+原因)

以下是最常见的触发场景,按出现频率排序:

1. 聚合查询(GROUP BY / DISTINCT / HAVING)

这是最常见的场景,几乎所有复杂聚合都会创建临时表。

2. 排序操作(ORDER BY)

当排序无法通过索引完成时,必然创建临时表。

3. 子查询/派生表(FROM子句中的子查询)

FROM子句中的子查询会被MySQL自动转为临时表(也称“派生表”)。

4. JOIN操作(多表关联)

特定JOIN场景会创建临时表,尤其是关联字段无索引或结果集需排序时。

5. UNION / UNION ALL(结果集合并)

6. 其他特殊场景

三、磁盘临时表的额外触发条件

即使触发了内存临时表,满足以下条件会转为磁盘临时表,这是性能优化的核心:

  1. 内存临时表大小超过tmp_table_size或temptable_max_ram(你服务器当前设的4G,建议下调到2G);
  2. 查询包含BLOB/TEXT大字段(内存临时表不支持这类字段,直接落磁盘);
  3. GROUP BY/ORDER BY的字段是字符串类型(且长度较长),内存排序效率低,易触发磁盘临时表;
  4. 使用DISTINCT+ORDER BY组合,双重消耗内存,易超出阈值。

总结

核心触发场景(重点记忆)

  1. 合类:GROUP BY/DISTINCT/HAVING是临时表最主要的触发源;
  2. 排序类:无索引的ORDER BY必然触发临时表+文件排序;
  3. 子查询/合并类:FROM子句派生表、UNION(尤其带去重/排序);
  4. 关联类:无索引的多表JOIN,或JOIN后排序。

优化关键

  1. 给聚合/排序/关联字段建合适的索引(最有效,直接避免临时表);
  2. 合理设置tmp_table_size(你服务器建议2G),避免内存临时表过早落磁盘;
  3. 用EXPLAIN排查Using temporary,优先优化高频SQL;
  4. 避免SELECT *,减少临时表的数据量,尤其你的服务器是4T硬盘,大结果集落磁盘会更慢。

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

您可能感兴趣的文章:
阅读全文