Я объединяю CSV
15 ГБ (30 миллионов строк) в базу данных mysql-8
.
Проблема: задача выполняется около 20 минут, с пропускной способностью примерно 15-20 МБ/с. В то время как жесткий диск способен передавать файлы со скоростью 150 МБ/с.
У меня есть RAM-диск объемом 20 ГБ, на котором хранится мой csv. Импортируйте следующим образом:
mysqlimport --user="root" --password="pass" --local --use-threads=8 mytable /tmp/mydata.csv
Это использует LOAD DATA
под капотом. В моей целевой таблице нет индексов, но около 100 столбцов (я не могу это изменить).
Что странно: в /etc/mysql/my.cnf
пробовал подкрутить несколько параметров конфига следующим образом, но существенного улучшения они не дали:
log_bin=OFF
skip-log-bin
innodb_buffer_pool_size=20G
tmp_table_size=20G
max_heap_table_size=20G
innodb_log_buffer_size=4M
innodb_flush_log_at_trx_commit=2
innodb_doublewrite=0
innodb_autoinc_lock_mode=2
Вопрос: учитывают ли LOAD DATA
/ mysqlimport
эти изменения конфигурации? Или обходит? Или я вообще использовал правильный файл конфигурации?
По крайней мере, выбор переменных показывает, что они правильно загружены сервером mysql. Например, show variables like 'innodb_doublewrite'
показывает OFF
В любом случае, как я могу улучшить скорость импорта? Или моя база данных является узким местом и нет возможности преодолеть порог в 15-20 МБ/с?
Обновление: интересно, если я импортирую свой csv с жесткого диска на виртуальный диск, производительность будет почти такой же (немного лучше, но никогда не выше 25 МБ/с). Я также протестировал такое же количество строк, но только с несколькими (5) столбцами. И там я получаю около 80 МБ/с. Итак, ясно, что количество столбцов является узким местом? Но почему большее количество столбцов замедляет этот процесс?
show variables like
я вижу, что все мои конфиги загружены. - person membersound   schedule 09.10.2019