我有一个非常大的临时表,我希望一次处理几行到索引表中。
由于编写索引的时间导致目标表上的锁定时间比指定的时间长,因此我通常会一次执行几行100k行。我使用唯一列的顺序选择行以及限制和偏移来选择一个值以在登台表上重复流失。
SELECT unique_id INTO @cut_off FROM staging_X ORDER BY unique_id;
START TRANSACTION;
INSERT INTO my_indexed_table ([columns])
SELECT columns FROM staging_X where unique_id <= @cut_off;
DELETE FROM my_indexed_table WHERE unique_id <= @cut_off;
COMMIT;
我已经成功地为几个表做了这个,但现在面对我列表中最大的表。这个行超过1亿行。它由Apache Spark创建,因此我无法控制设置分区或任何内容。
我一直想知道我是否可以在INSERT和DELETE查询中使用带有常量值的LIMIT而不尝试对数据进行排序。但我找不到任何声明行将以可靠的可重复顺序返回的内容。
作为参考,我使用MySQL 5.7和INNODB表。
更新
根据要求,数据如下:
每天大约有3000万行,我只能每周处理一次。我可以限制数据的提供创建具有有限行数的多个表(我不能创建分区),但理想情况下,我只是想能够可靠地获取前N行,将它们插入其他地方并删除它们,而不是试图对数据进行排序。