Эффективнее ли создавать массивный оператор insert или множество операторов insert?

#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 Тыс. строк.