Импорт CSV MySQL Workbench Mac Catalina очень медленный

#mysql #macos #csv #workbench

#mysql #macos #csv #workbench

Вопрос:

У меня Macbook pro 2019 touch, i5, 8M, HD 256 ГБ, используется 75 ГБ, OSX 10.15.2. Установлены AMPPS 3.9 и MSQL Workbench 8.0

Я импортирую на Localhost таблицу mysql в формате csv 1,9 ГБ на 15 миллионов регистров, через 12 часов было импортировано только 3 миллиона.

Уже проверил XAMPP VM, и в консоли MariaDB не удалось загрузить ДАННЫЕ В ФАЙЛ. Он отключается от базы данных.

Я собираюсь обработать таблицу с помощью PHP. Любая помощь или рекомендация, чтобы эти процессы стали быстрее?

Я использую Sequel pro для чтения удаленных баз данных, очень быстро, но больше не работает для localhost.

Комментарии:

1. проверьте журналы ошибок, у оболочки нет ограничения по времени, запустите ее с помощью -e mariadb.com/kb/en/mysql-command-line-client

Ответ №1:

У меня была аналогичная проблема при импорте файла CSV (около 5 миллионов записей) в таблицу mysql. Мне удалось сделать это с помощью nodejs, поскольку он способен открывать и читать файл построчно (без загрузки всего файла в оперативную память). Скрипт считывает 100 строк, затем делает вставку, затем считывает еще 100 строк и так далее. Он обработал весь файл примерно за 9 минут. Он использует readline модуль. Основная часть скрипта выглядит примерно так:

 const Fs = require('fs');
const Mysql = require('mysql2');
const Readline = require('readline');
const fileStream = Fs.createReadStream('/path/to/file');
var dbConnection = Mysql.createConnection({
  host : "yourHost",
  user : "yourUser",
  password : "yourPassword",
  database : "yourDatabase"
});
const rl = Readline.createInterface({
  input: fileStream,
  crlfDelay: Infinity
});
async function run() {
  var lineElements = [];
  for await (const line of rl) {
    // Each line in will be successively available here as `line`.
    lineElements = line.split(",");
    // now lineElements is an array containing all the values of the current line
    // here you can queue up multiple lines, to make a bigger insert
    // or just insert line by line
    await dbConnection.query('INSERT INTO ..........');
  }
}
run();
  

Приведенный выше скрипт вставляет по строке на запрос. Не стесняйтесь изменять его, если вы хотите, чтобы запрос вставлял 100 строк или любое другое значение.

В качестве примечания: поскольку мой файл был «доверенным», я не использовал подготовленные инструкции, так как считаю, что простой запрос выполняется быстрее. Я не знаю, был ли значительный прирост скорости, поскольку я не проводил никаких тестов.