Какой самый простой способ добавить индекс для живой таблицы myISAM? - PullRequest
0 голосов
/ 21 октября 2009

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

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

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

Спасибо!

Ответы [ 4 ]

3 голосов
/ 21 октября 2009

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

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

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

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

1 голос
/ 21 октября 2009

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

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

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

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

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

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

0 голосов
/ 21 октября 2009

Мало что можно сделать с одним сервером здесь.

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

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

at 04:00 /usr/bin/mysql -uXXX -pXXX -e 'alter table mytable add key(col1, col2)'
0 голосов
/ 21 октября 2009

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

...