如何减少sql查询的加载时间?

时间:2018-12-31 07:12:54

标签: mysql performance laravel-5 eloquent

我创建了一个查询以使用此查询获取人员列表。在检查登录用户的权限级别后运行。

  if (Auth::user()->hasPermissionTo('All Sections')) {

  $itemregistrations = DB::table('itemregistrations')
                       ->join('sections', 'itemregistrations.sectionid', '=', 'sections.sectionid')
                       ->join('categories', 'itemregistrations.categoryid', '=', 'categories.categoryid')
                       ->join('operasi', 'itemregistrations.operasiid', '=', 'operasi.operasiid')
                       ->select('itemregistrations.ItemRegistrationID','itemregistrations.name', 'itemregistrations.Nobadan', 'sections.sectionname', 'categories.categoryname', 'operasi.operasiname')
                       ->get();

}

但是,查询的加载时间很长,大约需要一分钟才能完成加载。该列表显示了大约1115。

如何减少加载时间?

我读到有关急切加载以减少加载时间的信息。但是我的审判没有成功。

部门是员工部。

类别是人员级别

operasi是员工的职级,与类别相关,每个类别都有其自己的操作名称。

这是itemregistrations表上的索引。

enter image description here

我已经安装了laravel调试器并产生以下结果: -6意见 -4个查询

  select * from `users` where `id` = 1 limit 1

  select `permissions`.*, `model_has_permissions`.`model_id` as `pivot_model_id`, `model_has_permissions`.`permission_id` as 
  `pivot_permission_id` from `permissions` 
  inner join `model_has_permissions` on `permissions`.`id` = `model_has_permissions`.`permission_id` 
  where `model_has_permissions`.`model_id` = 1 and `model_has_permissions`.`model_type` = 'App\User'

  select `roles`.*, `model_has_roles`.`model_id` as `pivot_model_id`, `model_has_roles`.`role_id` as `pivot_role_id` from `roles` 
  inner join `model_has_roles` on `roles`.`id` = `model_has_roles`.`role_id` 
  where `model_has_roles`.`model_id` = 1 and `model_has_roles`.`model_type` = 'App\User'

  select `itemregistrations`.`ItemRegistrationID`, `itemregistrations`.`name`, 
   `itemregistrations`.`Nobadan`, `sections`.`sectionname`, `categories`.`categoryname`, `operasi`.`operasiname` 
   from `itemregistrations` inner join `sections` on `itemregistrations`.`sectionid` = `sections`.`sectionid` 
   inner join `categories` on `itemregistrations`.`categoryid` = `categories`.`categoryid` 
   inner join `operasi` on `itemregistrations`.`operasiid` = `operasi`.`operasiid`

-1116登机门

上面的查询是根据很少的权限过滤的。

这些是所涉及表的索引:

  1. 角色表索引

role index

  1. 权限表索引 permission

  2. 模型具有角色表 enter image description here

  3. 角色具有权限表

enter image description here

1 个答案:

答案 0 :(得分:1)

对于数据库方面,请确保在JOIN涉及的列上具有正确的索引

sections sectionid
categories categoryid
operasi operasiid 

尤其是

上的综合索引
itemregistrations   (sectionid , categoryid , operasiid ) 

无论如何,在实际应用中1256 si的负载是完全没有用的..
为此,您可以使用分页

减少数据显示的加载时间

根据您的基数,您应该建立一个索引

itemregistrations(operasiid,sectionid,categoryid)

您可能需要删除所涉及的同一列上的索引,而只保留组合...