我有一张超过10万行的表格。我需要在单个列上创建一个索引,但是,索引需要很长时间来创建,我会对表进行锁定。
可能需要注意的是,索引是作为“rake db:migrate”步骤的一部分创建的......如果可行的话,我不会手动创建索引。
更新:我想我应该提到这是一个经常写表。
答案 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任务完成后它就可以了。