Laravel, запрос для отображения больших данных выполняется медленно

#sql #laravel #performance #datatable

#sql #laravel #Производительность #datatable

Вопрос:

У меня есть страница для поиска пользователем данных из определенного диапазона дат, и она покажет результат в datatable, например ( ID , Audit type , user , new value old value и т.д.), И это было из 2-х табличных отношений.

Вот мой запрос:

 $audits = OwenItAuditingModelsAudit::with('user')
    ->orderBy('updated_at', 'DESC')
    ->where('created_at', '>=', $date1)
    ->where('created_at', '<=', $date2)
    ->get;
 

Проблема в том, что если объем данных большой, процесс такой медленный. Как оптимизировать запрос?

Я пытался использовать paginate(10) или take(10) , но он показывает только 10 данных, а не все данные.

Ответ №1:

Для повышения производительности на уровне базы данных создайте индекс в столбце, который отображается в ограничениях where .

Поэтому создайте индекс в created_at столбце.

Также для сравнения дат, почему бы не использовать whereDate вместо сравнения строковых литералов для дат

 $audits = OwenItAuditingModelsAudit::with('user')
    ->orderBy('updated_at', 'DESC')
    ->whereDate('created_at','>=',$date1)
    ->whereDate('created_at','<=',$date2)
    ->paginate(25);

 

После того, как запрос получает разбитые на страницы записи, представление может затем предоставить ссылки на разбивку на страницы для посетителей / пользователей для просмотра разбитых на страницы наборов результатов

 {{ $audit->links() }}
 

В links() представлении будут вставлены кнопки ссылок на разбивку на страницы, которые пользователи / посетители могут щелкнуть, чтобы перетасовать результирующие наборы.

Документы Laravel: https://laravel.com/docs/8.x/pagination#displaying-pagination-results

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