【问题标题】:Remove duplication from big table with laravel [closed]使用laravel从大表中删除重复项[关闭]
【发布时间】:2026-02-20 03:15:01
【问题描述】:

我有一个包含 500 万条记录的表,它有重复的行
我想删除重复项。
这是我的代码

$userRoles = Model::groupBy('phone','user_id','name')->get();
$userRolesId = array_column($userRoles ->toArray(), 'id');
Model::whereNotIn('id', $userRolesId )->delete();

URL 存在,但加载五分钟后返回错误。当我尝试将它用于一张小桌子时,它完美无缺。

【问题讨论】:

  • 控制器功能的路由定义了吗?你清除路由缓存了吗?
  • 404与代码无关! Its a page not found error
  • 首先,这意味着它并不是真正的404错误,而是超时错误。运行一个运行 5 分钟或更长时间的脚本?然后在我看来它出现超时错误是正常的。如果您想删除重复项,最好使用控制台命令,并将其拆分为多个运行以删除有限数量的重复项

标签: php sql laravel


【解决方案1】:

404 表示你调用的路由在你的应用中不存在,

如果传入请求不匹配路由模式约束,将返回 404 HTTP 响应。 你的代码没问题:-

$userRoles = Model::groupBy('phone','user_id','name')->get();
$userRolesId = array_column($userRoles ->toArray(), 'id');
Model::whereNotIn('id', $userRolesId )->delete();

【讨论】:

  • 网址存在 加载五分钟后返回该错误,我在小桌子上试了一下,效果很好
  • 这意味着您的脚本达到了最大执行时间,$start = microtime(true); $userRoles = Model::groupBy('phone','user_id','name')->get(); $userRolesId = array_column($userRoles ->toArray(), 'id'); dd(微时间(真)-$开始);然后告诉使用结果
  • 你可以在 phpini 中增加执行时间,或者你可以使用惰性收集来帮助你处理大数据(laravel.com/docs/8.x/collections#lazy-collections)或者你可以使用作业批处理(laravel.com/docs/8.x/queues#job-batching
  • 结果为 291.67524313927
  • 我的执行时间是300