Назад | Перейти на главную страницу

Быстрее ли создавать индексы до или после загрузки данных в MySQL?

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

Целевая база данных действительно нуждается в первичных ключах и нескольких других индексах в своих таблицах, но не во время загрузки данных. В настоящее время я загружаю все данные, а затем создаю индексы. Однако создание индекса занимает довольно много времени - 30 минут из 5 с половиной часов работы моего загрузчика данных.

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

Может кто подскажет точно, какой способ быстрее? FWIW, я запускаю MySQL 5.1 с таблицами InnoDB.

Ваша интуиция верна AFAIK. Стол заказан? http://kevin.vanzonneveld.net/techblog/article/improve_mysql_insert_performance/ Были предложения по оптимизации объемных вставок.

Вот о чем еще нужно подумать.

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

ALTER TABLE myisamtabletoload DISABLE KEYS;
INSERT INTO myisamtabletoload ...;
ALTER TABLE myisamtabletoload ENABLE KEYS;

Все первичные и уникальные ключи заполняются и упорядочиваются во время INSERT.

После выполнения ENABLE KEYS все неуникальные индексы создаются с помощью сортировки.

К сожалению, DISABLE KEYS и ENABLE KEYS не работают для InnoDB из-за кластеризованных структур ключей под его капотом.