php - 如何优化数据库查询并减少对数据的请求数
问题描述
我有一个网页,我从数据库中获取了 1000 条记录。但是页面加载时间过长,甚至 safari 浏览器都会发出警告,提示网页占用了太多内存。现在我可以减少数据数量但可以减少请求有什么方法可以减少请求数量。如果我使用延迟加载查询会提高网页速度?因为我的网页包含很多视频网址,谷歌驱动器网址和文档可能是解释器转到该链接并检查并返回应用程序我如何在 1 个请求中做到这一点
这是我的数据显示
$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();
}
我可以在第一条记录显示为屏幕大小并且当用户用户向下滚动时查询再次运行并获取记录到屏幕大小
解决方案
你没有给我们足够的信息来帮助你很好。请阅读本文,特别注意查询性能部分,然后编辑您的问题以提供更多详细信息。
话虽如此,正是查询的这一部分可能会使您的查询变慢。
$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 搜索进行调查。
推荐阅读
- node.js - 我们如何在一个项目中同时使用“扩展”真或假
- java - 如何修复 Fortify Path Manipulation (Input Validation and Representation, Data Flow) 漏洞
- postgresql - 我在两列(楼层ID和票证)的弹簧启动服务中制作了复合键
- sql-server - 如何避免在 Powershell 中使用 SMO 对象的系统数据库?
- c# - 如何使用 c# 生成 UUID 版本 4
- join - 如何加入同一表中存在的列
- python - 为什么我不能从 Python 3.7.2 中的 utils 模块导入 CFEVideoConf 和 image_resize
- hibernate - 无法使用 data.sql 生成 UUID id
- android - 如何在原生应用中处理 JWT 过期机制
- go - 如何在 Go 中使用字符串类型获取字符串的十六进制值