Mysql 带 in 的删除操作会不走索引

Mysql delete in 不走索引的 delete in 不走索引 阅读详情

今天遇到一个性能问题,最后定位到一个删除操作特别慢。

delete  from t_policy where id in (select policyid from t_policy_user where userid = 1067919); 

语句很简单explain 发现 t_policy 没有走索引。

mysql> explain delete  from t_policy where id in (select policyid from t_policy_user where userid = 1067919);   
+----+--------------------+---------------+----------------+-----------------+----------+---------+------+--------+-------------+
| id | select_type        | table         | type           | possible_keys   | key      | key_len | ref  | rows   | Extra       |
+----+--------------------+---------------+----------------+-----------------+----------+---------+------+--------+-------------+
|  1 | PRIMARY            | t_policy      | ALL            | NULL            | NULL     | NULL    | NULL | 101523 | Using where |
|  2 | DEPENDENT SUBQUERY | t_policy_user | index_subquery | policyid,userid | policyid | 302     | func |      1 | Using where |
+----+--------------------+---------------+----------------+-----------------+----------+---------+------+--------+-------------+

同样的语句改为select就很快,explain 发现会走索引。

mysql> explain select *  from t_policy where id in (select policyid from t_policy_user where userid = 1067919);       
+----+--------------+---------------+--------+-----------------+---------+---------+----------------------+------+-------+
| id | select_type  | table         | type   | possible_keys   | key     | key_len | ref                  | rows | Extra |
+----+--------------+---------------+--------+-----------------+---------+---------+----------------------+------+-------+
|  1 | SIMPLE       | <subquery2>   | ALL    | NULL            | NULL    | NULL    | NULL                 | NULL | NULL  |
|  1 | SIMPLE       | t_policy      | eq_ref | PRIMARY         | PRIMARY | 302     | <subquery2>.policyid |    1 | NULL  |
|  2 | MATERIALIZED | t_policy_user | ref    | policyid,userid | userid  | 8       | const                |    1 | NULL  |
+----+--------------+---------------+--------+-----------------+---------+---------+----------------------+------+-------+

网上一通查,说可以用 inner join 代替 in 果然可以!

mysql> explain delete tp from t_policy tp inner join t_policy_user tpu on tp.id = tpu.policyid where tpu.userid = 1067919;
+----+-------------+-------+--------+-----------------+---------+---------+------------------+------+-------+
| id | select_type | table | type   | possible_keys   | key     | key_len | ref              | rows | Extra |
+----+-------------+-------+--------+-----------------+---------+---------+------------------+------+-------+
|  1 | SIMPLE      | tpu   | ref    | policyid,userid | userid  | 8       | const            |    1 | NULL  |
|  1 | SIMPLE      | tp    | eq_ref | PRIMARY         | PRIMARY | 302     | mdm.tpu.policyid |    1 | NULL  |
+----+-------------+-------+--------+-----------------+---------+---------+------------------+------+-------+

以下为inner join 的例句:


  1. --查询  
  2. SELECT tp.tp_id, tp.tpmc, tp.leveid, tp.tpdz, tp.jgm, tp.scsj, tp.pbzyid, tp.ksbfsj, tp.jsbfsj, tp.status, tp.tpbz   FROM  qdgl_tupian tp INNER JOIN  qdgl_pqb  pq  
  3.  ON  tp.tp_id=pq.tpid  WHERE  pq.bfjgm='27010825'  AND  ps_bfsj >= '2013-01' AND  ps_bfsj< 2013-05-31  ;  
[sql]  view plain  copy
  1. -- 修改  
  2.   UPDATE jx_lsjl jx INNER JOIN isa_gtxx gt ON jx.ckid=gt.gtbh  set jx.ckid=gt.gtid WHERE gt.jgm='27010825' AND jx.jgm='27010825' ;  
[sql]  view plain  copy
  1. --删除  
  2.  DELETE jx FROM  jx_lsjl jx INNER JOIN isa_gtxx gt ON jx.ckid=gt.gtbh    WHERE gt.jgm='27010825' AND jx.jgm='27010825' ;  

至于mysql为什么会有这样的问题,找到的个人认为比较靠谱的解释是:

之所以会卡
是因为子查询的操作会铁定会创建临时表,当然创建内存临时表并不可怕
但是当你数据量大了以后,内存临时表的单表大小限制后,临时表会转换为写磁盘形式的物理内存表

这两个参数决定了你临时表的大小
tmp_table_size  max_heap_table_size

你可以查看这两个状态状态的变化,看你数据库性语句是否有问题。
Created_tmp_disk_tables/Created_tmp_tables<5%   



SQL delete不走索引 由于业务变迁,合规要求,我们需要删除大量非本公司的数据,涉及到上百张表,几个T的数据清洗。我们的做法是先从基础数据出发,将要删除的数据id收集到一张表,然后再由上往下删除子表,多线程并发处理。我们使用的是阿里的polardb,完全兼容mysql协议,5.7版本,RC隔离级别。。从日志上看是获取锁失败了,马上想到出现死锁了,但我们使用RC,这个隔离级别下会出现不可重复读和幻读,但没有间隙锁等,并发效率比较高,在我们实际应用过程中,也很少遇到加锁失败的问题。 阅读详情

相关推荐

【SQL应知应会】索引(三)• MySQL版:聚簇索引与非聚簇索引;查看索引与删除索引;索引方法

✅今天继续SQL的索引的篇章,同样我们会讲到MySQL和Oracle的索引,大家拭目以待吧✴️文章中提供了代码和很具体的截图,代码是为了减轻大家学习的难度,同时用截图可以更形象的让大家去理解知识点想要表达的意思,希望大家跟着一起学起来💻那么,快拿出你的电脑,跟着文章一起学习起来吧在索引(一)中描述了索引的优点与缺点,可以帮助我们更好的理解为什么使用索引以及学习索引应该思考哪些问题。

爱书不爱输的程序猿 4699

Delete in是否走索引?

前言文章开篇前,先问大家一个问题:delete in子查询,是否会走索引呢?很多伙伴第一感觉就是:会走索引。最近我们有个生产问题,就跟它有关。本文将跟大家一起探讨这个问题,并附上优化方案。...

IT技术精选文摘 1681

Windows Server 2012 R2虚拟机安装全攻略:从镜像选择到网络配置一步到位

本文提供Windows Server 2012 R2虚拟机安装全攻略,涵盖从镜像选择到网络配置的完整流程。详细讲解在Oracle VM VirtualBox中的安装步骤、TCP/IP网络设置、系统优化及常见问题解决方案,帮助用户快速搭建可立即投入使用的服务器环境。特别适合IT初学者和系统管理员学习传统服务器应用的部署与配置。

weixin_28363123的博客 538

MySQL中in会走索引吗?

30%

weixin_66196770的博客 1746

自动驾驶预测决策规划八股

预测规划八股个人总结。

dawushixiange的博客 479

每天10分钟,混剪视频Agent产出50条爆款,单月变现6位数(喂饭级教程)

混剪视频是指将多个视频片段、图片或音频素材进行剪辑组合,创造出新的视频内容。随着Coze上线联动剪映功能,混剪视频制作正在进入自动化时代,为创作者带来巨大便利。高效自动化处理:AI可以自动完成琐碎的剪辑工作,让创作者省下大量时间专注于项目策划和创意。批量素材产出:特别适用于抖音、小红书和视频号等平台上的养生、科普、心理、疗愈等垂直领域,可以自动化批量生产图片和视频素材。引流获客:通过优质内容吸引目标受众知识变现:通过教学传授技术工具变现:将搭建好的工作流作为产品销售。

汤师爷的博客 864

MySQL DELETE IN 语句优化

文章目录目录案发现场EXPLAIN 分析1. 从下面可以直接发现全表扫描了,而且有 134937 行数据2. 查看a、b表索引3. SELECT * 复查一下4. 优化方案 - 覆盖索引+JOIN 目录 前言: 最近在查看阿里上面的一些慢SQL查询,抽取一个例子,DELETE + IN 没有使用索引的。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r6YI9taA-1622079575334)(https://qiniuyun.eddilee.cn/%E5%9B%BE%E

Eddie'Blog 5108

记录Nvidia AGX Orin的配置日常(二)设置上电自动开机和远程桌面

因为要拿AGX作为机器人的主控板,所以需要给他设置一下通电后无需按电源键就自动开机,然后再配置一下远程桌面。

AutomaticForever的博客 1356

【MySQL in不走索引的问题】

MySQL in不走索引的问题

weixin_44665318的博客 314

H5获取手机相机或相册图片两种方式-Android通过webview传递多张照片给H5

H5调用公共获取图片文件方法,在android手机端,H5主要依赖Webview,这边在webview声明并重写该方法onShowFileChooser使用工具类打开相机或相册,可以两种方式安卓原生方式或者利用第三方组件库方式选中图片,返回uri列表给H5H5收到uri照片列表,并且使用前端方式展示创造价值,乐哉分享!

m0_74823947的博客 3095

航空电子系统标准全景图:ARP4754A、ARP4761、DO-178C、DO-254 的协同作用

通过 ARP4754A、ARP4761、DO-178C 和 DO-254 的相互配合,确保航空电子系统的安全性和功能性在开发过程中得到充分保障。每一个文件在不同层面发挥作用,共同构成了一个完整的、系统的开发和验证框架,确保航空电子设备达到适航要求。这些标准不仅帮助开发人员有条理地开发复杂的航空系统,还确保所有系统组件(软件和硬件)在整个生命周期内都能满足最严格的安全和可靠性要求。

qq_41854911的博客 1812

mysql delete 不走索引_Mysql 带 in 的删除操作会不走索引

今天遇到一个性能问题,最后定位到一个删除操作特别慢。delete from t_policy where id in (select policyid from t_policy_user where userid = 1067919);语句很简单explain 发现 t_policy 没有走索引。mysql> explain delete from t_policy where id ...

weixin_27885845的博客 2159

【某音电商】protobuf聊天协议逆向

某音电商私信、聊天消息protobuf协议逆向分析与解析

吴秋霖的博客 2314

mysql删除和更新不走索引

假设a表index字段设置索引,修改删除都需要关联表b的index字段,得出下列三个sql // 修改 update a set status=1 where index in (select index from b where b.id = 1) // 删除 delete from a where index in (select index from b where b.id = 1) 当...

sun 2382

ABAP 大规模数据并行处理实战,六套 Parallel Processing Framework 如何选,性能调优真正该盯住什么

如果今天真的面对那份执行 14 个小时的生产报表,我不会马上把原来的 Loop 改成 50 个aRFC。我会先用 SAT、ST12、SQL Monitor 和 HANA 侧工具确认时间到底花在哪里。如果 90% 时间其实消耗在一条低效 SQL 上,Parallel Processing 只是让 50 个 Worker 同时执行那条低效 SQL,数据库会比原来更痛苦。应该先把串行逻辑本身优化到合理水平。该做 Set-based Processing 的地方先交给 HANA。该避免SELECT。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 149

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

mysql不等于走不走索引_MySQL不走索引的情况(面试必备)

1.in(2个及以上参数) ,单列索引a,where a in (xxxx) , 如果参数是1个会用到索引, 如果参数是2个及以上不会用到索引。 或者in里是连续的参数,比如where fee in (1,2)、where fee in (1,2,3),fee是int类型并且有单列索引,依然不会使用索引.(包括int和varchar类型的字段) 2.like ‘%abc’ 或者 like‘%abc%’ 3.条件中带有表达式,比如where num/2=100 或者 substring(a,1,3)='ab’

忆水思寒的博客 3375

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

MySQL中使用IN会走索引吗

当索引使用成本 > 全表扫描的成本时就会选择全表扫描,全表rows为26,索引rows为7,为什么不用索引?结论: MySQL优化器在发现执行全表扫描效率 > 索引的效率时,会选择全表扫描。从上面三个案例可以看出案例一、案例二走了索引,案例三没有走索引。

cxSmiles的博客 1938

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

mysql not in和索引_MySQL Index--NOT IN和不等于两类操作无法走索引?

经常被问,NOT IN和<>操作就无法走索引?真想只有一个:具体问题具体分析,没有前提的问题都是耍流氓。准备测试数据:##删除测试表DROPTABLEIFEXISTStb2001;##创建测试表CREATETABLE`tb2001`(`id`int(11)NOTNULLAUTO_INCREMENTPRIMARYKEY,`c1`int(11)DEFAUL...

weixin_33497944的博客 710

总结几个mysql不走索引的问题

总结几个容易犯错误,导致不走索引的问题

weixin_42330218的博客 5192

Mysql中不走索引的常见情况以及一些建议

不走索引的情况: 1.没有查询条件,或者查询条件没有建立索引 在业务数据库中,特别是数据量比较大的表。 是没有全表扫描这种需求。 (1)、对用户查看是非常痛苦的。 (2)、对服务器来讲毁灭性的。 如何更改? 改: 1)、换成有索引的列作为查询条件 2)、或者将查询频繁的列建立索引 2.查询结果集是原表中的大部分数据,应该是25%以上 查询的结果集,超过了总数行数25%,优化器觉得就没有必要走索引了。 如何更改: 1),如果业务允许,可以使用limit控制。 2),结合业务判断,有没有更好的方式。如果没有更好

qq_40584358的博客 5724

mysql 更新索引_mysql 关联更新删除不走索引优化

关于update in不走索引的:首先select子查询形式是走索引的如下所示:select * from acct_trans_payment where autopayflag='N' and objectno in(select serialno from acct_loan where businessstatus='1' and accountingorgid='10080201'...

weixin_39859715的博客 471

mysql in 索引_关于MySQL种的in函数到底走不走索引、我和同事差点大打出手!

“我是小羊同学,一个兢兢业业的程序员”背景:有一天同事突然问我为什么加了in查询就突然变慢了、小羊脱口而出:“in不走索引!”于是就炸开了锅:in不走索引!怎么可能?但是在小羊同学脑子里、in不走索引为什么早就根深固体了?原因暂且不说,我们来探索真像。环境:Windows10、MySQL5.7、可视化工具navicat。场景1:当IN中的取值只有一个主键时我们只需要注意一个最重要的...

weixin_39935388的博客 258

mysql不等于是否走索引_MySQL Index--NOT IN和不等于两类操作无法走索引?

经常被问,NOT IN和<>操作就无法走索引?真想只有一个:具体问题具体分析,没有前提的问题都是耍流氓。准备测试数据:## 删除测试表DROP TABLE IF EXISTS tb2001;## 创建测试表CREATE TABLE `tb2001` (`id`int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,`c1`int(11) DEFAULT ...

weixin_39910043的博客 1756

MySQL索引失效原因,SQL查询语句不走索引原因

MySQL索引失效原因,SQL查询语句不走索引原因,explain关键字

prz0590的博客 3615

mysql删除条件用in无效_记mysql中delete操作中使用in不会走索引的问题

目前负责的一个项目,需要维护一个电话号码对比库,表名为phone_bak1,以下称为a表,量级为3000万条。还有另外一张表存储电话白名单,表名为phone_delete,以下称为b表,量级为3000条左右。目的呢,是要从a表中排除掉在b表中的电话号码。我直接使用以下语句:DELETE FROM phone_bak1 WHERE phone IN (SELECT phone FROM phone_...

weixin_33181210的博客 2332
上一篇: nginx应用总结--突破高并发的性能优化
下一篇: Java中创建对象的5种方式
天天
博客等级 码龄21年 219粉丝 146原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值