создать индекс без блокировки БД - PullRequest
8 голосов
/ 28 июня 2010

У меня есть таблица с 10+ миллионами строк. Мне нужно создать индекс для одного столбца, однако создание индекса занимает так много времени, что я получаю блокировки для таблицы.

Может быть важно отметить, что индекс создается как часть шага 'rake db: migrate' ... Я не против создания индекса вручную, если это сработает.

ОБНОВЛЕНИЕ: Полагаю, я должен был упомянуть, что это таблица с частотой записи.

Ответы [ 3 ]

3 голосов
/ 08 июля 2013

Движок MySQL NDBCLUSTER может создавать индексы онлайн, не блокируя записи в таблицу.Однако наиболее широко используемый движок InnoDB не поддерживает эту функцию.Еще одна бесплатная и открытая БД Postgres поддерживает «одновременное создание индекса».

2 голосов
/ 28 июня 2010

вы можете предотвратить блокировку с помощью чего-то вроде этого (псевдокод):

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

Где logger - это то, что добавляет строки / обновления в вашу таблицу при регулярном использовании (например, скрипт php). Это настроит временную таблицу для использования, в то время как другая обновится.

0 голосов
/ 28 июня 2010

Постарайтесь убедиться, что индекс создан до того, как будут вставлены записи.Таким образом, индекс также будет заполняться во время заполнения таблицы.Хотя это займет больше времени, по крайней мере, оно будет готово к работе, когда задание будет выполнено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...