Оптимизация производительности Innodb - PullRequest
0 голосов
/ 02 августа 2010

Одна часть моего сайта требует массовой вставки, для загрузки этого файла в базу данных требуется около 40 минут.Я копался в Интернете и нашел несколько вещей.

  1. innodb_autoinc_lock_mode = 2 (он не будет генерировать последовательные ключи)
  2. UNIQUE_CHECKS = 0;(отключить проверку уникального ключа)
  3. FOREIGN_KEY_CHECKS = 0 (отключить проверку внешнего ключа)
  4. - log_bin = OFF отключить двоичный журнал, используемый для репликации

Проблема

Я хочу установить первые 3 варианта только для одного сеанса, т.е. во время массовой вставки.Первый вариант не работает. MySQL сообщает неизвестную системную переменную «innodb_autoinc_lock_mode».Я использую MySQL 5.0.4

Последний вариант, я хотел бы отключить его, но мне интересно, что если мне понадобится репликация позже, он просто начнет работать, если я включу его снова?

Предложения

Любые другие предложения, как улучшить массовые вставки / обновления для движка innodb?Или, пожалуйста, прокомментируйте мои выводы.

Спасибо

Ответы [ 2 ]

2 голосов
/ 03 августа 2010

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

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

Если ваша таблица больше (или почти так же велика), как буферный пул innodb, у вас проблемы;таблицу, которая не может вписаться в ram с ее индексами, нельзя вставить эффективно, так как для ее вставки необходимо выполнить READS.Это сделано для того, чтобы можно было обновить существующие индексные блоки.

Помните, что запись на диск в порядке (они в основном последовательные, и у вас есть рейдовый контроллер с батарейным питанием, верно?), Но чтение идет медленно и нужноследует избегать.

В итоге

  • Выполните вставку в небольшом количестве транзакций большого размера, скажем, по 10–100 тыс. строк или каждой.Не делайте транзакции слишком большими, иначе вы исчерпаете логи.
  • Получите достаточно памяти, чтобы ваша таблица поместилась в памяти;установите буферный пул innodb соответствующим образом (вы используете x86_64, верно?)
  • Не беспокойтесь о том, что операция занимает много времени, так как благодаря MVCC ваше приложение сможет работать с предыдущими версиямистроки, предполагающие, что он только читает.

Не вносите никаких оптимизаций, перечисленных выше, это, вероятно, пустая трата времени (не поверьте мне на слово - сравните работу операции в тестесистема в вашей лаборатории с / без них).

Отключение уникальных проверок активно опасно, так как в итоге вы получите неработающие данные.

0 голосов
/ 02 августа 2010

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

Как часто вы должны это делать? Можете ли вы загружать меньшие наборы данных чаще?

...