У меня есть процесс репликации данных, который удаляет и воссоздает несколько таблиц в целевой базе данных, а затем загружает их с данными из исходной базы данных (выполняется на другом хосте, но это не имеет значения для рассматриваемого вопроса).
Целевая база данных действительно нуждается в первичных ключах и нескольких других индексах в своих таблицах, но не во время загрузки данных. В настоящее время я загружаю все данные, а затем создаю индексы. Однако создание индекса занимает довольно много времени - 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 из-за кластеризованных структур ключей под его капотом.