Ключи включения таблицы изменения MySQL не так быстро, как обещали - PullRequest
5 голосов
/ 04 марта 2011

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

Существует два способа ввода данных:

Метод 1

load data infile ...;

Метод 2

alter table disable keys;
load data infile ...;
alter table enable keys;

Если я начинаю с пустой таблицы, для 2 миллиардов записей метод 1 принимаетоколо 60 часов (по оценкам, может быть больше), в то время как метод 2 занимает 12 часов, чтобы вставить данные, и 3 часа, чтобы восстановить ключи.Пока все хорошо.

Однако, если у меня уже есть 2 миллиарда записей и я пытаюсь вставить дополнительные 5 миллионов, метод 1 занимает около 3 часов, а метод 2 - 30 минут, чтобы вставить данные, ицелых 7 часов воссоздавая ключи.Я подтвердил, что во время всей регенерации ключа он использовал Repair by sorting, поэтому он не вернулся к Repair with keycache.

Интересно, почему это так.MySQL утверждает, что отключение ключей очень хорошо для вставки больших объемов данных, но это, очевидно, зависит от контекста.Если он собирается восстановить все ключи с нуля, почему это не займет около 3 часов, как, например, когда я начал с пустой таблицы?или если он вставляет ключи один за другим, почему это не занимает около 3 часов, что и требуется для метода 1?

Комментарии приветствуются

Ответы [ 3 ]

1 голос
/ 04 марта 2011

Время может отличаться, очевидно, немного.

http://www.mysqlperformanceblog.com/2007/07/05/working-with-large-data-sets-in-mysql/

1 голос
/ 04 марта 2011

Если вы работаете с миллиардами записей и используете MySQL 5.1 или выше, вы можете обнаружить, что разбиение повысит производительность ... при работе с индексами в многораздельной таблице индексы также многораздельно ; и поскольку каждый индекс строится только на части / подмножестве ваших общих данных, затраты на перестроение при сортировке должны быть значительно меньше.

0 голосов
/ 04 марта 2011

«не так быстро, как обещали» - ну, у вас есть 5000000 записей, конечно, это займет немного больше времени, чем вставка 20 записей.

  • При первом способе он немного меняет индексы при каждой вставке строки, поэтому они всегда согласуются с данными.
  • С помощью второго метода выполняется перестройка индексов путем сортировки всей таблицы (2005000000 строк) - это означает, что он перемещает большое количество существующих данных индекса туда и обратно ( скорость диска, скорее всего, станет узким местом), которая зависит от 1) количества существующих данных и 2) количества новых данных.
  • Вы можете использовать метод 3: сбросить ключи перед второй вставкой (это также может занять некоторое время) и восстановить их после. Я подозреваю, что время будет похоже на воссоздание ключей после начальной вставки

Скорости, которые вы описываете, вполне разумны ИМХО - просто используйте самый быстрый метод.

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