Вставить SQL-запрос в цикле хорошая практика или плохая? - PullRequest
9 голосов
/ 26 августа 2011

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

$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);
        }

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

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

Спасибо

Ответы [ 2 ]

8 голосов
/ 26 августа 2011

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

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

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

Еще один способ сделать это - выполнить один запрос.

$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 объекта и структуры вашей таблицы. Но я уверен, что вы поняли идею)

3 голосов
/ 26 августа 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...