我有一个巨大的订单表,我需要清除具有某些 city_id 的订单表。我创建了一个存储过程,它接受 1 个参数并一次删除 10,000 条记录,并且运行良好。 city_id 来自使用此查询的表:
mysql> SELECT city_id from cities where state_name in ('NY', 'TX');
问题是我必须为结果集中的每个 city_id 手动运行数十个存储过程,如下所示:
mysql> CALL purge_orders_by_city(12);
mysql> CALL purge_orders_by_city(16);
mysql> CALL purge_orders_by_city(28);
mysql> CALL purge_orders_by_city(39);
etc...
如何创建一个存储过程来迭代城市表,并将 city_id 传递给 purge_orders_by_city() 存储过程?
我已经尝试过常规的“按 id 限制 10000 从 city_id in (1, 2, 3, 4...) order by id limit 10000 的订单中删除”,但每个 10K 批次的执行时间随着执行而变得更长。例如,前几批每批仅花费 15 秒。到第 300,000 个批次时,已经需要 30 秒。使用“where city_id = 1”将批次限制为一个 city_id 会更快,即使我必须一次运行 1 个 city_id。
您必须创建另一个存储过程来运行 purge_orders_by_city 过程的循环。
something like this
-- existing varaibles
DECLARE cur_city_id CURSOR FOR SELECT city_id from cities where state_name in ('NY', 'TX');
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur_city_id ;
read_loop: LOOP
FETCH cur_city_id INTO v_city_id;
IF done THEN
LEAVE read_loop;
END IF;
CALL purge_orders_by_city(v_city_id);
END LOOP;
CLOSE cur_city_id