在mysql

时间:2016-07-27 21:02:01

标签: mysql

我在“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表中,这样我以后可以运行查询来插入无存在的记录。

我基本上是在插入之前检查薄荷桌上的电话号码是否已经在商家中,否则我想更新它。

1 个答案:

答案 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绝对是狂野的西方方式,但如果你在使用它时小心并且你经验丰富,那就很棒。如果发生键冲突,则跳过整行。请注意,这可能不是您的使用案例。