>我有一个包含 2600 万条记录的表,并希望向其添加一些列,所以我用添加的列创建了一个新表,然后做了一个 INSERT INTO table_new SELECT (field1,field2) FROM table_old
我被告知这比尝试向现有表添加列更快。
无论如何,有 2600 万条记录,这需要很长时间,并且使用 MySQL 工作台监控进程,我看到进程仍在运行(40 小时并且还在增加)。
但是,当我做SELECT * FROM table_new
时,我还没有看到任何记录。使用 InnoDB,是否要等到整个事务完成,才能在新表中看到 2600 万条记录中的任何一条?还是我应该实时查看逐个插入的记录?
我正在查看状态变量 Innodb_rows_inserted
,它以前在昨天稳步计数,我认为应该代表我从 0 到 2600 万的进展,但现在它稳定在 1400 万并且不再实时增加:S,但我的INSERT INTO SELECT
过程仍在运行。我担心出什么问题。
如何检查一切是否按预期工作?
大型提交运行时跟踪其进度,则可以将 INSERT 作为过程运行。
这会增加一点开销,但您可以在每 x 条记录之后添加一个提交点(例如,在下面的示例中,每 100 条记录后提交)
注意:这是在考虑甲骨文的情况下编写的,因此您的里程可能会有所不同,但希望您能够翻译以满足您的需求。
declare
v_counter NUMBER := 0;
cursor c_table_old is
select *
from table_old;
begin
FOR l_table_old in c_table_old LOOP
insert into table_new (field1, field2)
values (l_table_old.field1,
l_table_old.field2);
v_counter := v_counter + 1;
IF (MOD(v_counter, 100) = 0) THEN
commit;
END IF;
END LOOP;
end;
/