我有一个包含2600万条记录的表,并且想要添加一些列,所以我用添加的列创建了一个新表,然后做了一个
INSERT INTO table_new SELECT (field1,field2) FROM table_old
我被告知这比尝试将列添加到现有表中更快。
在任何情况下,有2600万条记录,这需要很长时间,并且使用MySQL Workbench监视进程,我看到该进程仍在运行(40小时并且正在计数)。
但是,当我执行SELECT * FROM table_new
时,我还没有看到任何记录。使用InnoDB,在我看到新表中的2600万条记录之前,是否要等到整个交易完成?或者我应该实时看到逐个插入的记录吗?
我正在查看状态变量Innodb_rows_inserted
,它之前在昨天稳步上升,而且我认为应该代表我从0到2600万的进度,但现在它仍然稳定在1400万而不是实时增加:S,但我的INSERT INTO SELECT
进程仍在运行。我担心出事了。
如何检查一切是否按预期工作?
答案 0 :(得分:0)
如果您想在运行时跟踪大型提交的进度,可以将INSERT作为一个过程运行。
这会增加一点开销,但您可以在每个x记录之后添加一个提交点(例如,在下面的示例中,每100条记录后提交一次)
注意:这是用Oracle编写的,因此您的里程可能会有所不同,但希望您能够根据自己的需要进行翻译。
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;
/