Spec-Zone.ru › MySQL 9.2

10.5.5 Загрузка больших данных в таблицы InnoDB

Эти советы по производительности дополняют общие рекомендации по быстрому выполнению операций вставки в Раздел 10.2.5.1, «Оптимизация операторов INSERT».

  • При импорте данных в InnoDB выключите режим автокоммита, так как он выполняет сброс журнала на диск для каждой операции вставки. Для отключения автокоммита во время операции импорта заключите её в операторы SET autocommit и COMMIT:

    SET autocommit=0;
    ... SQL import statements ...
    COMMIT;
    

    Опция mysqldump --opt создаёт файлы дампов, которые быстро импортируются в таблицу InnoDB, даже без заключения их в операторы SET autocommit и COMMIT.

  • Если у вас есть UNIQUE ограничения на вторичных ключах, вы можете ускорить импорт таблиц, временно отключив проверки уникальности во время сессии импорта:

    SET unique_checks=0;
    ... SQL import statements ...
    SET unique_checks=1;
    

    Для больших таблиц это экономит много операций ввода-вывода на диск, потому что InnoDB может использовать буфер изменений для записи записей вторичных индексов в пакетном режиме. Убедитесь, что данные не содержат дублирующихся ключей.

  • Если у вас есть FOREIGN KEY ограничения в ваших таблицах, вы можете ускорить импорт таблиц, отключив проверки внешних ключей на время сессии импорта:

    SET foreign_key_checks=0;
    ... SQL import statements ...
    SET foreign_key_checks=1;
    

    Для больших таблиц это может существенно сэкономить дисковые операции ввода-вывода.

  • Используйте синтаксис многострочной вставки INSERT, чтобы уменьшить нагрузку на обмен данными между клиентом и сервером, если вам нужно вставить много строк:

    INSERT INTO yourtable VALUES (1,2), (5,5), ...;
    

    Этот совет справедлив для вставки в любые таблицы, а не только в InnoDB таблицы.

  • При выполнении массовых вставок в таблицы с автоинкрементными столбцами установите innodb_autoinc_lock_mode в 2 (перемежающиеся) вместо 1 (последовательные). Подробности см. в Разделе 17.6.1.6, «Обработка AUTO_INCREMENT в InnoDB».

  • При выполнении массовых вставок быстрее вставлять строки в PRIMARY KEY порядке. InnoDB таблицы используют , что делает относительно быстрым использование данных в порядке PRIMARY KEY. Выполнение массовых вставок в PRIMARY KEY порядке особенно важно для таблиц, которые не полностью помещаются в пул буферов.

  • Для оптимальной производительности при загрузке данных в InnoDB FULLTEXT индекс выполните эти шаги:

    1. Определите столбец FTS_DOC_ID во время создания таблицы, типа BIGINT UNSIGNED NOT NULL, с уникальным индексом под названием FTS_DOC_ID_INDEX. Например:

      CREATE TABLE t1 (
          FTS_DOC_ID BIGINT unsigned NOT NULL AUTO_INCREMENT,
          title varchar(255) NOT NULL DEFAULT '',
          text mediumtext NOT NULL,
      PRIMARY KEY (`FTS_DOC_ID`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
      
      CREATE UNIQUE INDEX FTS_DOC_ID_INDEX on t1(FTS_DOC_ID);
      
    2. Загрузите данные в таблицу.

    3. Создайте индекс FULLTEXT после загрузки данных.

    Примечание

    При добавлении столбца FTS_DOC_ID во время создания таблицы убедитесь, что столбец FTS_DOC_ID обновляется при обновлении столбца FULLTEXT индексированного столбца, так как FTS_DOC_ID должен монотонно увеличиваться при каждой операции INSERT или UPDATE. Если вы решите не добавлять FTS_DOC_ID во время создания таблицы и хотите, чтобы InnoDB управлял идентификаторами DOC за вас, InnoDB добавляет FTS_DOC_ID как скрытый столбец при следующем вызове CREATE FULLTEXT INDEX. Однако этот подход требует перестроения таблицы, что может повлиять на производительность.

  • При загрузке данных в новый экземпляр MySQL рассмотрите возможность отключения логирования повторений с помощью синтаксиса ALTER INSTANCE {ENABLE|DISABLE} INNODB REDO_LOG. Отключение логирования повторений помогает ускорить загрузку данных, избегая записи в журнал повторений. Дополнительная информация — в Разделе «Выключение логирования повторений».

    Предупреждение

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

  • Используйте MySQL Shell для импорта данных. Утилита параллельного импорта таблиц MySQL Shell util.importTable() обеспечивает быстрый импорт данных в реляционную таблицу MySQL для больших файлов данных. Утилита загрузки дампов MySQL Shell util.loadDump() также предлагает возможности параллельной загрузки. Смотрите .

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/optimizing-innodb-bulk-data-loading.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API