MySQL отключить и включить ключи - PullRequest
26 голосов
/ 21 ноября 2011

В моей базе данных MySQL есть таблица с 2 000 000 записей.Теперь я хотел бы вставить еще 6 000 000 новых записей в эту таблицу.

Чтобы ускорить вставку, я, хотя и должен был бы использовать ключи отключения / включения, например:

ALTER TABLE cars DISABLE KEYS;

INSERT INTO cars ...
...
...
INSERT INTO cars ...

ALTER TABLE search_all_values ENABLE KEYS;

OPTIMIZE TABLE cars;

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

Хотя в моем случае у меня уже есть 2 000 000 записей в таблице, когда ENABLE KEYS, mysql заново создаст все индексы (включая существующие записи и новые добавленные записи), которые, вероятно, не приведут кэффективная вставка данных в целом в моем случае. Поскольку повторное создание всех индексов займет много времени , и, вероятно, так и будет OPTIMIZE TABLE

Я хотел бы спросить ваше мнение о том, прав ли я и как мне получить эффективную вставку данныхв моем случае?

Ответы [ 2 ]

49 голосов
/ 07 августа 2012

Вы определенно должны выбрать свой подход в зависимости от типа двигателя ... оптимизация для MyISAM или для InnoDB .

Недавно мы провели сравнительный анализ, сравнивающий различные способы вставки данных и измерили время от момента до вставки и до полного восстановления всех индексов. Он был на пустой таблице, но мы использовали до 10 миллионов строк.

MyISAM с LOAD DATA INFILE и ALTER TABLE ... ENABLE/DISABLE KEYS выиграл руки в нашем тесте (в системе Windows 7, MySQL 5.5.27 - теперь мы пробуем его в системе Linux).

ENABLE и DISABLE KEYS не работает для InnoDB, это только MyISAM. Для InnoDB используйте SET AUTOCOMMIT = 0; SET FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;, если вы уверены, что ваши данные не содержат дубликатов (не забудьте установить их на 1 после завершения загрузки).

Не думаю, что вам нужно OPTIMIZE TABLE после массовой вставки - строки MySQL упорядочены путем вставки, и индекс все равно перестраивается. Никакой «дополнительной фрагментации» при выполнении массовой вставки нет.

Не стесняйтесь комментировать, если я допустил фактические ошибки.

ОБНОВЛЕНИЕ: В соответствии с нашими более свежими и полными результатами испытаний, совет по ОТКЛЮЧИТЬ / ВКЛЮЧИТЬ ключи неправильный.

У коллеги была программа, которая выполняла несколько различных тестов - таблицу с предварительно заполненным и пустым InnoDB / MyISAM, скоростью выделения и вставки с LOAD DATA LOCAL, INSERT INTO, REPLACE INTO и UPDATE, на «плотном» и « фрагментированные "таблицы (я не совсем уверен, как, я думаю, что это было в порядке DELETE FROM ... ORDER BY RAND() LIMIT ... с фиксированным начальным значением, поэтому оно все еще сопоставимо), а также включенные и отключаемые индексы.

Мы протестировали его с множеством разных версий MySQL (5.0.27, 5.0.96, 5.1.something, 5.5.27, 5.6.2) в Windows и Linux (хотя в обеих ОС они не совпадали). MyISAM выиграл только тогда, когда стол был пуст. InnoDB был быстрее, когда данные уже присутствовали, и в целом работал лучше (за исключением места на жестком диске - MyISAM меньше на диске).

Тем не менее, чтобы по-настоящему извлечь из этого пользу, вы должны протестировать его самостоятельно - с разными версиями, разными настройками конфигурации и большим терпением - особенно в отношении странных несоответствий (5.0.97 был намного быстрее, чем 5.5.27 с тем же конфиг - мы все еще ищем причину). Что мы обнаружили, так это , что DISABLE KEYS и ENABLE KEYS почти бесполезны и иногда вредны, если вы не начинаете с пустой таблицы.

1 голос
/ 21 ноября 2011

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

Я бы пошел на последнее, не отключая ваши ключи. Если вы боитесь чрезмерной нагрузки на сервер, вы можете попробовать вставить пакеты, например, только определенное количество вставок в минуту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...