记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)
可以看到并没有走索引,而是遍历了a表,所以执行时间会很长,难道是where in 不会走索引?带着这样的疑惑,我尝试了查询语句:
EXPLAIN SELECT * FROM phone_bak1 WHERE phone IN (SELECT phone FROM phone_delete)
很明显,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
可以看到使用inner join 确实走了索引,今天发现这个问题觉得还是挺有意思的,把它记录下来,希望自己以后在项目中不要犯这种错误
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验