侧边栏壁纸
  • 累计撰写 58 篇文章
  • 累计创建 67 个标签
  • 累计收到 1 条评论

MySQL | 临时表

lihaocheng
2021-11-20 / 0 评论 / 0 点赞 / 811 阅读 / 1,071 字
温馨提示:
晚上记得开启夜间模式哦

旧数据的拷贝到新表,是 CRUD 工程师经常碰到的问题。这周我就碰到了,需要 JOIN 两张旧表的数据,再用 GRUOP BY 取出每个订单最新的状态,更新到第三张表中。在我写完这个语句之后,更新 SQL 执行了 6 分钟。

两张表的结构是这样的,A表是订单表,B 表是状态回传表,一个订单可能有多个状态,两个表使用订单号做关联。我需要将每个订单的最新状态做映射之后,更新到第三张表中。

CREATE TABLE A (
    //表的参数
    `bill_code` varchar(40) COMMENT '订单号'
    //其他无关参数
);

CREATE TABLE B (
    //表的参数
    `bill_code` varchar(40) COMMENT '订单号', 
    `status` varchar(10) COMMENT '状态'
    `create_time` timestamp COMMENT '创建时间'
    //其他无关参数
);

CREATE TABLE C (
    //表的参数
    `bill_code` varchar(40) COMMENT '订单号', 
    `status_now` varchar(10) COMMENT '最新状态'
    //其他无关参数
);

我的思路是:先查出所有订单的最新一条状态,然后按照映射关系一个一个更新最后一张表。

我给状态的字段加了索引,但性能并没有提升。考虑到每次我都需要查询每个订单的最新状态,我开始尝试最后的办法——临时表。

什么是临时表

临时表是mysql提供的一种特殊表。创建后可以像其他表一样正常使用,但是只要断开数据库链接,这张表就不存在了。
这刚好符合我的需要,我可以把查询最新状态的结果放到临时表中,反正这些语句只需要执行这一次。用临时表也不会引入新的表。

创建临时表

使用临时表非常简单,比起普通的建表语句就多了TEMPORARY,加上这个关键字,一个临时表就完成了。

CREATE TEMPORARY TABLE t_table (
    //表的参数
    `bill_code` varchar(40) COMMENT '订单号',
    `status` varchar(10) COMMENT '最新状态'
);
--找出每个订单最新的一条数据
INSERT INTO t_table (bill_code,status) VALUES SELECT billcode,

我先把需要的数据更新到临时表中,最再用临时表中的结果更新第三张表。

UPDATE table_3 SET order_staus='完成了xx' WHERE bill_code IN (SELECT bill_code FROM t_table WHERE status='xx');

减少了查询次数。最后更新 SQL 优化为每条 1 分钟

0

评论区