我在“business”表中有300,000条记录,表“mint”中有50,000条记录,两条都有一个“phoneno”col清理(它们都是相同的格式,因此可以作为我的匹配方式)
我试图在插入之前检查它们是否在business表中,所以我在mint table上创建了另一列并运行以下查询。我们的想法是将所有空值插入“业务”。
update mint t9
inner join businesses b
on b.Telephone = t9.phoneno
set t9.bid = b.businessID
问题是查询只是永远运行,直到它超时并且从未给我任何结果,即使我知道有一些应该匹配。我做的事情显然是错的吗? --------------------------------------编辑----------- --------------------
表中相关的列是:
--- businesses-- BusinessID |电话
--- mint-- phoneno |出价
mint中的出价是我添加的空列,想法是插入到如果它存在于business表中,这样我以后可以运行查询来插入无存在的记录。
我基本上是在插入之前检查薄荷桌上的电话号码是否已经在商家中,否则我想更新它。
答案 0 :(得分:0)
有几种想法。
细分:由于超时而且很常见,请分段执行更新。我会经常这样做
update mint t9
inner join businesses b
on b.Telephone = t9.phoneno
set t9.bid = b.businessID
where t9.id between 1 and 50000;
update mint t9
inner join businesses b
on b.Telephone = t9.phoneno
set t9.bid = b.businessID
where t9.id between 50001 and 100000;
等。你明白了。原因是InnoDB将此作为隐式事务进行记录并发生超时。当我遇到数千万行时,我遇到了这个问题。
或
IODKU:使用INSERT ... ON DUPLICATE KEY UPDATE。请参阅我的一个示例here。
或
使用INSERT IGNORE ...
Insert ignore
绝对是狂野的西方方式,但如果你在使用它时小心并且你经验丰富,那就很棒。如果发生键冲突,则跳过整行。请注意,这可能不是您的使用案例。