Наверняка не часто, но всё же случаются такие случаи когда надо вставить большое количество записей в индексируемую таблицу базы данных. Казалось бы и что тут такого? Но всё не так просто! Я говорю о действительно больших массивах данных. Например у нас есть таблица с колонками для которых создан индекс и мы в неё вставляем в неё более 10k новых строк одновременно. Естественно используем SQL оператор INSERT с вариацией множественной вставки. Все знают, что такая громадная операция замедлит работу БД т.к. после каждой строки вставки будут автоматически создаваться индексы, т.е. вся таблица будет сканироваться для обновления информации в индексе.
Естественно это не есть хорошо ведь проще сначала занести весь массив данных в таблицу, т.е. вставить все строки, а потом обновить индекс. Собственно так и делается, перед вставкой в таблице отключается индекс, а после вставки данных индекс снова включается. Естественно для этого есть специализированные операторы SQL. Выглядит это всё примерно так:
-- Отключаем индексы (только для MyISAM Engine) ALTER TABLE `table_name` DISABLE KEYS; -- Произведём добавление записей INSERT IGNORE INTO `table_name` VALUES (value1, value2, value3, ...), (value1, value2, value3, ...), ... (value1, value2, value3, ...); -- Включим индексы (только для MyISAM Engine) ALTER TABLE `table_name` ENABLE KEYS;
Вот собственно и всё. Сначала принудительно явно отключаем индексы таблицы, добавляем большой массив данных (более 10k строк), и после добавления уже включаем снова индексы. Т.е. сканирование таблицы и обновление индексов будет сделано один раз. Обновление будет протекать значительно быстрее. Естественно подобные «фокусы» работают только на движках таблиц MyISAM.