2016-07-13 5 views
0

Ich bin etwas neu zu diesem Thema, wenn jemand mir helfen kann, wäre das genial.SQLAlchemy-Marshmallow langsam zu JSON Abfrage und Serialisierung

Also habe ich einige Modelle in SQLAlchemy für eine Flask-App eingerichtet, an der ich arbeite. Ich habe die db (derzeit SQLite) mit einigen gefälschten Daten gefüllt, während ich die App baue und bin irgendwie überrascht, wie langsam einer meiner Anrufe ist.

Ich habe eine Tabelle in der DB namens Menü. Die Speisekarte hat ein Kind, Abschnitte, die ein Kind, Elemente hat. wie folgt aus:

  • Menü
    • Sections
      • Artikel

Das Objekt I bin abfragt, 1 Menü, die 4 Abschnitte hat, die Jeder hat 10 Gegenstände.

In meiner Flask-Route frage ich die DB mit Menu.query.get (id) und serialisieren sie mit Marshmallow zu JSON.

Ganze Sache dauert 250ms geben oder nehmen auf meinem lokalen Rechner zurück.

Also meine Frage (n) ist/sind: Ich bin ich dumm in Sorgen über 250ms? Was ist der Schuldige für die Langsamkeit? - Schlechtes Schemadesign? - SQLite/Verwenden eines SQL Db? - Etwas anderes?

Jede Hilfe würde sehr geschätzt werden.

Zusätzlich. Ich hatte ursprünglich 2 Ebenen tiefer (Elemente haben Optionen, die Auswahlmöglichkeiten haben), aber es dauerte ungefähr eine volle Sekunde, um sie abzuschließen, also habe ich diese auf einen separaten Endpunkt verschoben, wenn der Benutzer ein bestimmtes Objekt anfordert.

Antwort

1

Ich würde zustimmen, dass 250ms übermäßig ist, da alles lokal ist. Ich erwarte, dass die Ursache der Langsamkeit ist, dass mehrere SQL-Abfragen ausgeführt werden, um den JSON zu erstellen.

Einstellung SQLALCHEMY_ECHO = True auf die SQLAlchemy-Konfiguration zeigt Ihnen die SQL-Abfragen generiert werden und bestätigen Sie dies.

Sie haben Ihre DB-Modelle nicht bereitgestellt, aber möglicherweise stellen Sie fest, dass Ihre Beziehungen Lazy-geladen sind und daher für jedes Objekt in der Struktur eine neue SQL-Abfrage erstellt wird. Weitere Informationen finden Sie im Abschnitt Relationship Loading Techniques der SQLAlchemy-Dokumentation.

Einstellung lazy='joined' auf die untergeordnete Beziehung (d. H. Menü -> Abschnitt und Abschnitt -> Elemente) wird die untergeordnete Beziehung geladen werden mit einem JOIN anstelle der Standard-SELECT geladen.

+0

werden sie faul geladen. Ich werde mich umstellen und schauen, ob es Verbesserungen gibt. Vielen Dank. – GMarsh

+0

wow. das hat sicherlich geholfen. bis zu 50-75ms bei dieser Änderung. nur neugierig, irgendwelche Nachteile auf eifrig laden vs faul? – GMarsh

+0

Die Datenbank wird einen JOIN durchführen, so dass mehr Arbeit geleistet wird, aber wenn Sie wissen, dass die Daten von der Abfrage benötigt werden, ist dies der effizienteste Weg, um die Daten zu erhalten (im Gegensatz zu einer separaten "Lazy" -Abfrage).Alternativ können Sie den Standard als lazy loading verwenden und die Option jointeload() für Abfragen verwenden, die Sie verknüpfen möchten. – Naishy