Spec-Zone.ru › MySQL 9.2

10.6.2 Загрузка больших объёмов данных в таблицы MyISAM

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

  • Для таблицы MyISAM вы можете использовать одновременные вставки для добавления строк в то же время, что и операторы SELECT, если в середине файла данных нет строк, которые были удалены. См. раздел 10.11.3 «Одновременные вставки».

  • Приложив некоторые усилия, можно сделать оператор LOAD DATA ещё быстрее для таблицы MyISAM, если в таблице много индексов. Воспользуйтесь следующей процедурой:

    1. Выполните оператор FLUSH TABLES или команду mysqladmin flush-tables.

    2. Используйте myisamchk --keys-used=0 -rq /path/to/db/tbl_name для удаления всех индексов для таблицы.

    3. Вставьте данные в таблицу с помощью LOAD DATA. Это не обновляет индексы и поэтому очень быстро.

    4. Если вы планируете только читать из таблицы в будущем, используйте myisampack для её сжатия. См. раздел 18.2.3.3 «Характеристики сжатых таблиц».

    5. Пересоздайте индексы с помощью myisamchk -rq /path/to/db/tbl_name. Это создаёт дерево индексов в памяти перед записью на диск, что намного быстрее, чем обновление индекса во время LOAD DATA, поскольку это избегает большого количества обращений к диску. Полученное дерево индексов также идеально сбалансировано.

    6. Выполните оператор FLUSH TABLES или команду mysqladmin flush-tables.

    LOAD DATA выполняет предложенную оптимизацию автоматически, если таблица MyISAM, в которую вы вставляете данные, пуста. Основное различие между автоматической оптимизацией и использованием этой процедуры явно заключается в том, что вы можете разрешить myisamchk выделять намного больше временной памяти для создания индекса, чем вы, возможно, захотите, чтобы сервер выделил для повторного создания индекса, когда он выполняет оператор LOAD DATA.

    Вы также можете отключить или включить неуникальные индексы для таблицы MyISAM, используя следующие операторы вместо myisamchk. Если вы используете эти операторы, вы можете пропустить операции FLUSH TABLES:

    ALTER TABLE tbl_name DISABLE KEYS;
    ALTER TABLE tbl_name ENABLE KEYS;
    
  • Для ускорения операций INSERT, выполняемых несколькими операторами для нетранзакционных таблиц, заблокируйте свои таблицы:

    LOCK TABLES a WRITE;
    INSERT INTO a VALUES (1,23),(2,34),(4,33);
    INSERT INTO a VALUES (8,26),(6,29);
    ...
    UNLOCK TABLES;
    

    Это улучшает производительность, так как буфер индексов записывается на диск только один раз, после завершения всех операторов INSERT. Обычно, количество сбросов буфера индексов будет равно количеству операторов INSERT. Явные операторы блокировки не требуются, если вы можете вставить все строки с помощью одного оператора INSERT.

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

    • Подключение 1 выполняет 1000 вставок

    • Подключения 2, 3 и 4 выполняют по 1 вставке

    • Подключение 5 выполняет 1000 вставок

    Если не использовать блокировку, подключения 2, 3 и 4 завершаются раньше 1 и 5. Если использовать блокировку, подключения 2, 3 и 4, вероятно, не завершатся раньше 1 или 5, но общее время должно быть примерно на 40% быстрее.

    Операции INSERT, UPDATE и DELETE очень быстры в MySQL, но вы можете получить лучшую общую производительность, добавив блокировки вокруг всего, что выполняет более примерно пяти последовательных вставок или обновлений. Если вы выполняете очень много последовательных вставок, вы можете выполнить LOCK TABLES, а затем UNLOCK TABLES время от времени (примерно на каждые 1000 строк), чтобы разрешить другим потокам доступ к таблице. Это всё равно приведёт к хорошему улучшению производительности.

    INSERT по-прежнему намного медленнее для загрузки данных, чем LOAD DATA, даже при использовании только что описанных стратегий.

  • Для повышения производительности для MyISAM таблиц, как для LOAD DATA, так и для INSERT, увеличьте кэш ключей, увеличив системную переменную key_buffer_size. См. раздел 7.1.1 «Настройка сервера».

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

Spec-Zone.ru

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