mysql sql 优化之 delete in 子查询不走索引优化,update in 子查询效率提升优化

版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.csdn.net/qq_24909089/article/details/90173835

表信息:

CREATE TABLE `Activity` (
  `guid` bigint(20) unsigned NOT NULL DEFAULT '0',
  `player` bigint(20) unsigned NOT NULL DEFAULT '0',
  `act_info` blob,
  PRIMARY KEY (`guid`),
  KEY `player` (`player`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `Delete_log` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `player` bigint(20) unsigned NOT NULL DEFAULT '0',
  `user_id` int(11) DEFAULT '0',
  `day` date DEFAULT NULL COMMENT '创建日期',
  `create_time` bigint(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
  `type` tinyint(2) DEFAULT '0' COMMENT '执行状态0未处理 1处理',
  PRIMARY KEY (`id`),
  KEY `guid` (`player`,`user_id`,`type`),
  KEY `type` (`type`)
) ENGINE=InnoDB AUTO_INCREMENT=246837 DEFAULT CHARSET=utf8;

处理情况

1、根据某表条件删除其他表关联数据

2、根据某表条件修改其他表关联数据

实际操作delete:

如果不考虑性能可以直接使用 子查询 in 写法如下

explain delete from Activity where player in (select player from Delete_log where type=0); 

检查一下索引:

可以发现Activity 表没有走索引 type = ALL,检查的行数146037

优化写法:使用关联查询删除

explain delete A from Activity as A inner join Delete_log as B on B.player=A.player where B.type=0;

检查一下索引:

实际操作update:

普通子查询写法:

explain update `Activity` set player = 1 where player in (select player from Delete_log where `type`=0);

执行效率:虽然走了索引但是检索的行数还是很多好像是先遍历了Activity表,又去查询的Delete_log,而且虽然执行效率是index但是没有走索引

优化写法:

explain update `Activity` as A inner join (select player from Delete_log where `type`=0) as B on A.player = B.player set A.player = 0;

explain update `Activity` as A inner join Delete_log as B on A.player = B.player set A.player = 0 where B.`type`=0;

效果很明显吧。流程使用inner join 简历一个关联查询。

explain 的用法https://blog.csdn.net/qq_24909089/article/details/80882519

猜你喜欢

转载自blog.csdn.net/qq_24909089/article/details/90173835