数据库您现在的位置是:首页 > 博客日志 > 数据库

【MySQL】多表连接更新(update),使用临时表加快效率

<a href='mailto:'>微wx笑</a>的头像微wx笑 2022-12-04数据库 5 0关键字: mysql  update  

mysql update使用临时表可以提高效率,但是需要注意join语句的使用,left join 的效率非常低,inner join 的效率就很高。

mysql update使用临时表可以提高效率,但是需要注意join语句的使用,left join 的效率非常低,inner join 的效率就很高。VOZ无知


VOZ无知

更新语句写法:VOZ无知

 UPDATE `equity2` te inner join (SELECT `equity_id`, COUNT(1) ltnum FROM `equity_liutong` WHERE 1 GROUP by `equity_id`) elt on te.id=elt.equity_id
 set te.ltnum=elt.ltnum

equity2 有7万多条记录,equity_liutong表有40多万条记录VOZ无知

如果语句中的 inner join 改为 left join,大概需要执行10分钟左右;VOZ无知

而 inner join 查询花费 0.6510 秒,连一秒都不到。VOZ无知


VOZ无知

试过创建临时表VOZ无知

Create table tmp_equity_liutong(SELECT `equity_id`, COUNT(1) ltnum FROM `equity_liutong` WHERE 1 GROUP by `equity_id`);
UPDATE `equity2` te inner join tmp_equity_liutong elt on te.id=elt.equity_id set te.ltnum=elt.ltnum

创建表之后再更新,上面创建表的语句会同时把查询的结果都插入到新创建的表中。VOZ无知

虽然速度很多,但是创建的临时表还需要删除,不如最上面的语句方便。VOZ无知

另外,VOZ无知

mysql是不支持下面这样的语句的:VOZ无知

SELECT `equity_id`, COUNT(1) ltnum into tmp_equity_liutong FROM `equity_liutong`

要用上面 Create table select 的语句代替,这个语句的特点是目标数据表不存在,可以自动创建;VOZ无知

如果已经存在了,就需要使用下面的语句:VOZ无知

INSERT INTO `equity2`(`id`, `name`) select `id`, `name` from `equity` where 1


VOZ无知


VOZ无知


VOZ无知

本文由 微wx笑 创作,采用 署名-非商业性使用-相同方式共享 4.0 许可协议,转载请附上原文出处链接及本声明。
原文链接:https://www.ivu4e.cn/blog/database/2022-12-04/1606.html

很赞哦! () 有话说 ()