Вставка большого количества записей в индексируемую таблицу БД

Наверняка не часто, но всё же случаются такие случаи когда надо вставить большое количество записей в индексируемую таблицу базы данных. Казалось бы и что тут такого? Но всё не так просто! Я говорю о действительно больших массивах данных. Например у нас есть таблица с колонками для которых создан индекс и мы в неё вставляем в неё более 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.

Поделиться!
Tags: , , ,

49.69MB | MySQL:53 | 0,283sec