首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找当前用户之一(3.000)是否位于5.000.000行大数据库中

查找当前用户之一(3.000)是否位于5.000.000行大数据库中
EN

Stack Overflow用户
提问于 2019-06-30 12:23:12
回答 2查看 80关注 0票数 2

我有一个laravel项目,我需要定期检查3.000个应用程序用户中是否有一个在反洗钱数据库中(5.000.000行大Microsoft 表)。

在前端,我使用ajax完成了异步操作,所以当我单击"Check User“按钮时,我将等待响应。

代码语言:javascript
复制
$users = User::all(); // 3.000 rows

foreach($users as $user){

      $aml = DB::table('anti_money_laundering') // 5.000.000 rows
                ->select('ID')
                ->whereRaw("LOWER([FULL_NAME]) = ?", [$user->full_name])
                ->first();

      if($aml){
            //Bingo, do stuff
            //Continue
      }

}

但是我得到了maximum execution time of 30 seconds错误,并且我认为php.ini配置中增加请求时间并不能解决我的问题。

我怎么发动汽车呢?大查询/长请求的最佳实践是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-30 12:29:36

您目前正在一个循环中运行一个查询--其中一个具有3.000次迭代的循环将进行3.000次查询--这需要时间!

相反,您只需运行一个查询,将两个表连接在一起,并查看是否返回了任何结果。

代码语言:javascript
复制
SELECT aml.id
FROM anti_money_laundering AS aml
JOIN users AS u
    ON aml.FULL_NAME = u.full_name

雄辩地说,你可以这样做

代码语言:javascript
复制
$query = DB::table('anti_money_laundering ')
              ->join('users', 'users.full_name', '=', 'anti_money_laundering.full_name')
              ->select('anti_money_laundering.id')
              ->get();

如果有任何结果,就有匹配。

票数 1
EN

Stack Overflow用户

发布于 2019-06-30 12:40:55

构建一个带有用户名的数组,并检查您的集合中是否有anti_money_laundering记录:

代码语言:javascript
复制
$users = User::all(); // 3.000 rows
$fullNames = [];

foreach($users as $user){

      $fullNames[]=$user->full_name;

}

$badUsers = DB::table('anti_money_laundering') // 5.000.000 rows
                ->select('ID')
                ->whereIn("LOWER([FULL_NAME]) = ?", $fullNames)
                ->get();

foreach($badUsers as $badUser){
    //Bingo, do stuff
    //Continue
}

请注意,我不流利的拉拉维尔或雄辩,所以如果我的答案有排字,那就是原因。但是,这个想法比你最初发送3000条请求(非常慢)或另一个答案的想法要好,后者可以进行不必要的连接。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56824817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档