记mysql中delete操作中使用in不会走索引的问题[通俗易懂]

记mysql中delete操作中使用in不会走索引的问题[通俗易懂]目前负责的一个项目,需要维护一个电话号码对比库,表名为phone_bak1,以下称为a表,量级为3000万条。还有另外一张表存储电话白名单,表名为phone_delete,以下称为b表,量级为3000

记mysql中delete操作中使用in不会走索引的问题

  目前负责的一个项目,需要维护一个电话号码对比库,表名为phone_bak1,以下称为a表,量级为3000万条。还有另外一张表存储电话白名单,表名为phone_delete,以下称为b表,量级为3000条左右。

  目的呢,是要从a表中排除掉在b表中的电话号码。

  我直接使用以下语句:

  DELETE FROM phone_bak1 WHERE phone IN (SELECT phone FROM phone_delete)

  然后phpMyAdmin直接就报超时了。虽然超时了但是语句还是执行了,当时没多想,就没管,今天就拿到研究研究。加上EXPLAIN分析sql语句:

  EXPLAIN DELETE FROM phone_bak1 WHERE phone IN (SELECT phone FROM phone_delete)

  记mysql中delete操作中使用in不会走索引的问题[通俗易懂]

  可以看到并没有走索引,而是遍历了a表,所以执行时间会很长,难道是where in 不会走索引?带着这样的疑惑,我尝试了查询语句:

 

 

   EXPLAIN SELECT * FROM phone_bak1 WHERE phone IN (SELECT phone FROM phone_delete)

  记mysql中delete操作中使用in不会走索引的问题[通俗易懂]

  很明显,where in 是会走索引的,但是在delete中使用不会使用索引。在网上查询了下资料,看到有人说使用inner join mysql会走索引,于是我尝试了下,使用以下sql语句:

  EXPLAIN DELETE phone_bak1 FROM phone_bak1 INNER JOIN phone_delete ON phone_bak1.phone = phone_delete.phone

  记mysql中delete操作中使用in不会走索引的问题[通俗易懂]

 

 

   可以看到使用inner join 确实走了索引,今天发现这个问题觉得还是挺有意思的,把它记录下来,希望自己以后在项目中不要犯这种错误

  

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/9555.html

(0)
上一篇 2023-02-05
下一篇 2023-02-05

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注