Медленный запрос INSERT

В разработке многие из нас работают с базами данных.

Сейчас от этого никуда не деться. Сам WordPress держит весь контент в таблицах. И если мы в своем плагине (как написать плагин) используем какие-либо свои разработки с обращением к базе данных, то неизбежно сталкиваемся с таким явлением как «медленные запросы». Об этом уже было написано множество статей в отношении запроса SELECT, но как быть с INSERT.

Информации на этот счет не так и много, и пишут в коде, бывает ужасные вещи. Видимо больше от безысходности, либо лени погонять Гугла.

Как правило в коде встречается следующая конструкция: цикл, в нем запрос вставки



	for($i=0; $i<count($some_arr); $i++){
            $ins_sql="INSERT INTO table1 (col1,col2, col3) VALUES ('".$some_arr['val1']."','".$some_arr['val2']."', '".$some_arr['val3']."')";
            $this->db->query($ins_sql);
	}
						

Вроде все хорошо, все ладненько. Если массив с данными 10 строчек.

А вот уже на 100 строчек вы начнете ощущать беспокойство, от медленности выполнения, и задумываться либо над разгоном железа сервера, либо над оптимизацией.

А если строк 10000?

  1. Проблема: ну ооооочень долго. Порядка 10 минут.
  2. Проблема: ну может в процессе скрипт перестанет отвечать, или если данных много MySql Server «уйдет в себя».

Давайте задумаемся над оптимизацией кода.  Есть такая конструкция


INSERT INTO tablename (colname) VALUES (val1), (val2), ... (valN)

Этот запрос отработает следующим образом: за одно выполнение запроса создастся N-строк и в каждой строке, столбец colname заполнится значением valN.

Выполнится такой запрос на порядки быстрее чем один запрос выполняемый при одной итерации в цикле.


$ins_sql="INSERT INTO table1 (col1,col2, col3) VALUES";
			
	for($i=0; $i<count($some_arr); $i++){
          if($i==count($some_arr)-1){
            $ins_sql.="('".$some_arr['val1']."','".$some_arr['val2']."', '".$some_arr['val3']."');"; 
            break; 
          }
           else{
                $ins_sql.="('".$some_arr['val1']."','".$some_arr['val2']."', '".$some_arr['val3']."'),";
                }
         } 
        // сконкатенированная строка $ins_sql будет иметь вид 
        // INSERT INTO tablename (colname) VALUES (val1), (val2), ... (valN) 
        $this->db->query($ins_sql); // выполняем запрос один раз

На этом все!

One Reply to “Начало. Знакомство с WordPress”

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *