Сколько времени нужно, чтобы построить индекс с помощью ALTER TABLE в MySQL?
Автор вопроса: Richard HОтветов: 3
Это может быть немного похоже на вопрос о длине строки, но статистика такова:
Двухъядерный Intel 4 ГБ оперативной памяти
Таблица с 8 миллионами строк, ~ 20 столбцов, в основном varchars с первичным идентификатором auto_increment
Запрос: ALTER TABLE my_table ADD INDEX my_index (my_column);
my_column - это varchar (200)
Хранилище MyISAM
Порядок величины должен быть 1 минута, 10 минут, 100 минут?
Спасибо
Редактировать: Хорошо, это заняло 2 часа 37 минут по сравнению с 0 часами 33 минутами на машине с меньшими характеристиками, с практически идентичными настройками. Я понятия не имею, почему это заняло так много времени. Единственная возможность состоит в том, что рабочая машина HD заполнена на 85%, а 100 ГБ свободно. Должно быть достаточно, но я думаю, это зависит от того, как распределяется это свободное пространство.
Сколько времени это занимает в тестовой среде? Нагрузка на сервер была бы единственным, что вы не могли учесть, но я не мог предположить, что это займет больше минуты. OMG Ponies 15.02.2010
сейчас я просто работаю в среде разработчиков. Я ожидал около 5 минут. 30 минут спустя еще ничего не сделано. Кроме того, в верхней части mysqld выглядит очень неактивным, в то время как в dev я вижу 60% + процессор. Richard H 15.02.2010
Проверьте, не закончилось ли у вас место на диске, в частности, во временном каталоге mysql. nos 15.02.2010
Если вы просто добавляете один индекс, это займет около 10 минут. Однако это займет 100 минут или больше, если у вас нет этого индексного файла в памяти.
Ваши 200 varchar с 8 миллионами строк займут максимум 1,6 ГБ, но со всеми накладными расходами на индексацию это займет около 2-3 ГБ. Но это займет меньше, если большинство строк меньше 200 символов. (Возможно, вы захотите сделать выбор sum(length(my_column)), чтобы узнать, сколько места требуется.)
Вы хотите отредактировать файл /etc/mysql/my.cnf. Поиграйте с этими настройками;
myisam_sort_buffer_size = 100M
sort_buffer_size = 100M
Удачи.
Ответ 2 · рейтинг 2 · Quassnoi
В моей тестовой базе данных MusicBrainz таблица track создает PRIMARY KEY и три вторичных индекса за 25 минут:
Машина Intel(R) Core(TM)2 CPU 6400 @ 2.13GHz с 2Gb RAM, Fedora Core 12, MySQL 5.1.42.
@@myisam_sort_buffer_size is 256M.
Ответ 3 · рейтинг 1 · DRapp
Кроме того, если вам когда-нибудь понадобится создать несколько индексов, лучше всего создавать все индексы за один вызов, а не по отдельности... Причина: в основном кажется, что нужно переписать все страницы индекса, чтобы они включали ваш новый индекс с тем, что у него было. Я узнал об этом в прошлом, имея таблицу размером более 2 гигов, и мне нужно было построить на ней около 15 индексов. Построение всех по отдельности продолжало постепенно увеличиваться во времени между каждым индексом. Тогда попытка все сразу была чуть больше, чем около 3 отдельных индексов, поскольку он строил все для каждой записи и записывал все сразу, вместо того, чтобы продолжать перестраивать страницы.