Какой самый простой способ добавить индекс в текущую таблицу MyISAM?

StackOverflow https://stackoverflow.com/questions/1601735

  •  05-07-2019
  •  | 
  •  

Вопрос

У меня есть таблица MyISAM, запущенная в рабочей среде на MySQL, и, выполнив несколько тестов, мы обнаружили, что можем значительно ускорить запрос, добавив определенный составной индекс.Пока все идет хорошо.Однако на самом деле я не о лучшем способе добавления этого индекса в производственную среду без длительной блокировки таблицы (в ней 27 ГБ данных, так что не так уж много, но это занимает некоторое время).

У вас есть какие-нибудь советы?Если бы это была более сложная настройка, конечно, у нас была бы живая копия всех данных на другом компьютере, и мы могли бы безопасно переключаться.К сожалению, мы еще не достигли этого, и я хотел бы ускорить выполнение этого запроса как можно скорее (это вызывает большую головную боль у клиентов).Есть ли какой-нибудь простой способ реплицировать данные, а затем выполнить трюк с заменой?Какие-то другие трюки, которых мне не хватает?

Обновить:Чтение о "Онлайновых операциях с индексами" в SQL Server вызывает у меня сильную ревность http://msdn.microsoft.com/en-us/library/ms191261.aspx :)

Спасибо!

Это было полезно?

Решение

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

чтобы настроить ведомое устройство, см. http://dev.mysql.com/doc/refman/5.0/en/replication-howto-existingdata.html

рекомендация, которую я могу дать, чтобы ускорить процесс, приведена в шаге 2. следуйте методу "Создание моментального снимка данных с использованием файлов необработанных данных".но вместо того, чтобы копировать по проводу на ведомое устройство, скопируйте в другое место на главном устройстве.и верните мастер обратно, как только копирование будет завершено и вы внесете необходимые изменения в конфигурационный файл (установите идентификатор сервера и включите двоичное ведение журнала).это сведет ваше время простоя к одной-двум минутам.после резервного копирования сервера вы можете скопировать скопированные файлы в подчиненное устройство.

как только вы запустите ведомое устройство и у вас будет проверено, что все воспроизводится правильно, вы можете приостановите работу ведомого устройства.создайте индекс на мази.когда создание индекса будет завершено, возобновите работу ведомого устройства.это приведет ведомого к ведущему.на главном сервере используйте ФЛЕШ-ТАБЛИЦУ С БЛОКИРОВКОЙ ЧТЕНИЯ.проверьте состояние ведомого устройства, чтобы убедиться, что положение журнала на главном устройстве и ведомом устройстве совпадает.если они это сделают, выключите подчиненное устройство и скопируйте файлы для этой таблицы обратно в главное.

Другие советы

Я с Рэнди.Мы были в похожей ситуации, и в MySQL есть два способа выполнить что-то подобное:

  1. Отключите сервер, пока он работает.Это то, что вы, вероятно, сделаете.Это просто, это легко, это работает.Время что-то делать?Может быть, полчаса / 45 минут, в зависимости от пропускной способности диска.Смотрите ниже.

  2. Создайте новую таблицу с новым индексом, скопируйте все данные заново, приостановите работу сервера, удалите первую таблицу, измените новое имя на старое, запустите сервер.Время простоя?может быть, 10 минут, но это действительно сложно.

Второй вариант работает и избавляет вас от времени простоя при создании индекса (если это занимает много времени).Но это занимает больше места, это сложнее (поскольку вам приходится иметь дело с новыми записями, вставленными из основной таблицы, и это, вероятно, заблокирует MyISAM при копировании данных.Удаление таблицы займет некоторое время, изменение таблицы на новое имя займет некоторое время.Просто это действительно сложно.Если бы у вас была таблица объемом 2 ТБ, это могло бы быть полезно, но для 27G это, вероятно, перебор.

Есть ли у вас второй сервер, близкий по техническим характеристикам к вашему производственному серверу?Загрузите свою самую последнюю резервную копию и проиндексируйте ее, чтобы вы знали о том, сколько времени потребуется для добавления.Затем спланируйте время простоя.

InnoDB лучше во многих вещах, но новые индексы по-прежнему блокируют таблицу.Те возможности, которыми обладает MSSQL (и я думаю, PostgreSQL) для выполнения подобных действий без блокировки, были бы великолепны.

Найдите окно с низким уровнем использования и отключите приложение во время построения индекса.Поскольку у вас нет репликации, или мультимастера, или чего-то еще, вам просто придется стиснуть зубы в этом вопросе.Увидимся в час ночи.:-)

Здесь не так уж много вы можете сделать с помощью одного сервера.

Если вы скопируете таблицу и выполните пробный запуск, по крайней мере, вы узнаете, сколько времени это займет без блокировки живой таблицы, чтобы при необходимости можно было запланировать некоторое время обслуживания или принять решение, можно ли просто нажать кнопку и оставить пользователей зависать на пару минут :)

Или запланируйте это на спокойное время...

at 04:00 /usr/bin/mysql -uXXX -pXXX -e 'alter table mytable add key(col1, col2)'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top