旧数据的拷贝到新表,是 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 分钟
评论区