如果数据存在于另一个表中,则从大型MySQL表中删除

如果数据存在于另一个表中,则从大型MySQL表中删除,mysql,Mysql,我知道这个以前有人问过,但这个有点扭曲。 我收到了一封电子邮件,表1有150万条记录 我需要对照另一个表table2进行检查,该表有大约80K条记录,我需要从表1中删除电子邮件地址与表1匹配的记录 我试着从表1中删除,在表2中选择电子邮件中的电子邮件,但MySQL抛出了一个错误。 错误代码:1205 超过锁定等待超时;尝试重新启动事务 50404毫秒 我无法使用PHP,因为我还有大约5个类似于表2的表需要从表1中筛选 我想在MySQL中这样做,因为这是我们最安全的路线,但我想要一个可以在一小时内

我知道这个以前有人问过,但这个有点扭曲。 我收到了一封电子邮件,表1有150万条记录

我需要对照另一个表table2进行检查,该表有大约80K条记录,我需要从表1中删除电子邮件地址与表1匹配的记录

我试着从表1中删除,在表2中选择电子邮件中的电子邮件,但MySQL抛出了一个错误。 错误代码:1205 超过锁定等待超时;尝试重新启动事务 50404毫秒

我无法使用PHP,因为我还有大约5个类似于表2的表需要从表1中筛选

我想在MySQL中这样做,因为这是我们最安全的路线,但我想要一个可以在一小时内运行几分钟并给出结果的查询

提前谢谢


附言:还剩1天交货时间:-

您可以提高my.cnf中的等待超时值:

innodb_lock_wait_timeout = 250
这样试试看。在条款中可能会非常缓慢

delete table1.*
from table1
left join table2
on table1.email = table2.mail
where table2.mail is not null

更新这个答案,因为我终于做到了

我删除了电子邮件的全文索引,并在电子邮件上创建了一个新的100字符索引。 我认为在查询中使用simple来匹配表 整个过程只花了几秒钟而不是几分钟/小时。 谢谢你的帮助。我仍然很感激


非常感谢

您是否尝试在查询结束时使用LIMIT?您必须运行它几次,但它不应该超时。我尝试了限制,但即使有限制,删除每条记录也需要大约1秒的时间。e、 g.此查询从表1中删除,其中存在从表2中选择1,其中table1.email=table2.email LIMIT 100您有任何带有级联删除的外键吗?请显示索引并解释。为什么不在没有where的情况下进行内部连接?好问题:我一直使用left-join进行此类查询,但我等待其他意见。我必须测试性能差异。尝试在电子邮件字段的表1中添加索引。这一个有效。代码从存在的表1中删除从表2中选择1,其中table2.email=table1.email LIMIT 100,但我可以在子查询中使用LIMIT吗。一定有办法解决这个问题,对吗?我们是否有办法在游标中实现这些?当然,但如果其他方法都失败了,它可能会有所帮助。在wamp和my.ini上本地运行也有这行注释。