首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Mysql DELETE (with NOT IN subselect)未使用索引并获取错误1205 (HY000):锁定等待超时;

Mysql DELETE (with NOT IN subselect)未使用索引并获取错误1205 (HY000):锁定等待超时。

这个错误是由于在执行DELETE语句时,使用了NOT IN子查询,并且该子查询未使用索引导致的。当数据库中的数据量较大时,这种查询方式会导致性能问题,甚至可能出现锁定等待超时的错误。

为了解决这个问题,可以采取以下几种方法:

  1. 使用JOIN替代NOT IN子查询:将NOT IN子查询转换为JOIN操作,这样可以避免使用子查询,提高查询性能。例如:
代码语言:sql
复制

DELETE FROM table1

WHERE id NOT IN (SELECT id FROM table2)

代码语言:txt
复制

可以改写为:

代码语言:sql
复制

DELETE table1

FROM table1

LEFT JOIN table2 ON table1.id = table2.id

WHERE table2.id IS NULL

代码语言:txt
复制
  1. 使用EXISTS替代NOT IN子查询:使用EXISTS子查询可以避免使用NOT IN子查询的性能问题。例如:
代码语言:sql
复制

DELETE FROM table1

WHERE NOT EXISTS (SELECT 1 FROM table2 WHERE table1.id = table2.id)

代码语言:txt
复制
  1. 优化索引:为相关的表添加适当的索引,以提高查询性能。可以通过使用EXPLAIN语句来分析查询计划,确定是否需要添加索引。

推荐的腾讯云相关产品:腾讯云数据库 MySQL

腾讯云数据库 MySQL是一种高性能、可扩展的关系型数据库服务,提供了稳定可靠的云端数据库解决方案。它具有自动备份、容灾、监控等功能,支持弹性扩容和自动负载均衡,能够满足各种规模和需求的应用场景。

产品介绍链接地址:腾讯云数据库 MySQL

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么开发人员必须要了解数据库锁?

通常来说对于一般的开发人员,在使用数据库的时候一般懂点DQL(select),DML(insert,update,delete)就够了。...在RR隔离级别下(InnoDB默认),Innodb对于行的扫描锁定都是使用此算法,但是如果查询扫描中有唯一索引会退化成只使用记录锁。为什么呢?...(HY000): Lock wait timeout exceeded; try restarting transaction 小明开启了两个事务输入了上面的语句,发现事务B居然出现了超时,小明看了一下自己明明是对...解决死锁的两个办法: 等待超时:当某一个事务等待超时之后回滚该事务,另外一个事务就可以执行了,但是这样做效率较低,会出现等待时间,还有个问题是如果这个事务所占的权重较大,已经更新了很多数据了,但是被回滚了...最后 由于篇幅有限很多东西并不能介绍全如果感兴趣的同学可以阅读《Mysql技术内幕-InnoDB引擎》第6章 以及 何大师的MySQL 加锁处理分析。作者本人水平有限,如果有什么错误,还请指正。

53520
  • 大白话聊聊Innodb的锁机制

    1205错误,如: mysql> BEGIN; Query OK,0 rows affected(0.00 sec) mysql> SELECT * FROM t WHERE a=1 FOR UPDATE...; ERROR 1205(HY000):Lock wait timeout exceeded;try restarting transaction 但是在默认情况下,Innodb不会回滚超时引发的错误异常...这里简单举个例子: 会话1 : 开启事务使用锁定读来锁定(-00, 4] 范围内的所有记录,但是一直不提交事务 mysql> BEGIN; mysql> SELECT*FROM t WHERE a<4...3; ERROR 1205(HY000):Lock wait timeout exceeded;try restarting transaction mysql>SELECT*FROM t; 结果...侧面也说明了mysql中抛出超时异常错误并不会导致当前事务结束 ---- 死锁 产生死锁必须满足以下四个条件: 互斥 占有等待 不可抢占 循环等待 解决死锁通常有以下几个思路: 死锁预防 – 破坏死锁出现的相关必要条件

    1.2K60

    MySQL 事务的隔离级别及锁操作演示

    | | 108 | cc | 20 | | 130 | dd | 25 | | 150 | ee | 30 | +-----+------+------+ 1、等值条件 对于使用唯一性索引...sec) 记录均可成功插入 对于使用非唯一性索引:加的锁为 Record lock + Gap lock 前后紧邻 gap :首先加锁 (15, 20],因为是非唯一索引,继续向后查找到第一个不满足条件的元素...> insert into tt value(140, 'de', 27); Query OK, 1 row affected (0.00 sec) 记录均可成功插入 对于不使用索引的...2、范围条件 使用唯一索引: Session 1 Session 2 开启事务,查询 id 为 108 的记录用以更新 mysql> select * from tt where id...加锁说明: <= 130 条件:存在 130 记录,加锁 (108, 130],继续向右查询到不满足条件记录 150,加锁 (130, 150]   2、使用非唯一索引 Session

    59440

    Mysql基础篇--面试锁机制

    mysql各个存储引擎使用三类锁机制,行级锁定,页级锁定,表级锁定。...,带来的系统负面影响小,所以获取锁和解锁很快,由于表一次将整个锁进行锁定,所以很好的避免了死锁的问题,但是也会引起资源竞争,并发度大减折扣。...select ...in share mode 获得共享锁,主要用于数据依存关系时,确认某行是否存在,确认没有人对这个记录进行update 和delete操作,但是如果其他事物也需要对该记录进行更新很可能造成死锁...,如果锁定某行记录后,需要进行更新操作应用,使用select .for update. innodb行锁实现方式 InnoDB行锁是通过给索引上的索引项加锁来实现的,因此InnoDB这种行锁实现特点意味着...set b ='2' where b=2; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

    40610

    Mysql锁机制分析

    Mysql几种锁定机制类型 MySQL 各存储引擎使用了三种类型(级别)的锁定机制:行级锁定,页级锁定和表级锁定。...本文重点介绍Innodb存储引擎使用的行级锁定; 两段锁协议(2PL) 两段锁协议规定所有的事务应遵守的规则: 1.在对任何数据进行读、写操作之前,首先要申请获得对该数据的封锁; 2.在释放一个封锁之后...,这样就可以保证可重复读,但是对于不出现幻读的现象无法通过锁定行数据来解决; 最终看到的现象是没有幻读的问题,同时如果对读取的数据加共享锁,更新相同数据应该会等待,上面的实例中并没有出现等待,所以mysql...; 注:type字段添加了索引,如果没有添加索引,gap锁会锁住整张表; 乐观锁 乐观锁是一种思想,认为事务间争用没有那么多,和悲观锁是相对的,乐观锁在java的并发包中大量的使用;一般采用以下方式:使用版本号...,对整个事务加锁;要么使用乐观锁的方式,如果在读多写少的系统中,乐观锁性能更好; 总结 本文首先从Mysql的悲观锁出发,然后介绍了悲观锁和事务隔离级别之间的关系,分析为什么没有使用悲观锁来实现隔离级别

    2K40

    浅析MySQL的锁机制

    Mysql几种锁定机制类型 MySQL 各存储引擎使用了三种类型(级别)的锁定机制:行级锁定,页级锁定和表级锁定。...本文重点介绍Innodb存储引擎使用的行级锁定; 两段锁协议(2PL) 两段锁协议规定所有的事务应遵守的规则: 1.在对任何数据进行读、写操作之前,首先要申请获得对该数据的封锁; 2.在释放一个封锁之后...,这样就可以保证可重复读,但是对于不出现幻读的现象无法通过锁定行数据来解决; 最终看到的现象是没有幻读的问题,同时如果对读取的数据加共享锁,更新相同数据应该会等待,上面的实例中并没有出现等待,所以mysql...; 注:type字段添加了索引,如果没有添加索引,gap锁会锁住整张表; 乐观锁 乐观锁是一种思想,认为事务间争用没有那么多,和悲观锁是相对的,乐观锁在java的并发包中大量的使用;一般采用以下方式:使用版本号...,对整个事务加锁;要么使用乐观锁的方式,如果在读多写少的系统中,乐观锁性能更好; 总结 本文首先从Mysql的悲观锁出发,然后介绍了悲观锁和事务隔离级别之间的关系,分析为什么没有使用悲观锁来实现隔离级别

    75320

    跑了4个实验,实战讲解 MySQL的行锁、间隙锁...​

    大家好,我是Tom哥~ 今天跟大家聊一聊MySQL的事务隔离,通过一些实验做了些总结。光说不练,假把式,没有经过实践就没有话语权。...T1: 事务A开启事务,执行 select * from person where expend=4000 for update; 由于 expend 字段没有索引,需要扫描全表。...接着这个话题,我们稍微扩展介绍下锁超时MySQL数据库采用InnoDB模式,默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,一旦数据库锁超过这个时间就会报错。...ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 当然,我们也可以通过命令来查看、修改这个超时时间...此时 select * from person; 可以看到新插入的记录 实验二:(事务A、B的条件字段有创建索引) T1: 事务A,开启事务,执行 select * from person where

    95520

    一文看懂Mysql

    Mysql锁的分类 Mysql锁主要从以下几个方面来分类 从性能上 Mysql锁可以分为悲观锁和乐观锁: 悲观锁:就是说不相信在整个数据处理过程中其他应用不会修改数据库中的数据,一旦获取资源就立刻加锁...从操作类型上 Mysql锁分为读锁和写锁: 读锁:也叫做共享锁,同一份数据可以加多个读锁。 写锁:也叫做排他锁,如果当前数据的写锁释放,则不能再加写锁或读锁。...循环等待条件:有A、B、C三个进程或者线程同时占用自己的资源同时又想获取别的资源 图中A占用自己资源同时请求B的资源,B占用自己资源同时请求C资源,C占用自己资源同时请求A资源,这样就行程了循环等待...错误信息 ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 此时在终端B为user_id=1...; 查询结果如图 死锁的避免 1.尽量让数据检索都通过索引完成,避免无效索引导致行锁升级成了表锁; 2.合理设计索引,尽量缩小锁的范围; 3.尽量控制事务大小,减少一次事务锁定的资源数量,缩短资源锁定时间

    27510

    MySQL里trx_mysql_thread_id为0 的事务导致大量锁等待超时该咋整

    今天巡检时突然发现有很多锁等待超时的情况,原以为是一个简单的小事,一查,结果令人深思。 1....问题现象 发现日志中出现了大量的 ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 错误 ? 2....排查过程 发现此类情况后,挑了其中一个SQL脚本手动运行了一下,发现同样报此错误 mysql> UPDATE tbname SET column_name = 2 WHERE col_id= '25945fa285904ea59cd92a73a3850ceb...' AND aYear = 2018 AND aMonth = 5; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction...检查是否还存在提交的XA事务 发现已经无正在执行事务 ? XA信息 ? 测试能否正常更新记录 # 发现也已正常 ? 再检查各日志,此类锁等待问题也未出现。 4.

    2.6K40

    mysql的事务隔离和幻读和死锁问题

    通常来说一个事务所做的修改在最终提交以前对其他事务是不可见的 持久性:一旦事务提交,则其所做的修改就会永久保存到数据库中 2.sql标准中定义了四种隔离,较低级别的隔离可以执行更高的并发,开销也更低 READ UNCOMMITTED 提交读...解决了脏读的问题,保证了同一个事务中多次读取同一个记录结果一致,但是还是会有幻读问题 SERIALIZABLE 可串行化,避免幻读问题,每一行都加锁 3.事务的隔离级别下的问题 脏读:事务可以读取别的事务提交的脏数据...不可重复读:事务不可以读取提交的数据,但是如果在另一个事务修改并提交了数据,此时可以读取到,同一事务两次相同的select结果可能会不同 幻读:事务不可以读取提交的,也不能读取修改提交的,但是当另一个事务插入新数据提交后...6.mysql 死锁: 1.两个或多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,导致恶性循环 2.解决这种问题,检测到死锁的循环依赖,立即返回一个错误 3.时间达到了锁等待超时限定,放弃锁请求...此时另外的会话执行同样的更新,会阻塞,一段时间和会报错 ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

    63820

    innodb锁机制再探

    for update; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 显示锁等待超时,证明在等待的过程中一直没有拿到相应记录的排它锁...这个结果想必大家也知道了,是因为我们这个表没有索引,所以会话1在进行获取排它锁的时候,是锁定了整个表的所有记录。...上面的例子说明了我们在使用不同的索引键(也就是id=1和id=2)的时候,锁之间不会产生等待,那么如果我们使用相同的索引键呢?...1上面获取排它锁,再在会话2上面获取相同索引键不同name值的一条记录,我们发下依旧产生了等待,如下图: 会话2 mysql> select * from t3 where id= and name=...SQL不再使用索引,所以走了全表扫描,而id=3的记录此时是被锁定的,所以产生了锁等待

    41830
    领券