8.6.2 Нагрузка данных в MyISAM таблицах большими объёмами
Эти советы по производительности дополняют общие рекомендации по быстрым вставкам в разделе 8.2.4.1 «Оптимизация операторов INSERT».
Для таблицы
MyISAMвы можете использовать одновременные вставки для добавления строк одновременно с выполнением операторовSELECT, если в середине файла данных нет строк, которые были удалены. См. раздел 8.11.3 «Одновременные вставки».-
При дополнительных усилиях, возможно сделать оператор
LOAD DATAещё быстрее для таблицыMyISAM, когда у таблицы много индексов. Используйте следующую процедуру:Выполните оператор
FLUSH TABLESили команду mysqladmin flush-tables.Используйте myisamchk --keys-used=0 -rq
/path/to/db/tbl_name, чтобы удалить все использование индексов для таблицы.Вставьте данные в таблицу с помощью
LOAD DATA. Это не обновляет индексы и поэтому очень быстро.Если вы планируете только читать из таблицы в будущем, используйте myisampack для ее сжатия. См. раздел 15.2.3.3 «Характеристики таблиц в сжатом формате».
Пересоздайте индексы с помощью myisamchk -rq
/path/to/db/tbl_name. Это создаёт дерево индекса в памяти перед записью его на диск, что гораздо быстрее, чем обновление индекса во времяLOAD DATA, потому что это избегает множества обращений к диску. Результирующее дерево индекса также идеально сбалансировано.Выполните оператор
FLUSH TABLESили команду mysqladmin flush-tables.
LOAD DATAвыполняет предшествующую оптимизацию автоматически, если таблицаMyISAM, в которую вы вставляете данные, пуста. Основное различие между автоматической оптимизацией и использованием процедуры явно заключается в том, что вы можете позволить myisamchk выделить гораздо больше временной памяти для создания индекса, чем вы, возможно, захотите, чтобы сервер выделил для пересоздания индекса при выполнении оператораLOAD DATA.Также можно отключить или включить неуникальные индексы для таблицы
MyISAM, используя следующие операторы вместо myisamchk. Если вы используете эти операторы, вы можете пропустить операцииFLUSH TABLES:ALTER TABLE
tbl_nameDISABLE KEYS; ALTER TABLEtbl_nameENABLE 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.