灯下哥谭 灯下哥谭
首页
关于
  • Hermes Agent 平台
  • Claude Code
  • OpenClaw
  • GPU 推理节点运维
  • DeepSeek Harness
  • MySQL 运维知识地图
  • Elasticsearch 运维知识地图
  • Redis 运维知识地图
  • TiDB 体系
  • DBA 常用 SQL 与命令
  • Nginx 运维知识地图
  • Prometheus 监控
  • Docker
  • Systemd
  • Iptables
  • Firewalld
  • Sshd
  • MySQL8 运维 SOP 手册
  • MySQL 实战 45 讲(读书笔记)
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

灯下哥谭

灯还亮着
首页
关于
  • Hermes Agent 平台
  • Claude Code
  • OpenClaw
  • GPU 推理节点运维
  • DeepSeek Harness
  • MySQL 运维知识地图
  • Elasticsearch 运维知识地图
  • Redis 运维知识地图
  • TiDB 体系
  • DBA 常用 SQL 与命令
  • Nginx 运维知识地图
  • Prometheus 监控
  • Docker
  • Systemd
  • Iptables
  • Firewalld
  • Sshd
  • MySQL8 运维 SOP 手册
  • MySQL 实战 45 讲(读书笔记)
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • MySQL8-SOP

  • 课程笔记

    • MySQL实战45讲

      • MySQL45讲学习笔记
      • MySQL基础架构
      • MySQL日志系统 (Redo Log 与 Binlog)
      • MySQL事务隔离级别的实现原理
      • MySQL索引原理与优化
      • MySQL锁机制详解
      • MySQL事务与MVCC机制
      • MySQL普通索引与唯一索引的选择
      • MySQL优化器如何选择索引
      • MySQL字符串字段索引优化
      • MySQL抖动刷脏页
      • 表空间管理与回收
      • COUNT函数详解
      • 日志索引
      • orderby工作原理
      • 随机排序实现
      • SQL性能差异函数与转换
      • 慢查询分析锁与版本
      • 幻读与间隙锁
      • 加锁规则分析
      • 应急性能优化方法
      • 数据持久化保证
      • 主备一致性原理
      • 高可用架构与切换
      • 备库延迟分析与优化
      • 主备切换GTID
      • 读写分离实践与问题
      • 数据库健康检查
      • 锁与死锁
      • 数据误删恢复
      • Kill命令详解
      • 查询与内存使用分析
      • Join原理与选择
      • 临时表原理与应用
      • 内部临时表详解
        • 1. 什么是内部临时表
        • 2. 创建内部临时表的场景
          • 2.1 GROUP BY操作
          • 2.2 DISTINCT操作
          • 2.3 UNION操作
          • 2.4 子查询
        • 3. 内部临时表的类型
          • 3.1 内存临时表
          • 3.2 磁盘临时表
        • 4. 临时表的创建条件
          • 4.1 内存临时表创建条件
          • 4.2 磁盘临时表创建条件
        • 5. 优化技巧
          • 5.1 调整临时表大小参数
          • 5.2 避免不必要的临时表
        • 6. 监控内部临时表
          • 6.1 查看临时表使用情况
          • 6.2 关键指标解释
        • 7. 实际案例
          • 7.1 GROUP BY优化示例
          • 7.2 DISTINCT优化示例
      • Memory引擎详解
      • 自增ID详解
      • Insert加锁分析
      • 表复制方法比较
      • Grant与权限管理
      • 分区表详解
      • SQL语句中的Join问题
      • 自增ID用尽问题
  • 专题系列
  • 课程笔记
  • MySQL实战45讲
灯下哥谭
2024-07-27
目录

内部临时表详解

# 内部临时表详解

# 1. 什么是内部临时表

内部临时表是MySQL在执行某些SQL语句时,为了完成查询而创建的临时表。这些表通常由MySQL服务器自动创建和管理,不需要用户显式创建。

# 2. 创建内部临时表的场景

# 2.1 GROUP BY操作

当执行GROUP BY语句时,MySQL可能会创建内部临时表来存储分组后的结果。

# 2.2 DISTINCT操作

使用DISTINCT关键字时,MySQL可能需要创建临时表来去除重复记录。

# 2.3 UNION操作

UNION操作可能需要创建临时表来合并两个或多个查询结果。

# 2.4 子查询

某些复杂的子查询可能需要使用临时表来存储中间结果。

# 3. 内部临时表的类型

# 3.1 内存临时表

  • 存储在内存中
  • 性能较好
  • 受到tmp_table_size和max_heap_table_size参数限制

# 3.2 磁盘临时表

  • 存储在磁盘上
  • 当内存不足时自动创建
  • 性能相对较差

# 4. 临时表的创建条件

# 4.1 内存临时表创建条件

  • 查询结果集较小
  • 使用的字符集支持内存存储
  • 不超过临时表大小限制

# 4.2 磁盘临时表创建条件

  • 结果集太大,超出内存限制
  • 使用了TEXT或BLOB类型的字段
  • 使用了非utf8mb4字符集

# 5. 优化技巧

# 5.1 调整临时表大小参数

-- 查看当前设置
SHOW VARIABLES LIKE 'tmp_table_size';
SHOW VARIABLES LIKE 'max_heap_table_size';

-- 修改设置(需要重启MySQL生效)
SET GLOBAL tmp_table_size = 256*1024*1024;
SET GLOBAL max_heap_table_size = 256*1024*1024;
1
2
3
4
5
6
7

# 5.2 避免不必要的临时表

  • 减少复杂子查询的使用
  • 合理设计索引,避免排序和分组操作
  • 使用EXPLAIN分析查询计划,识别可能导致临时表的操作

# 6. 监控内部临时表

# 6.1 查看临时表使用情况

SHOW STATUS LIKE 'Created_tmp%';
1

# 6.2 关键指标解释

  • Created_tmp_disk_tables:创建的磁盘临时表数量
  • Created_tmp_files:创建的临时文件数量
  • Created_tmp_tables:创建的内存临时表数量

# 7. 实际案例

# 7.1 GROUP BY优化示例

-- 可能创建临时表的查询
SELECT department, COUNT(*) FROM employees GROUP BY department;

-- 优化建议:确保department字段有索引
CREATE INDEX idx_department ON employees(department);
1
2
3
4
5

# 7.2 DISTINCT优化示例

-- 可能创建临时表的查询
SELECT DISTINCT email FROM users;

-- 优化建议:确保email字段有索引
CREATE INDEX idx_email ON users(email);
1
2
3
4
5
#学习笔记#MySQL
上次更新: 9/11/2026

← 临时表原理与应用 Memory引擎详解→

最近更新
01
DeepSeek Harness 实战 06|学习笔记:插件、工具、技能不在同一个维度上 原创
09-11
02
DeepSeek Harness 实战 05|让两个编码 Agent 共用一份长期记忆 原创
09-09
03
DeepSeek Harness 实战 04|学习笔记:从「已知限制」里读出三处设计张力 原创
09-08
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式