Laravel-datatables: O carregamento de dados é muito lento para um grande número de linhas.

Criado em 8 mar. 2017  ·  14Comentários  ·  Fonte: yajra/laravel-datatables

Resumo do problema ou solicitação de recurso


Tentei implementar Datatable com Laravel, mas tenho problema quando minha tabela tem grande número de linhas porque Datatable obtém ALL em uma solicitação e, em seguida, a paginação está no lado JS. Posso usar a paginação do Laravel ou posso retornar linhas paginadas com o método paginate() do Eloquent no método ajax? Porque este é um grande problema para o meu projeto. O carregamento de dados é muito lento. Quando eu pesquiso algum processamento de texto também é muito lento e depois de algumas operações como sort , search etc. Congelamento de página e nada acontece.
Espero que alguém tenha o mesmo problema como este.

Trecho de código do problema

                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') !!}'

Detalhes do sistema

  • Sistema operacional Linux
  • PHP Versão 7.0.4
  • Laravel Versão 5.4
  • Laravel-Datatables Versão 7.2

Comentários muito úteis

Você precisa remover get para usar o construtor de consultas.

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

Todos 14 comentários

Você pode estar usando coleção em vez de consulta? Você pode colar seu código do lado do servidor? Obrigado!

Eu uso o padrão de repositório e no meu LanguageRepository.php eu tenho:
return $this->languages->select('languages.*')->get();

Você precisa remover get para usar o construtor de consultas.

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

Ok. Agora parece melhor. Vou testá-lo novamente e escreverei meus resultados.
Mas, entretanto, há mais um problema. Quando tento pesquisar alguma palavra, recebo este erro:

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)

Defina a ação como não pesquisável/ordenável, pois é uma coluna adicionada.

Muito obrigado! @yajra
Quando eu terminar os testes, enviarei os resultados para você

Meus resultados de teste:

Primeira consulta:
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 ms

Segunda consulta:
select languages.* from languages where languages.deleted_at is null order by code asc limit 10 offset 0 -> 1,05 ms

Obrigado @yajra mais uma vez pela ajuda.

Que bom que pude ajudar! Obrigado!

Estou sofrendo com o problema. Renderização lenta. Minha consulta do lado do servidor.

 $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);

me ajude. Devo escrever meu próprio script para paginar? O que devo fazer?
Tenho registros de mais de 4.000.000 de produtos.
@yajra agradeço muito se você me ajudar.

Eu também tenho este, pode ser que a solicitação de tabela de dados não encadeie o parâmetro de paginação à consulta?

@pnghai como posso verificar?

@hsali me desculpe. Alarme falso. Acontece que minha lógica envolvia uma busca remota de imagem, que se conecta a um servidor sem saída e força cada registro a buscar uma conexão 404 errada, que ocupa o número de registro * 60 (segundos antes do tempo limite). Eu suspendi essa lógica e as coisas funcionam muito bem agora.

Muito obrigado
(p/s: o nick pnghai é outra conta minha no github)

@pnghai como posso verificar?

Você conseguiu resolver isso? Se sim, como?

Para qualquer um que tenha um carregamento lento, você pode ter algum tipo de loop em sua função de controlador que faz um loop nos registros buscados de alguma forma.

Esta página foi útil?
0 / 5 - 0 avaliações