时间戳转换器

Laravel 提高 SQL 速度

日期:2023-05-09     浏览:229    
【中文标题】Laravel 提高 SQL 速度【英文标题】:Laravel Increase SQL speed 【发布时间】:2018-10-12 17:10:32 【问题描述】:

我正在尝试提高我在 Laravel 5.7 中的查询速度,我将调用时间缩短到了约 2.5 秒。我正在尝试找出更多方法来使其更快,如果我能得到一些帮助,我将不胜感激。

谢谢

我的数据结构:

功能(控制器):

public function getUserDataTmp(Request $request) 

        $input = file_get_contents("php://input");
        $request = json_decode($input);

        if ($this->authTokenAccess($request) == true) 

            $bottomWords = bottom_exterior_word::select('word','sentence','sequence','id','group_id')->where('user_id','=', $request->id)->get();

            $emergencyWords = left_exterior_word::select('word','sentence','sequence','id')->where('user_id','=', $request->id)->get();

            foreach($bottomWords as $tmp => $key) 
                $group_id = $key->group_id;
                $bottomWords->user_id = $request->id;
                $bottomWords[$tmp]->words = $key->getMainWords($group_id, $request->id);
            

            foreach($emergencyWords as $key => $word) 
                $emergencyWords[$key]->image = imageModel::select('base64','id')->where('emergency_id','=', $word->id)->first();

            

            $data = [
                'data' => [
                    'return' => 'success',
                    'code' => 'VEDC001',
                    'response' => 'Successfully Gathered Words',
                    'main_categories' => $bottomWords,
                    'emergency_words' => $emergencyWords
                ]
            ];

            return(json_encode($data));

        

    

getMainWords 函数(bottom_exterior_word 模型):

    public function getMainWords($group_id, $id)
  
      // return("TEST");
      $words = \App\main_word::select('id','group_id','sentence','sequence','word')->where('group_id','=', $group_id)->where('user_id','=', $id)->get();
      foreach ($words as $key => $word) 
          $words[$key]->image = Image::select('base64','id')->where('word_id','=', $word->id)->first();
      
      return $words;
  

【问题讨论】:

你有索引吗? @Snapey 我有一个主键,主键会自动递增主词,所有内容都使用该键(word_id)。 @ImJT 我将从重构开始,以便在 foreach 循环中不调用任何查询。 【参考方案1】:

从重构开始,这样您就不会在 foreach 循环中查询

foreach($bottomWords as $tmp => $key) 
            $group_id = $key->group_id;
            $bottomWords->user_id = $request->id;
            $bottomWords[$tmp]->words = $key->getMainWords($group_id, $request->id);
        

我会将getMainWords 函数更改为接受一组组ID 并使用whereIn 子句:

whereIn 方法验证是否包含给定列的值 在给定的数组内:

$users = DB::table('users') ->whereIn('id', [1, 2, 3]) ->get();

此循环的处理方式相同。

        foreach($emergencyWords as $key => $word) 
            $emergencyWords[$key]->image = imageModel::select('base64','id')->where('emergency_id','=', $word->id)->first();

        

一般来说,尽量减少查询次数会缩短响应时间。

【讨论】:

【参考方案2】:

旧帖子,不过想更新一下。自从我第一次发布这篇文章以来,我对 Laravel 有了更多的了解,并且对它更有经验。

这是我的新功能和解决方案:

控制器:

public function data(Request $request)

    return response()->success(
        [
            'emergencywords' => EmergencyWord::with('image')->whereUserId($request->user()->id)->get(),
            'categorywords' => CategoryWord::with(['image','words.image'])->whereUserId($request->user()->id)->get(),
        ]
    );

分类词关系:

public function image()

    return $this->hasOne('App\Image','id','image_id');


public function words()

    return $this->hasMany('App\MainWord','category_words_id','sequence');

紧急词关系:

public function image()

    return $this->hasOne('App\Image','id','image_id');

主词关系:

public function image()

    return $this->hasOne('App\Image','id','image_id');

【讨论】:

相关文章

laravel预防sql注入(代码片段)

{阅读目录LaravelSQL注入预防指南什么是SQL注入?LaravelSQL注入示例1:使用RawMethods示例2:使用DB::statement示例3:错误消息博主解决Laravel原生SQL注入的办法LaravelSQL注入预防指南Laravel应用程序上执行SQL注入,并提出一些预防技术。首...}

laravel预防sql注入(代码片段)

{阅读目录LaravelSQL注入预防指南什么是SQL注入?LaravelSQL注入示例1:使用RawMethods示例2:使用DB::statement示例3:错误消息博主解决Laravel原生SQL注入的办法LaravelSQL注入预防指南Laravel应用程序上执行SQL注入,并提出一些预防技术。首...}

Laravel 5:如何转储 SQL 查询?

{】Laravel5:如何转储SQL查询?【英文标题】:Laravel5:HowtodumpSQLquery?【发布时间】:2017-05-0919:04:13【问题描述】:Laravel5的内置解决方案在Laravel5+中,我们可以使用\\DB::getQueryLog()来检索所有已执行的查询。因为,查询日志是一项广...}

Laravel 4 - 记录 SQL 查询

{】Laravel4-记录SQL查询【英文标题】:Laravel4-loggingSQLqueries【发布时间】:2013-10-0812:43:56【问题描述】:已经有几个关于在Laravel4中记录SQL查询的问题。但我几乎尝试了所有这些问题,但仍然没有按照我想要的方式工作。这是我的...}

Laravel'找不到驱动程序(SQL:插入...' [重复]

{】Laravel\\\'找不到驱动程序(SQL:插入...\\\'[重复]【英文标题】:Laravel\'couldnotfinddriver(SQL:insertinto...\'[duplicate]Laravel\'找不到驱动程序(SQL:插入...\'[重复]【发布时间】:2018-12-3109:16:42【问题描述】:在一年多没有做过网络开发...}

在 Laravel 4 中转义原始 SQL 查询

{】在Laravel4中转义原始SQL查询【英文标题】:EscaperawSQLqueriesinLaravel4【发布时间】:2013-09-2720:46:39【问题描述】:如何在Laravel4中转义传递给原始查询的参数?我期待像DB::escape()之类的东西(它从Laravel3中敲响了钟声)并且还尝试...}

PHP Laravel迁移SQL问题[重复]

{】PHPLaravel迁移SQL问题[重复]【英文标题】:PHPLaravelmigrateSQLissue[duplicate]【发布时间】:2018-10-2107:53:21【问题描述】:当我在我的laravel项目中在cmd上执行phpartisanmigrate时。我收到以下错误。请帮忙。【问题讨论】:【参考方案1】...}

laravel|导入sql

{记录个Laravel泪奔的一点:命令作用vagrantup启动服务vagrantssh通过ssh方式登录showdatabase;展示DB列表usexxx;使用某个数据库showtables;列出当前库中表名source/home/vagrant/Code/项目名/SQL文件;将SQL语句导入库中以上切记需要进入HomeSteadÿ...}

将 SQL 转换为 Laravel 5.1

{】将SQL转换为Laravel5.1【英文标题】:ConvertingSQLtoLaravel5.1【发布时间】:2016-08-0122:41:27【问题描述】:我正在将一些项目从纯PHP转换为Laravel5.1,但在转换此查询时遇到问题:\\DB::select("SELECTTABLE_NAMEasnombre,FORMAT(TABLE_ROWS,0)ascantidadFRO...}

Laravel 5.7 执行 SQL 查询多少次?

{】Laravel5.7执行SQL查询多少次?【英文标题】:HowmanytimesdoesLaravel5.7executetheSQLquery?【发布时间】:2019-06-1911:31:51【问题描述】:在Laracasts.com上学习Laravel5.7,它展示了如何使用Eloquent模型对象从数据库中获取1:N关系记录,如下所示...}

Copyright ©2021 时间戳转换器 小常识 114pp | 陕ICP备18005036号