Вставить sql-запрос в цикл-хорошая практика или плохая?

У меня есть список пользователей, которые должны быть повторены с помощью цикла foreach и вставлены в таблицу для каждой новой строки в таблице db.

$data['entity_classid'] = $classid;
    $data['notification_context_id'] = $context_id;
    $data['entity_id'] = $entity_id;
    $data['notification_by'] = $userid;
    $data['actionid'] = $actionid;
    $data['is_read'] = 0;
    $data['createdtime'] = time();
    foreach($classassocusers as $users){
            $data['notification_to'] = $users->userid;
            $DB->insert_record('homework.comments',$data,false);
        }

таким образом, используя запрос insert, как указано выше, является

  1. хорошая практика или плохая практика,
  2. должен ли я размещать любую задержку после каждого выполнения запроса вставки?
  3. каковы плюсы и минусы этого?

спасибо

2 ответов


использование такого запроса-хорошая практика в вашем случае. Вам все равно придется вставить список пользователей, поэтому вам придется обрабатывать много запросов. Никакого пути вокруг этого!

Я понятия не имею, почему вы хотели бы поставить задержку после каждой вставки. Эти методы являются синхронными вызовами, поэтому ваш код будет" приостановлен " во время выполнения вашего запроса. Поэтому задержка будет просто задерживать ваш код, пока ничего не происходит.

Так что ваш цикл не будет продолжаться при выполнении запроса. Поэтому не задерживайте свой код еще больше специально.

другой способ сделать это-выполнить один запрос.

$user_data = "";
foreach($classassocusers as $users) {
   $user_data .= "('" . $users->userid . "', '" . $users->name . "'), ";
}

$user_data = substr($user_data, 0, strlen($user_data) - 2);

$query = "INSERT INTO `homework.comments` ( `id`, `name` )
          VALUES " . $user_data;

это должно сделать запрос, например:

INSERT INTO `homework.comments` ( `id`, `name` )
VALUES ('1', 'John'),
       ('2', 'Jeffrey'),
       ('3', 'Kate');

(кстати, я сделал некоторые предположения относительно вашего $users объект и структура таблицы. Но я уверен, что вы уловили идею)


все зависит от ваших требований.

Если вы запустите 500.000 этих обновлений за 5 минут - каждые 15 минут, ваша база данных будет иметь трудное время. Если вы делаете это для 1000 пользователей каждые 15 минут - это отличный подход.

когда требуется производительность, concider следующее:

  1. объединить INSERT с помощью синтаксиса значений, обрабатывать каждые 500/1000.
  2. добавить небольшой тайм-аут после запроса.

в противном случае, это отличный подход!