Какой самый простой способ добавить индекс для живой таблицы myISAM?

0

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

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

ОБНОВЛЕНИЕ: Чтение "Операций онлайн-индексирования" в SQL Server делает меня очень ревнивым http://msdn.microsoft.com/en-us/library/ms191261.aspx:)

Спасибо!

  • 0
    Можете ли вы на некоторое время ограничить доступ для записи в базу данных?
Теги:
indexing
myisam

4 ответа

3
Лучший ответ

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

для настройки ведомого устройства, см. http://dev.mysql.com/doc/refman/5.0/en/replication-howto-existingdata.html

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

как только у вас будет ведомое устройство, и вы проверили, что все правильно реплицируется, вы можете приостановить подчиненное устройство. создайте индекс на масле. когда создание индекса завершено, возобновите ведомое устройство. это поймает раба до мастера. на главном, используйте FLUSH TABLE WITH READ LOCK. проверьте состояние подчиненного устройства, чтобы убедиться, что позиция журнала на главном и подчиненном устройствах соответствует. если они это сделают, выключите ведомое устройство и скопируйте файлы для этой таблицы обратно в мастер.

1

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

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

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

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

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

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

0

Не так много можно сделать с одним сервером здесь.

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

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

at 04:00 /usr/bin/mysql -uXXX -pXXX -e 'alter table mytable add key(col1, col2)'
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню