PHP + MySQL: эффективно загружать большие таблицы в MySQL - PullRequest
0 голосов
/ 01 ноября 2018

Я использую PHPSpreadsheet , чтобы взять некоторые электронные таблицы, которые пользователь может загрузить, добавить столбец с определенными значениями, сохранить файл как CSV и использовать следующий запрос для импорта файла csv:

LOAD DATA LOCAL INFILE '{$file}'
INTO TABLE {$table}
FIELDS TERMINATED by ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES

В качестве альтернативы я могу сделать что-то вроде:

foreach($rows as $row){
    // INSERT $row INTO table
}

Все электронные таблицы будут иметь одинаковые столбцы / типы данных.

Какой самый эффективный способ сделать это? Переход от Xlsx -> CSV -> MySQL Import выглядит так, будто я добавляю дополнительные шаги.

1 Ответ

0 голосов
/ 01 ноября 2018

Прямой импорт MySQL в CSV обычно является самым быстрым вариантом, однако он не без ограничений. Во-первых, вам нужно импортировать все или ничего в файл, и вы не будете знать, как далеко он продвинется, пока это не будет сделано. Поскольку некоторые операции импорта могут занимать часы, даже дни, вы можете не знать, где они находятся. Вся операция вставки в таблицу InnoDB выполняется атомарно из соображений производительности, но это означает, что она не видна до полной фиксации.

Еще один файл должен присутствовать на сервере. Опция LOCAL - это необычная особенность инструмента командной строки mysql, которая, вероятно, не работает в драйвере базы данных, если не выполняется эмуляция.

Вставка строка за строкой с анализатором CSV почти всегда медленнее. Если вам нужно что-то сделать, обязательно подготовьте оператор INSERT один раз и повторно используйте его в цикле, или выполните "multi- INSERT" с таким количеством строк, которое вы можете уместить в буфере максимального размера оператора .

...