#php #mysql #insert
#php #mysql — сервер #вставить
Вопрос:
Я импортирую CSV-файл в базу данных mysql. Еще не изучал массовую вставку, но задавался вопросом, эффективнее ли создавать массивную инструкцию INSERT (используя PHP) путем перебора значений ИЛИ эффективнее выполнять индивидуальную вставку строк CSV?
Ответ №1:
Массовая вставка выполняется намного быстрее. Обычно я делаю что-то подобное, что импортирует данные по 100 записей за раз (размер пакета из 100 записей произволен).
$a_query_inserts = array();
$i_progress = 0;
foreach( $results as $a_row ) {
$i_progress ;
$a_query_inserts[] = "({$a_row['Column1']}, {$a_row['Column2']}, {$a_row['Column3']})";
if( count($a_query_inserts) > 100 || $i_progress >= $results->rowCount() ) {
$s_query = sprintf("INSERT INTO Table
(Column1,
Column2,
Column3)
VALUES
%s",
implode(', ', $a_query_inserts)
);
db::getInstance()->query($s_query);
// Reset batch
$a_query_inserts = array();
}
}
Существует также способ загрузить файл непосредственно в базу данных.
Ответ №2:
Я не знаю особенностей того, как PHP устанавливает соединения с MySQL, но каждый запрос на вставку будет иметь некоторый объем накладных расходов, помимо данных для самой вставки. Поэтому я бы предположил, что массовая вставка была бы намного эффективнее, чем повторяющиеся вызовы базы данных.
Ответ №3:
Трудно дать ответ, не зная по крайней мере еще двух элементов:
1) Работает ли ваша база данных на том же сервере, где выполняется PHP-код?
2) Насколько «велик» файл? Т.е. в среднем 20 записей csv? 200? 20000?
В общем, циклический просмотр csv-файла и запуск инструкции insert для каждой строки (однако, пожалуйста, используйте подготовленные инструкции, иначе ваша БД будет тратить время на разбор одной и той же строки каждый раз) был бы более «традиционным» подходом и был бы достаточно эффективным, если только у вас не очень медленное соединение между PHP и БД.
Даже в этом случае, если длина csv-файла превышает 20 записей, у вас, вероятно, начнутся проблемы с максимальной длиной инструкции из анализатора SQL.
Комментарии:
1. Я успешно использую инструкции, вставляющие до 2000 строк одновременно. На самом деле, не существует такого понятия, как «максимальная длина инструкции», в my.cnf есть только директива max_allowed_packet , которая напрямую ограничивает длину инструкции.
2. решил использовать подготовленные инструкции с несколькими вставками. сработало хорошо. пробовал это с CSV с 10 Тыс. строк.