PHP + MySQL: эффективная загрузка больших электронных таблиц в MySQL

Я использую Таблица 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 не является аргументом, предоставленным пользователем, или этот запрос - проблема.

tadman 31.10.2018 23:57

Не волнуйтесь, $table не поставляется пользователем :)

Bijan 31.10.2018 23:58

Прочтите файл excel прямо в PHP, а затем пропустите его. Зацикливание на нем позволяет лучше контролировать аномалии, даже если оно немного менее эффективно.

Difster 31.10.2018 23:59

Тогда я также надеюсь, что $file нет, потому что у него те же проблемы. По возможности использовать значения-заполнители - хорошая идея. Все остальное создает огромные риски.

tadman 31.10.2018 23:59

Похоже, что единственный способ действительно «упростить» его с точки зрения удаления шагов из процесса - это перейти от xlsx напрямую к mysql, что означало бы повторение строк с помощью phpspreadsheet и выполнение нескольких отдельных вставок. phpspreadsheet, вероятно, все равно будет перебирать строки при создании CSV, что, кажется, уменьшает проблему до ЗАГРУЗКИ по сравнению с несколькими вставками, если я что-то не упускаю.

Don't Panic 01.11.2018 00:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
536
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Другие вопросы по теме