Как сократить время загрузки SQL-запроса? - PullRequest
0 голосов
/ 31 декабря 2018

Я создал запрос, чтобы получить список сотрудников, использующих этот запрос.Он запускается после проверки уровня разрешений входящего в систему пользователя.

  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 - это категория персонала, относящаяся к категориям, каждая категория имеетего собственное имя_операции.

Это индексирование в таблице регистрации элементов.

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

индекс таблицы разрешений permission

модель имеет таблицу ролей enter image description here

роль имеет таблицу разрешений

enter image description here

1 Ответ

0 голосов
/ 31 декабря 2018

для стороны БД убедитесь, что у вас есть правильный индекс для столбцов, участвующих в JOIN

sections sectionid
categories categoryid
operasi operasiid 

, особенно составной индекс для

itemregistrations   (sectionid , categoryid , operasiid ) 

в любом случае загрузка 1256 si довольно бесполезнав реальном приложении ..
для этого вы можете сократить время загрузки показа данных, используя нумерацию страниц

, исходя из вашей мощности, вы должны создать индекс

itemregistrations (operasiid, sectionid, categoryid)

может быть вам нужно удалить индекс для тех же столбцов и оставить только составной ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...