delete in子查询不走索引问题怎么解决


本文小编为大家详细介绍“deletein子查询不走索引问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“deletein子查询不走索引问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。MySQL版本是5.7,假设当前有两张表accountold_account,表结构如下:执行的SQL如下:我们explain执行计划走一波,从explain结果可以发现:先全表扫描account,然后逐行执行子查询判断条件是否满足;显然,这个执行计划和我们预期不符合,因为并没有走索引。但是如果把delete换成select,就会走索引。如下:为什么select in子查询会走索引,delete in子查询却不会走索引呢?select in子查询语句跟delete in子查询语句的不同点到底在哪里呢?我们执行以下SQL看看show WARNINGS可以查看优化后,最终执行的sql结果如下:select`test2`.`account`.`id`AS`id`,`test2`.`account`.`name`AS`name`,`test2`.`account`.`balance`AS`balance`,`test2`.`account`.`create_time`AS`create_time`,`test2`.`account`.`update_time`AS`update_time`from`test2`.`account`
semijoin(`test2`.`old_account`)
where(`test2`.`account`.`name`=`test2`.`old_account`.`name`)可以发现,实际执行的时候,MySQL对select in子查询做了优化,把子查询改成join的方式,所以可以走索引。但是很遗憾,对于delete in子查询,MySQL却没有对它做这个优化。那如何优化这个问题呢?通过上面的分析,显然可以把delete in子查询改为join的方式。我们改为join的方式后,再explain看下:可以发现,改用join的方式是可以走索引的,完美解决了这个问题。实际上,对于update或者delete子查询的语句,MySQL官网也是推荐join的方式优化其实呢,给表加别名,也可以解决这个问题哦,如下:what?为啥加个别名,delete in子查询又行了,又走索引了?我们回过头来看看explain的执行计划,可以发现Extra那一栏,有个LooseScanLooseScan是什么呢?其实它是一种策略,是semi join子查询的一种执行策略。因为子查询改为join,是可以让delete in子查询走索引;加别名呢,会走LooseScan策略,而LooseScan策略,本质上就是semi join子查询的一种执行策略。因此,加别名就可以让delete in子查询走索引啦!读到这里,这篇“免费云主机域名deletein子查询不走索引问题怎么解决”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注百云主机行业资讯频道。

相关推荐: TypeScript中的类型断言语法怎么使用

这篇文章主要介绍“TypeScript中的类型断言语法怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“TypeScript中的类型断言语法怎么使用”文章能帮助大家解决问题。Typescript中类型断言官方解释要…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/19 16:19
下一篇 03/19 16:29

相关推荐