MySQL将值从一个大表复制到另一个大表(数百万行)

时间:2017-06-19 15:58:53

标签: php mysql

我有一个表示一百万行的订单表和一个表示750k行的客户表。所有订单都有customer_id。出于某种原因,我需要将customer表中的字段添加到订单表中。所以,我知道这样的事情会起作用:

UPDATE orders o INNER JOIN customers c ON (o.customer_id = c.id) SET o.customer_field = c.field WHERE c.field IS NOT NULL and c.field != '';

然而,根据我的理解,这样做INNER JOIN会创建一个非常庞大的临时表,所有订单都与客户匹配。是对的吗?如果是这样,那肯定不是一个好方法吗?还是会好的?如果没有,是否有更好/更有效的方式,可能通过以某种方式分页JOINS?

在PHP中编写脚本是一种选择,但可能会花费更长的时间......

由于

1 个答案:

答案 0 :(得分:1)

试试这个循环。我手头没有解析器,但所有逻辑都在这里

--Assuming o.ID >=1

declare @step int
declare @batch_size int
declare @max_rows int
set @step =1
set @batch_size = 100000
set @max_rows = (SELECT MAX(id) FROM orders)


LOOP

UPDATE orders o
SET o.customer_field = c.field
INNER JOIN customers c ON (o.customer_id  =c.id)   
WHERE len(c.field) >=0
AND o.id between (@step-1)*batch_size +1 and @step*batch_size

if @max_rows < @step*@batch_size 
   then 
      LEAVE LOOP
   END IF;

set @step = @step+1

END LOOP