#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
Для больших наборов данных / записей в таблицах базы данных всегда целесообразно запрашивать результирующие наборы с разбивкой на страницы, чтобы уменьшить использование памяти.