版权声明:本文为博主原创文章,未经博主允许不得转载 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