Как импортировать данные в таблицы InnoDB так же быстро, как MyISAM

Я новичок в MySQL, и я очень мало знаю об этом.

Проблема, с которой я сталкиваюсь, описана ниже:

Раньше у меня были данные, для которых MyISAM был движком MySQL, и импортирование на любую машину занимало около 15 минут. Однако, когда я меняю движок на InnoDB, импорт на любую машину занимает почти 90 минут. Пожалуйста, предложите мне то же самое.


person Neha    schedule 11.09.2012    source источник


Ответы (2)


Таблицы Innodb быстрее для одновременных вставок. См. Основы оптимизации производительности Innodb.

Для лучшей производительности вам необходимо настроить INNODB движок в my.cnf файле.

Предполагая, что если у вас есть 4GB RAM, попробуйте настроить файл my.cnf как:

#Innodb
innodb_buffer_pool_size = 1G
innodb_additional_mem_pool_size = 512M
innodb_log_file_size = 1G
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 30
innodb_file_per_table=1
innodb_file_format=barracuda
innodb_strict_mode=1
innodb_autoinc_lock_mode = 0

Затем перезапустите сервер MySQL.

person Omesh    schedule 11.09.2012
comment
хорошо спасибо. Потребуется некоторое время, чтобы проверить, но обязательно свяжутся с вами. - person Neha; 11.09.2012
comment
Спасибо @Omesh, все работает. Всего 10-12 мин. Большое спасибо - person Neha; 11.09.2012

У @Omesh есть несколько отличных советов, и я думаю, что они были одной из причин, по которым мой последний импорт 4,5 ГБ и 5,0 ГБ SQL из 36 миллионов строк был успешным. Я хотел получить одно место, где помогли некоторые другие дополнительные советы.

  1. Следуйте рекомендациям @Omesh по настройке MySQL.

  2. Затем посмотрите на фактический файл SQL, который вы пытаетесь импортировать. Инструмент, который мы использовали для создания дампа данных, добавил эти строки прямо перед оператором INSERT:

    /*!40000 ALTER TABLE `table_name` DISABLE KEYS */;

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

    ALTER TABLE `table_name` DISABLE KEYS;

    Будьте осторожны, если это активная база данных, которая активно используется.

  3. Сразу после операторов INSERT инструмент также добавил эту строку. Удалите также комментарии, чтобы снова включить первичные ключи:

    /*!40000 ALTER TABLE `table_name` ENABLE KEYS */;

    Опять же, это должно выглядеть так:

    ALTER TABLE `table_name` ENABLE KEYS;

  4. Прежде чем запустить оператор вставки, отключите autocommit, unique_checks и foreign_key_checks с помощью запроса:

    set autocommit=0; set unique_checks=0; set foreign_key_checks=0;

  5. Теперь запустите импорт:

    source /path/to/your/file.sql

  6. После успешного завершения импорта вы захотите зафиксировать, а затем снова включить unique_checks и foreign_key_checks:

    commit; set unique_checks=1; set foreign_key_checks=1;

Некоторые другие соображения по импорту, которые вы, возможно, захотите рассмотреть:

  • если вы используете виртуальную машину, увеличивайте доступные ресурсы (ОЗУ, количество ядер ЦП) для виртуальной машины до завершения импорта.

  • если вы используете физическую машину, возможно, одолжите немного ОЗУ с другой машины на время, достаточное для завершения импорта.

  • если возможно, используйте 2 разных диска: 1, предназначенный для чтения (источник файла SQL), и один, предназначенный для записи (где находится БД или виртуальная машина)

Надеюсь, это поможет кому-то еще!

person cmeza    schedule 01.03.2016