创建索引而不锁定DB

时间:2010-06-28 16:45:33

标签: mysql rake ruby-on-rails

我有一张超过10万行的表格。我需要在单个列上创建一个索引,但是,索引需要很长时间来创建,我会对表进行锁定。

可能需要注意的是,索引是作为“rake db:migrate”步骤的一部分创建的......如果可行的话,我不会手动创建索引。

更新:我想我应该提到这是一个经常写表。

3 个答案:

答案 0 :(得分:3)

MySQL NDBCLUSTER引擎可以在线创建索引而无需锁定对表的写入。但是,使用最广泛的InnoDB引擎不支持此功能。另一个免费和开源的DB Postgres支持“同时创建索引”。

答案 1 :(得分:2)

你可以用这样的东西阻止阻塞(伪代码):

create table temp like my_table;
update logger to log in temp;
alter table my_table add index new_index;
insert into my_table select * from temp;
update logger to log in my_table;
drop table temp

记录器可以在常规使用中为表添加行/更新(例如:php脚本)。这将设置一个临时表,以便在另一个更新时使用。

答案 2 :(得分:0)

尝试确保在插入记录之前创建索引。这样,索引也将在表的填充期间填充。虽然这需要更长的时间,但至少在rake任务完成后它就可以了。