update in 的优化写法

在一般的 update in 写法就是:

update table_name set column = 'xxx' where column2 in (select x from table_name2 where xxxxxx)

但是这种写法在表数据量小的时候不会有啥问题, 但是在表的数据量比较大的情况下, 这样就会引起全表扫描, 子查询带来了巨大的资源开销,以及锁表.

优化后的写法如下:

update table_a a join table_b b on a.xx=b.xx
set a.xx=要变更的值
where b.xx=条件值

实际例子

第一种写法:

EXPLAIN
UPDATE t_form_template_function SET del_flag = '1' WHERE struct_id IN ( SELECT DISTINCT id FROM t_form_template_struct WHERE pid = 'GE148389280359880457831') and del_flag='0' ;

分析结果为: rows : 6661

第二种写法:

EXPLAIN
UPDATE t_form_template_function f JOIN t_form_template_struct s ON f.struct_id = s.id SET f.del_flag = '1' 
WHERE s.pid = 'GE148389280359880457831' AND f.del_flag = '0';

分析结果为: rows: 6

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python3

初识mysql语句

mysql> update mysql.user set authentication_string =password('root') where User=...

792
来自专栏mwangblog

开始使用MySQL

1602
来自专栏lgp20151222

Mysql 如何设置字段自动获取当前时间,附带添加字段和修改字段的例子

ALTER TABLE `table_name` ADD COLUMN  `CreateTime` datetime NULL DEFAULT CURRENT...

1051
来自专栏一个会写诗的程序员的博客

SQL中的DML、DDL以及DCL是什么?

DML(data manipulation language)是数据操纵语言:它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这...

714
来自专栏服务端思维

服务端开发指南与最佳实战 | 数据存储技术 | MySQL(02) 存储引擎的 InnoDB 与 MyISAM 之争

作为 MySQL 数据库的两种主要的存储引擎,InnoDB 与 MyISAM 各有长处。

693
来自专栏抠抠空间

mysql清空有外键关联的表

SET FOREIGN_KEY_CHECKS = 0;    TRUNCATE TABLE 表名;   SET FOREIGN_KEY_CHECKS = 1; 

654
来自专栏我的博客

MySQL触发器

1、触发器定义就不说了,既然能看到我这个文章就肯定明白这个定义了。用途也不多说,来看继续向下看吧! 触发器语法: CREATE TRIGGER <触发器名称...

2545
来自专栏乐沙弥的世界

一次mysql 5.5升级到5.6导致的ERROR 1805

前阵子将mysql数据库由5.5.14升级到5.6.36,升级后所有的业务数据都正常。运行了几天后,发现在主库上添加用户失败,错误提示为:ERROR 1805 ...

872
来自专栏JavaQ

MySQL timestamp类型列值自动更新

MySQL中使用timestamp定义字段,默认情况下会给字段添加自动更新的属性,本文将分析这个自动更新的设置。 问题概述 一个表中定义了两个timestam...

3507
来自专栏Netkiller

数据库安全·Token 认证

以下节选择《Netkiller Architect 手札》 作者:netkiller 地址 http://www.netkiller.cn/archit...

3674

扫码关注云+社区