Laravel-datatables: Загрузка данных очень медленная для большого количества строк.

Созданный на 8 мар. 2017  ·  14Комментарии  ·  Источник: yajra/laravel-datatables

Краткое изложение проблемы или запроса функции


Я пытался реализовать Datatable с Laravel, но у меня проблема, когда в моей таблице большое количество строк, потому что Datatable получает ВСЕ в одном запросе, а затем разбиение на страницы выполняется на стороне JS. Могу ли я использовать разбивку на страницы Laravel или вернуть строки с разбивкой на страницы с помощью метода paginate() из Eloquent по методу ajax? Потому что это большая проблема для моего проекта. Загрузка данных очень медленная. Когда я ищу, обработка некоторых текстов также очень медленная, и после некоторых операций, таких как sort , search и т. д. Страница зависает, и ничего не происходит.
Я надеюсь, что у кого-то есть такая же проблема, как это.

Фрагмент кода проблемы

                serverSide: true,
                processing: true,
                render: true,
                columns: [
                    {data: 'code'},
                    {data: 'name', "defaultContent": "<i>Not set</i>"},
                    {data: 'native_name',  "defaultContent": "<i>Not set</i>"},
                    {data: 'action'}
                ],
                ajax: '{!! route('dt-languages') !!}'

Детали системы

  • Операционная система Линукс
  • PHP версии 7.0.4
  • Ларавель версии 5.4
  • Laravel-Datatables Версия 7.2

Самый полезный комментарий

Вам нужно удалить get, чтобы использовать построитель запросов.

return $this->languages->select('languages.*');

Все 14 Комментарий

Возможно, вы используете коллекцию вместо запроса? Можете ли вы вставить свой серверный код? Спасибо!

Я использую шаблон репозитория, и в моем LanguageRepository.php у меня есть:
return $this->languages->select('languages.*')->get();

Вам нужно удалить get, чтобы использовать построитель запросов.

return $this->languages->select('languages.*');

Хорошо. Теперь выглядит лучше. Буду тестировать еще раз и отпишусь о результатах.
Но пока есть еще одна проблема. Когда я пытаюсь найти какое-то слово, я получаю эту ошибку:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'languages.action' in 'where clause' (SQL: select count(*) as aggregate from (select '1' as `row_count` from `languages` where (LOWER(`languages`.`name`) LIKE %m% count_row_table)

Установите действие как недоступное для поиска/упорядочивания, так как это добавленный столбец.

Большое спасибо! @yajra
Когда я закончу с тестированием, я отправлю вам результаты

Мои результаты тестирования:

Первый запрос:
select count(*) as aggregate from (select '1' as row_count from languages where languages.deleted_at is null and languages.deleted_at is null) count_row_table -> 3,64 мс

Второй запрос:
select languages.* from languages where languages.deleted_at is null order by code asc limit 10 offset 0 -> 1,05 мс

Еще раз спасибо @yajra за помощь.

Рад, что смог помочь! Спасибо!

Я страдаю от проблемы. Медленный рендеринг. Мой запрос на стороне сервера.

 $products = DB::connection("mysql2")->table('products')->
        join('products_description', 'products.products_id', '=', 'products_description.products_id')
            ->select(['products.products_id', 'products_description.products_name', 'products.products_isbn13', 'products.products_distributor', 'products.products_price', 'products.products_status']);
 return Datatables::of($products)->make(true);

Помоги мне. Должен ли я написать свой собственный скрипт для разбиения на страницы? Что я должен делать?
У меня есть записи о более чем 4 000 000 товаров.
@yajra очень признателен, если вы мне поможете.

Я тоже получил это, может быть, запрос с данными не связывает параметр разбиения на страницы с запросом?

@pnghai , как я могу это проверить?

@hsali Прости. Ложная сигнализация. Оказалось, что моя логика включала удаленную выборку изображения, которая ссылается на тупиковый сервер и заставляет каждую запись извлекать неправильное соединение 404, что занимает количество записей * 60 (секунд до тайм-аута). Я приостановил эту логику, и теперь все работает очень хорошо.

Спасибо большое
(p/s: ник pnghai — это еще один мой аккаунт на github)

@pnghai , как я могу это проверить?

Вы смогли это решить? Если да, то как?

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

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

jackrsantana picture jackrsantana  ·  3Комментарии

SGarridoDev picture SGarridoDev  ·  3Комментарии

ghost picture ghost  ·  3Комментарии

vipin733 picture vipin733  ·  3Комментарии

sangnguyenplus picture sangnguyenplus  ·  3Комментарии