Я использую Таблица PHPS, чтобы взять некоторые электронные таблицы, которые пользователь может загрузить, добавить столбец с определенными значениями, сохранить файл как 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 кажется, что я добавляю дополнительные шаги.
Не волнуйтесь, $table не поставляется пользователем :)
Прочтите файл excel прямо в PHP, а затем пропустите его. Зацикливание на нем позволяет лучше контролировать аномалии, даже если оно немного менее эффективно.
Тогда я также надеюсь, что $file нет, потому что у него те же проблемы. По возможности использовать значения-заполнители - хорошая идея. Все остальное создает огромные риски.
Похоже, что единственный способ действительно «упростить» его с точки зрения удаления шагов из процесса - это перейти от xlsx напрямую к mysql, что означало бы повторение строк с помощью phpspreadsheet и выполнение нескольких отдельных вставок. phpspreadsheet, вероятно, все равно будет перебирать строки при создании CSV, что, кажется, уменьшает проблему до ЗАГРУЗКИ по сравнению с несколькими вставками, если я что-то не упускаю.






Прямой импорт CSV в MySQL обычно является самым быстрым вариантом, однако он не лишен ограничений. Во-первых, вам нужно импортировать все или ничего в файл, и вы не узнаете, как далеко это продвинулось, пока это не будет сделано. Поскольку некоторый импорт может занимать часы, даже дни, вы можете не знать, где он находится. Вся операция вставки в таблицу InnoDB выполняется атомарно по соображениям производительности, но это означает, что она не видна, пока не будет полностью зафиксирована.
Другой - файл должен присутствовать на сервере. Параметр LOCAL является необычной функцией инструмента командной строки mysql и, вероятно, не работает в драйвере вашей базы данных, если не эмулирован.
Построчная вставка с помощью анализатора CSV почти всегда выполняется медленнее. Если вы должны что-то сделать, обязательно подготовьте оператор INSERT один раз и повторно используйте его в цикле или выполните «мульти-INSERT» с таким количеством строк, которое вы можете поместить в буфер максимального размера оператора.
Я очень надеюсь, что
$tableне является аргументом, предоставленным пользователем, или этот запрос - проблема.