在数据库开发与调优中,Temporary Table(临时表) 并不是“随便用”的工具,而是在特定场景下用来简化逻辑、提升性能或隔离数据的手段。下面按「什么时候该用」「什么时候不该用」来说明。
当一条 SQL 很难写,或同一结果集要在多处使用时:
CREATE TEMPORARY TABLE tmp_user_stat
SELECT user_id, COUNT(*) AS cnt
FROM orders
GROUP BY user_id;
SELECT * FROM tmp_user_stat WHERE cnt > 10;
SELECT AVG(cnt) FROM tmp_user_stat;
✅ 适合:
在存储过程或脚本中保存过程数据:
CREATE TEMP TABLE step1 AS
SELECT ...;
✅ 适合:
当 SQL 可读性极差、 optimizer 走错执行计划时:
-- 不好
SELECT ...
FROM a
JOIN (SELECT ... FROM b GROUP BY ...) c ON ...
-- 更好
CREATE TEMP TABLE tmp_b AS SELECT ... FROM b GROUP BY ...;
✅ 适合:
临时表可建索引:
CREATE TEMPORARY TABLE tmp_t (id INT, PRIMARY KEY(id));
✅ 适合:
临时表只对当前会话可见:
CREATE TEMPORARY TABLE tmp_session_data (...);
✅ 适合:
❌ 只用一次、逻辑简单
→ 用子查询或 CTE(WITH)
❌ 数据量极小
→ 内存足够,直接算更快
❌ 高并发短事务
→ 临时表也有开销
❌ 可窗口函数解决
-- 不必用临时表
ROW_NUMBER() OVER (PARTITION BY user_id)
| 方式 | 是否落盘 | 可读性 | 复用 | 性能场景 |
|---|---|---|---|---|
| 子查询 | 否 | 差 | 否 | 简单 |
| CTE | 通常否 | 好 | 逻辑上 | 中等 |
| Temp Table | 可能 | 好 | 是 | 复杂/大 |
✅ 用临时表当:
❌ 不用临时表当:
如果你有具体 SQL 或业务场景,我可以直接帮你判断是否该用临时表。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。