ProfiPHPProfiPHP
  1. Главная
  2. Полезное в PHP
  3. Множественный INSERT

Множественный INSERT

Опишем, как правильно осуществить множественное добавление записей в таблицу.

Например, добавим 100 000 записей в таблицу. Для примера будем добавлять одно поле (`ip`) и в качестве значений автоматически генерируемый IP4. Самый простой способ:
for ($i = 0; $i < 100000; $i++)
{
$ip = mt_rand(0, 255).'.'.mt_rand(0, 255).'.'.mt_rand(0, 255).'.'.mt_rand(0, 255);
$db->query( "INSERT INTO `table` (`ip`) VALUES ('{$ip}')" );
}
Скорость зависит от параметров процессора, но сейчас это не важно, поскольку эксперименты будут проводиться на одном ПК.

В примере, описанном выше, будет создан цикл с 100 000 итерациями, соответственно будет выполнено такое самое количество запросов к базе данных. Данный код выполниться за 17.764 сек.

Никогда так не делайте! Если вам необходимо добавить большое количество записей, необходимо использовать следующий синтаксис INSERT, где используются перечисление значений:
INSERT INTO myTableName
(idColumnName, columNameOne, columTwo, other_column)
VALUES
(100, 'Name 1', 'Value 1', 'Other 1'),
(101, 'Name 2', 'Value 2', 'Other 2'),
(102, 'Name 3', 'Value 3', 'Other 3'),
(103, 'Name 4', 'Value 4', 'Other 4');
Один запрос с множеством параметров для добавления будет выполнен намного быстрее, чем выполнять запросы по отдельности. Для добавления множества в один запрос, необходимо задать интервал, между которым значения для добавлений будет помещаться в массив, который будет обработан в строку с помощью функции Implode и использован в запросе. Для определения интервала можно использовать операцию деления по модулю, которая позволит создавать периодичность выполнения операции INSERT. Вот готовый код:
$array_insert = array();
for ($i = 0; $i < 100000; $i++)
{
$ip = mt_rand(0, 255).'.'.mt_rand(0, 255).'.'.mt_rand(0, 255).'.'.mt_rand(0, 255);
$array_insert[] = "('".$ip."')";
if ($i % 50 == 0)
{
$db->query( "INSERT INTO `table` (`ip`) VALUES ".implode(', ', $array_insert));
$array_insert = array();
}
}
Данный код, с интервалом в 50 циклов, выполниться за 1.259 сек. А что будет, если интервал увеличить до 200? Тогда время еще уменьшиться и будет составлять 0.86 сек.

Как видно из примеров, можно значительно ускорить множественное добавление INSERT, если использовать промежуточный массив, в который записываются добавляемые значение и потом все вместе используются в запросе. И, кроме этого, избавиться от ошибки:
Fatal error: Maximum execution time of 30 seconds exceeded ...

Добавить комментарий

Имя:
Текст комментария: