循环中插入SQL查询是好的实践还是坏的实践?

10
我有一个用户列表,需要使用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. 这样做的利弊是什么?

谢谢


我不认识你的$DB对象的类(homebrew?),但是看一下pdo的批量插入。批量插入可能会大大提高速度。 - Jacob
2个回答

9
在您的情况下,使用这种查询方式是一个好的做法。您无论如何都将不得不插入用户列表,因此必须处理多个查询。没有绕过这个问题的办法!
我不知道为什么您想在每次插入后放置延迟。这些方法是同步调用,因此在执行查询期间,您的代码将被“暂停”。因此,延迟只会延迟您的代码,而没有任何进展。
因此,在执行查询时,您的循环将不会继续。因此,请不要故意延迟您的代码。
另一种方法是通过执行一个查询来完成此操作。
$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');
< p > (顺便说一下,我假设了您的$users对象和您的表结构。但我相信你已经明白了这个想法)

1
好的,您需要插入一组用户,但您不必逐个添加。 - Jacob
没问题,让我再添加一种方式。 - Jules
嘿@Jules,我在$data中有些东西。我已经更新了我的问题,请再看一遍并相应地更正你的答案。 - OM The Eternity
后一种方法,即执行单个查询,更快吗? - Marvzz
@Marvzz 是的,使用一个查询更有效率和更快速。 - Jules
显示剩余2条评论

4

一切都取决于您的要求。

如果您在5分钟内运行了500,000次这些更新操作-每15分钟进行一次,您的数据库将会很吃力。如果您每15分钟对1,000个用户进行操作-那么这是一个很好的方法。

当需要性能时,请考虑以下几点:

  1. 使用VALUES语法组合INSERT,每500/1000个处理一次。
  2. 在查询之后添加小的超时时间。

否则,这是一个非常好的方法!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接