在循环中插入sql查询是好习惯还是坏习惯?
Posted
技术标签:
【中文标题】在循环中插入sql查询是好习惯还是坏习惯?【英文标题】:Insert sql query in loop a good practice or bad? 【发布时间】:2011-11-04 09:02:27 【问题描述】:我有一个用户列表,需要使用 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);
所以使用上面给出的插入查询是
-
好做法或坏做法,
每次插入查询执行后我都应该延迟吗?
这样做的利弊是什么?
谢谢
【问题讨论】:
我不认识你的 $DB 对象的类(自制软件?),但是用 pdo 查看batch inserts。批量插入可能会大大提高速度。 【参考方案1】:在您的情况下,使用这样的查询是一个很好的做法。无论如何,您都必须插入用户列表,因此您必须处理许多查询。没办法!
我不知道您为什么要在每次插入后延迟。这些方法是同步调用,因此您的代码在执行查询期间无论如何都会“暂停”。所以延迟它只会延迟你的代码,而没有任何进展。
所以你的循环在执行查询时不会继续。所以不要故意拖延你的代码。
执行此操作的另一种方法是执行一个查询。
$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
对象和表结构做了一些假设。但我相信您明白了)
【讨论】:
好吧,你必须插入一个用户列表,但你不必一次插入一个用户。 没错,让我添加另一种方式。 嘿@Jules 我在 $data 中有一些东西我已经更新了我的问题请再看一遍并相应地纠正你的答案 @OM The Eternity 啊,你已经在使用 $data 了。然后,您可以将我的变量名更改为其他任何名称。我不知道您使用的是哪个 $DB 对象类,所以我无法为您提供帮助。但我改变了我的答案,不再重复 $data。我希望你能明白这个想法! @Jules 我关心的不是变量的名称,我关心的是在每次迭代循环时要使用的 forach 循环上方给出的其他值...【参考方案2】:这一切都取决于您的要求。
如果您在 5 分钟内运行 500.000 次这些更新 - 每 15 分钟一次,您的数据库就会遇到困难。如果您每 15 分钟为 1.000 位用户执行此操作 - 这是一个很好的方法。
当需要性能时,请考虑以下几点:
-
使用 VALUES 语法组合 INSERT,每 500/1000 处理一次。
在查询后添加一个小超时。
否则,这是一个很好的方法!
【讨论】:
以上是关于在循环中插入sql查询是好习惯还是坏习惯?的主要内容,如果未能解决你的问题,请参考以下文章