我有一个表示一百万行的订单表和一个表示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中编写脚本是一种选择,但可能会花费更长的时间......
由于
答案 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