10.6.2 Загрузка больших объёмов данных в таблицы MyISAM
Эти рекомендации по производительности дополняют общие рекомендации по быстрому выполнению вставок в разделе 10.2.5.1 «Оптимизация операторов INSERT».
Для таблицы
MyISAMвы можете использовать одновременные вставки для добавления строк в то же время, что и операторыSELECT, если в середине файла данных нет строк, которые были удалены. См. раздел 10.11.3 «Одновременные вставки».-
Приложив некоторые усилия, можно сделать оператор
LOAD DATAещё быстрее для таблицыMyISAM, если в таблице много индексов. Воспользуйтесь следующей процедурой:Выполните оператор
FLUSH TABLESили команду mysqladmin flush-tables.Используйте myisamchk --keys-used=0 -rq
/path/to/db/tbl_nameдля удаления всех индексов для таблицы.Вставьте данные в таблицу с помощью
LOAD DATA. Это не обновляет индексы и поэтому очень быстро.Если вы планируете только читать из таблицы в будущем, используйте myisampack для её сжатия. См. раздел 18.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. См. раздел 7.1.1 «Настройка сервера».
© 2025 Oracle
Licensed under the GPLv2 License.