我已经创建了复制分支用户权限的方法。权限通常为0到120个项目。运行此方法将此(0到120)项插入到7个用户ID需要35-55秒才能插入到表中。
/**
* Copy Branch User Permissions
*
* @param Int
* @param Int
* @param Int
* @return Array
*/
public function copyBranchUserPermissions($branchIdFrom, $branchIdTo, $userId)
{
$permissions = BranchPermissionUser::get()
->where('branch_id', $branchIdFrom)
->where('user_id', $userId);
foreach($permissions as $permission) {
$permission->create([
'branch_id' => $branchIdTo,
'permission_id' => $permission->permission_id,
'user_id' => $userId
]);
}
return $permissions;
}
我需要优化这个过程,因为数据插入的性能很慢。我在想如果超过10个用户,那么这个过程会花费太长时间。有没有办法提高插入数据的性能速度?
提前谢谢你!
您可以使用雄辩的fill()
方法。
public function copyBranchUserPermissions($branchIdFrom, $branchIdTo, $userId)
{
$permissions = BranchPermissionUser::where('branch_id', $branchIdFrom)
->where('user_id', $userId)
->get();
foreach($permissions as $permission) {
$permission->fill([
'branch_id' => $branchIdTo,
'permission_id' => $permission->permission_id,
'user_id' => $userId
]);
$permission->save();
}
return $permissions;
}
这将帮助您提高函数的速度,因为您循环的是您从查询中获得的结果,而不是查询本身。为了使用填充()
函数,您的数据类型必须是可填充的
您可以使用雄辩的insert()
方法。
public function copyBranchUserPermissions($branchIdFrom, $branchIdTo, $userId)
{
$permissions = BranchPermissionUser::where('branch_id', $branchIdFrom)
->where('user_id', $userId)
->get();
$data=[];
foreach($permissions as $permission) {
$data[] = [
'branch_id' => $branchIdTo,
'permission_id' => $permission->permission_id,
'user_id' => $userId
];
}
BranchPermissionUser::insert($data);
return $permissions;
}
如果您非常需要速度优化,那么最好坚持使用查询生成器,而不是使用雄辩的方式。
更多信息:Laravel Eloquent vs query builder-为什么使用Eloquent来降低性能
获取特定于用户和分支的权限时
$permissions = BranchPermissionUser::get()
->where('branch_id', $branchIdFrom)
->where('user_id', $userId);
首先从数据库表加载所有数据,并对所有数据生成的集合执行where。
您应该在get方法之前执行其中条件,因此它将在SQL端处理,这将比从get雄辩方法创建的集合中处理要快得多。
$permissions = BranchPermissionUser::query()
->where('branch_id', $branchIdFrom)
->where('user_id', $userId)
->get();
此外,您将循环遍历所有权限,并在数据库中创建每个权限。
foreach($permissions as $permission) {
$permission->create([
'branch_id' => $branchIdTo,
'permission_id' => $permission->permission_id,
'user_id' => $userId
]);
这将为每个创建创建一个查询。这非常慢,而且不是同时保存多行数据的最佳做法。
您应该使用插入方法来插入所有的行,这将创建一个SQL查询,并且速度更快,也更优化。
注意:插入方法在插入行时不会处理created_at和updated_at字段。因此,您必须手动为它们添加数据。
$data=[];
foreach($permissions as $permission) {
$data[] = [
'branch_id' => $branchIdTo,
'user_id' => $userId,
'permission_id' => $permission->permission_id,
'created_at' => now(),
'updated_at' => now(),
];
}
BranchPermissionUser::insert($data);
now()是一个Laravel助手,它为当前时间创建一个新的Carbon实例:。
嗨,我已经搜索并试图解决这个问题,但未能找到解决方案,抱歉占用了你的时间。我在laravel中插入一组数据与查询生成器一次插入多个数据。 有没有办法检查表中的值是否存在,然后更新,否则插入。如果所有数据成功更新或插入,我想从查询结果中返回或。我想解决它与laravel查询生成器。谢啦
我正在尝试从一个oracle数据库迁移到另一个。我的选择查询非常复杂,它返回大约2000万条记录。当我尝试执行时: 大约需要20个小时。 有什么不同的迁移方式吗?你能给我一些建议吗? 谢谢你的建议。 编辑:我创建了一个新表格,如下所示 将表XYZ创建为从yyy join zzz join ttt等中选择a,b,c,bla blaa 大约需要2分钟。 现在我正在尝试从XYZ插入到我的原始表。 还剩1
如果我想在数据帧中删除重复的索引,由于明显的原因,以下方法不起作用: 和 查找名为“index”的列 如果我想删除索引,我必须执行以下操作: 有没有更高效的方法?
问题内容: 我试图创建一个随机的实数,整数,字母数字,字母字符串,然后写入文件,直到文件大小达到 10MB 为止。 代码如下。 大约需要 225.953125秒 才能完成。如何提高此程序的速度?请提供一些代码见解? 问题答案: 观察到的“缓慢”的两个主要原因: 您的while循环很慢,大约有一百万次迭代。 您没有正确使用I / O缓冲。不要进行太多系统调用。目前,您正在拨打约一百万次。 首先在Py
我正在创建一个多租户应用程序,在该应用程序中,我基于子域连接到该特定租户的数据库。 下面是执行此操作的代码: 这是连接数据库的最佳方式,还是存在任何问题,因为我是从性能的角度考虑的,因为每次连接数据库时都有不同的子域。最好的方法是什么?
我对将大型集合插入cassandra数据库的最快方法有点困惑。我了解到我不应该使用批量插入,因为它是为原子性而创建的。甚至Cassandra也给了我一个信息,让我使用异步写来提高性能。我使用了没有“batch”关键字的最快插入代码: 出发地:https://medium.com/@fondev/cassandra-batch-loading-non-the-batch-keyword-40f00e