Мне нужно создать индекс для таблицы MySQL ~ 5M строк. Это производственная таблица, и я боюсь, что все будет полностью заблокировано, если я запущу оператор CREATE INDEX ...
Есть ли способ создать этот индекс без блокировки вставок и выборок?
Просто интересно, я не должен останавливаться, создавать индекс и перезагружать свою систему!
mysql
indexing
production
alter-table
table-locking
n0cturnal
источник
источник
Ответы:
[2017] Обновление: MySQL 5.6 поддерживает онлайн-обновления индекса.
https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html#online-ddl-index-syntax-notes
[2015] Обновление таблицы указывает на блокировку записи в MySQL 5.5
Из ответа выше:
Это **** FALSE **** (по крайней мере, для таблиц MyISAM / InnoDB, которые используют 99,999% людей. Clustered Edition отличается.)
Выполнение операций UPDATE с таблицей БЛОКИРУЕТ, пока создается индекс. MySQL действительно очень глуп в этом (и в некоторых других вещах).
Тестовый сценарий:
Мой сервер (InnoDB):
Вывод (обратите внимание, как 6-я операция блокируется на ~ 400 мсек, необходимых для завершения обновления индекса):
Против операций чтения, которые не блокируются (поменяйте местами комментарий строки в скрипте):
Обновление схемы MySQL без простоев
Таким образом, я знаю только один способ обновить схему MySql и избежать перебоев в доступности. Круговые мастера:
Это не простой способ обновить схему. Работоспособен в серьезной производственной среде; Да, это так. Пожалуйста, пожалуйста, пожалуйста, если есть более простой способ добавить индекс в таблицу MySQL без блокировки записи, дайте мне знать.
Поиск в Google привел меня к статье, в которой описывается похожая техника. Более того, они советуют пить в тот же момент в продолжении (обратите внимание, что я написал свой ответ до чтения статьи)!
Изменение схемы pt-online-схемы Percona
В статье, на которую я ссылался выше, говорится об инструменте pt-online-schema-change , который работает следующим образом:
Сам никогда не пробовал. YMMV
RDS
В настоящее время я использую MySQL через RDS Amazon . Это действительно изящный сервис, который объединяет MySQL и управляет им, позволяя добавлять новые реплики чтения с помощью одной кнопки и прозрачно обновлять базу данных для всех SKU оборудования. Это действительно удобно. У вас нет доступа к базе данных СУПЕР, поэтому вы не можете напрямую подключиться к репликации (это благословение или проклятие?). Однако вы можете использовать продвижение реплики для чтения, чтобы внести изменения в схему на ведомом устройстве, доступном только для чтения, а затем продвинуть это ведомое устройство, чтобы оно стало вашим новым главным. Точно такой же трюк, как я описал выше, но его гораздо проще выполнить. Они по-прежнему мало что делают, чтобы помочь вам с переключением. Вам необходимо перенастроить и перезапустить приложение.
источник
Как показано в этом сообщении в блоге ,
ALTER TABLE
механизм InnoDB был полностью переработан для MySQL 5.6.(Эксклюзивный обзор этой темы можно найти в документации MySQL, которую можно прочитать после обеда.)
Чтобы добавить индекс в таблицу без блокировки, приводящей к
UPDATE
/INSERT
, можно использовать следующий формат оператора:источник
Обновление MySQL 5.6 (февраль 2013 г.): теперь вы можете выполнять операции чтения и записи во время создания индекса даже с таблицами InnoDB - http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index -overview.html
и:
из http://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_fast_index_creation
источник
pt-online-schema-change - это то, что нужно, если вы действительно хотите убедиться, что миграция не приведет к остановке сайта.
Как я писал в приведенном выше комментарии, у меня есть несколько опытов с pt-online-schema-change в производственной среде. У нас есть основная таблица из 20 миллионов записей и главный -> 2 подчиненных устройства репликации только для чтения. Я выполнил как минимум десятки миграций с pt-online-schema-change от добавления нового столбца, изменения кодировки до добавления нескольких индексов. Мы обслуживаем тонны трафика во время миграции, и у нас не было никаких сбоев. Конечно, вам придется очень тщательно протестировать все сценарии перед запуском в производство.
Я попытался объединить изменения в один скрипт, чтобы pt-online-schema-change копировал данные только один раз. И будьте очень осторожны с изменением имени столбца, так как вы потеряете свои данные. Однако добавление индекса должно быть нормальным.
источник
pt-online-schema-change
. Это здорово, но является излишним для многих ситуаций, когда онлайн-возможности DDL MySQL 5.6+ уже работают нормально. Он также имеет ограничения (например, плохая игра с триггерами) и удваивает объем записи, необходимый для каждой вставки в исходную таблицу, пока происходит изменение схемы. Это облагает ваш диск значительно большим налогом, чем обычное изменение схемы в сети, и, следовательно, может «вывести из строя ваш сайт» в обстоятельствах, когда простое изменение схемы сработало бы нормально.pt-online-schema-change
это полезный инструмент, существует очень много ситуаций, в которых обычный онлайн-DDL так же хорош, и несколько случаев, когда он лучше, поэтому любые его рекомендации должны быть осторожными, а не универсальными.