首页 > 解决方案 > 如何优化数据库查询并减少对数据的请求数

问题描述

我有一个网页,我从数据库中获取了 1000 条记录。但是页面加载时间过长,甚至 safari 浏览器都会发出警告,提示网页占用了太多内存。现在我可以减少数据数量但可以减少请求有什么方法可以减少请求数量。如果我使用延迟加载查询会提高网页速度?因为我的网页包含很多视频网址,谷歌驱动器网址和文档可能是解释器转到该链接并检查并返回应用程序我如何在 1 个请求中做到这一点

这是我的数据显示

https://imgur.com/a/qeX62si

$productsFeatured = Product::select('products.low_emitting_material_prerequisite_file',
            'manufacturers.phone','manufacturers.address','manufacturers.linkedin_url','manufacturers.city','manufacturers.state', 
            'products.specs_file','products.bim_file_url','products.specs_file_url','products.low_emitting_material_credit_file', 
            'products.id', 'products.name', 'products.logo','products.video_file', 'products.manufacturer_id',
            'products.division_id', 'products.section_id','products.datasheet_file', 'products.website', 'divisions.name as division_name', 'divisions.code as division_code',
            'sections.name as section_name', 'sections.code'   
             )
                    ->whereIn('products.status', ['active']);

                    if($request->chps_approved && in_array('63', $request->chps_approved)){
                        $productsFeatured->where(function ($query) {
                            $query->where('products.low_emitting_material_prerequisite_file', '!=', '');
                        });
                    }

                    $productsFeatured->leftJoin('products_selected_leeds', 'products.id', '=', 'products_selected_leeds.product_id')
                    ->leftJoin('sections', 'products.section_id', '=', 'sections.id')
                    ->leftJoin('divisions', 'products.division_id', '=', 'divisions.id');
                    if($request->division_code){

                        $productsFeatured->where('products.division_id', '=', $request->division_code);

                        $data['divisionn_code'] = $request->division_code;
                    }
                 else{

                    $productsFeatured->where('products.division_id', '=', '1');
                    $data['divisionn_code'] = 1;
                    }
                    $productsFeatured->join('manufacturers', 'products.manufacturer_id', '=', 'manufacturers.id')
                    ->join('users', 'manufacturers.user_id', '=', 'users.id')
                    ->orderBy('divisions.code', 'asc')
                    ->orderBy('sections.code', 'asc')
                    ->groupBy('products.id');
                    if($request->ajax()){
                        if($request->manufacturer){
                        $productsFeatured->whereIn('products.manufacturer_id', $request->manufacturer);
                        }
                        if($request->searchTxt){
                        $search_text = $request->searchTxt;

                        $productsFeatured->where(function ($query) use ($search_text) {
                        $query->orWhere('manufacturers.name', 'like', '%' . $search_text . '%');
                        $query->orWhere('sections.name', 'like', '%' . $search_text . '%');
                        $query->orWhere('products.name', 'like', '%' . $search_text . '%');
                        $query->orWhere('sections.name', 'like', '%' . $search_text . '%');
                        $query->orWhere('sections.code', 'like', '%' . $search_text . '%');
                        });
                        }
                        if($request->leedv4){

                        $where_in = $request->leedv4;

                        $query = DB::table('Products_selected_leeds')
                        ->select('product_id')
                        ->whereIn('leed_id',$where_in)
                        ->get();

                        $toCollection = collect($query);

                        $arrayOfIds = $toCollection->pluck('product_id')->toArray();

                        $productsFeatured->whereIn('products.id', $arrayOfIds);


                        }

                        if($request->website){

                            $productsFeatured->where('website','like', '%www%');
                        }  
                         if($request->video_file){

                            $productsFeatured->where('products.video_file','like', '%www%');

                        }if($request->bim_file_url){

                            $productsFeatured->whereNotNull('bim_file_url');

                        }if($request->specs_file){

                            $productsFeatured->where('bim_file_url','like', '%www%');

                        }
                        if($request->featured_products){
                            $featured = $request->featured_products;
                            $productsFeatured->where(function ($query) use ($featured) {
                                $query->orWhere('products.featured',$featured);
                                $query->orWhere('manufacturers.featured',$featured);


                                });

                        }
                        $productsFeatured = $productsFeatured->orderBy('manufacturers.name', 'ASC')->get();

                        }else{
                        $productsFeatured = $productsFeatured->orderBy('manufacturers.name', 'ASC')->get();

                        }

我可以在第一条记录显示为屏幕大小并且当用户用户向下滚动时查询再次运行并获取记录到屏幕大小

标签: phpmysqllaravel

解决方案


你没有给我们足够的信息来帮助你很好。请阅读本文,特别注意查询性能部分,然后编辑您的问题以提供更多详细信息。

话虽如此,正是查询的这一部分可能会使您的查询变慢。

                    $query->orWhere('manufacturers.name', 'like', '%' . $search_text . '%');
                    $query->orWhere('sections.name', 'like', '%' . $search_text . '%');
                    $query->orWhere('products.name', 'like', '%' . $search_text . '%');
                    $query->orWhere('sections.name', 'like', '%' . $search_text . '%');
                    $query->orWhere('sections.code', 'like', '%' . $search_text . '%');

'column LIKE '%search-term%'MySQL 处理这个,一个非常缓慢的 OR 级联。

可以通过适当的索引来加速它。但是您可能应该改为使用FULLTEXT 搜索进行调查。


推荐阅读