Spec-Zone.ru › MySQL 5.7

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

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

  • Для таблицы MyISAM вы можете использовать одновременные вставки для добавления строк одновременно с выполнением операторов SELECT, если в середине файла данных нет строк, которые были удалены. См. раздел 8.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 для ее сжатия. См. раздел 15.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. См. раздел 5.1.1 «Настройка сервера».

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

Spec-Zone.ru

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