Laravel-datatables: Das Laden von Daten ist bei einer großen Anzahl von Zeilen sehr langsam.

Erstellt am 8. März 2017  ·  14Kommentare  ·  Quelle: yajra/laravel-datatables

Zusammenfassung des Problems oder der Funktionsanfrage


Ich habe versucht, Datatable mit Laravel zu implementieren, aber ich habe ein Problem, wenn meine Tabelle eine große Anzahl von Zeilen hat, weil Datatable ALLE in einer Anfrage bekommt und dann die Paginierung auf der JS-Seite ist. Kann ich die Laravel-Paginierung verwenden oder kann ich paginierte Zeilen mit der Methode paginate() von Eloquent auf der Ajax-Methode zurückgeben? Denn das ist ein großes Problem für mein Projekt. Das Laden von Daten ist sehr langsam. Wenn ich suche, ist eine Textverarbeitung auch sehr langsam und nach einigen Operationen wie sort , search usw. friert die Seite ein und nichts passiert.
Ich hoffe, dass jemand das gleiche Problem wie dieses hat.

Codeschnipsel des Problems

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

Systemdetails

  • Betriebssystem Linux
  • PHP-Version 7.0.4
  • Laravel-Version 5.4
  • Laravel-Datentabellen Version 7.2

Hilfreichster Kommentar

Sie müssen get entfernen, um den Abfragegenerator verwenden zu können.

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

Alle 14 Kommentare

Verwenden Sie möglicherweise eine Sammlung anstelle einer Abfrage? Können Sie Ihren serverseitigen Code einfügen? Danke!

Ich verwende Repository-Muster und in meiner LanguageRepository.php habe ich:
return $this->languages->select('languages.*')->get();

Sie müssen get entfernen, um den Abfragegenerator verwenden zu können.

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

Okay. Jetzt sieht es besser aus. Ich werde es nochmal testen und meine Ergebnisse schreiben.
Aber in der Zwischenzeit gibt es ein weiteres Problem. Wenn ich versuche, ein Wort zu suchen, erhalte ich diesen Fehler:

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)

Aktion als nicht durchsuchbar/bestellbar festlegen, da die Spalte hinzugefügt wurde.

Danke sehr! @yajra
Wenn ich mit dem Testen fertig bin, schicke ich Ihnen die Ergebnisse

Meine Testergebnisse:

Erste Abfrage:
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

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

Danke @yajra noch einmal für die Hilfe.

Schön, dass ich helfen konnte! Danke!

Ich leide unter dem Problem. Langsames Rendern. Meine serverseitige Abfrage.

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

Hilf mir. Soll ich mein eigenes Skript zum Paginieren schreiben? was soll ich machen?
Ich habe Aufzeichnungen über mehr als 4.000.000 Produkte.
@yajra sehr dankbar, wenn du mir hilfst.

Ich habe diese auch bekommen, kann es sein, dass die Datentabellenanforderung den Paginierungsparameter nicht mit der Abfrage verkettet?

@pnghai wie kann ich das überprüfen?

@hsali tut mir leid. Falscher Alarm. Es stellte sich heraus, dass meine Logik einen entfernten Bildabruf beinhaltete, der eine Verbindung zu einem Sackgassenserver herstellt und jeden Datensatz erzwingt, eine falsche 404-Verbindung abzurufen, die die Anzahl der Datensätze * 60 (Sekunden vor dem Timeout) belegt. Ich habe diese Logik aufgehoben und die Dinge funktionieren jetzt sehr gut.

Danke sehr
(p/s: Der Pnghai-Nick ist ein weiterer Github-Account von mir)

@pnghai wie kann ich das überprüfen?

Konntest du das lösen? Wenn ja, wie?

Für alle, die langsam laden, haben Sie möglicherweise eine Art Schleife in Ihrer Controller-Funktion, die die abgerufenen Datensätze auf irgendeine Weise wiederholt.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen