2016-07-13 8 views
0

私は多少新しくなっているので、誰かが助けてくれればすごいでしょう。SQLAlchemy-Marshmallowのクエリが遅くなり、JSONにシリアライズ

私は、私が取り組んでいるFlaskアプリケーション用にSQLAlchemyにいくつかのモデルを設定しました。私はアプリケーションを構築している間に私の呼び出しのどれが遅いのか驚いていますが、私はデータベース(現在はSQLite)にいくつかの偽のデータを埋め込んでいました。

私はメニューと呼ばれるDB内にテーブルを持っています。メニューには、子を持つセクション、子を持つセクション、アイテムがあります。

  • メニュー
    • セクション
      • アイテム

私は、4つのセクションを持っており、1つのメニューを照会しています対象:このようなそれぞれ10項目あります。

Flaskのルートでは、Menu.query.get(id)を使用してDBにクエリを行い、marshmallowを使用してJSONにシリアル化します。

私のローカルマシンに戻るには、何かが250ミリ秒かかっています。

私の質問は: 私は250msほど心配してばかげているのですか? 遅さの原因は何ですか? - スキーマ設計が不良ですか? - SQLite/SQL Dbを使用していますか? - 他に何か?

ご協力いただければ幸いです。

さらに、私はもともと2つのレベルをさらに深くしていましたが(アイテムには選択肢があるオプションがあります)、完了するまでには約1秒かかっていたので、ユーザーが特定のアイテムを要求したときに別のエンドポイントに移動しました。

答えて

1

すべてがローカルであるとすれば、私は250msが過度であることに同意します。この遅さの原因は、JSONを構築するために複数のSQLクエリが実行されていることが予想されます。

SQLAlchemy設定にSQLALCHEMY_ECHO = Trueを設定すると、生成されるSQLクエリが表示され、これを確認できます。

DBモデルは提供していませんが、リレーションシップが遅延ロードされている可能性があります。そのため、ツリー内の各オブジェクトに対して新しいSQLクエリが作成されています。詳細については、SQLAlchemyのドキュメントのRelationship Loading Techniquesセクションを参照してください。

子関係(つまり、メニュー - >セクションとセクション - >アイテム)をlazy='joined'に設定すると、デフォルトのSELECTの代わりにJOINを使用して子関係が読み込まれます。

+0

これらは遅延ロードされています。私は参加して何か改善があるかどうかを見直します。ありがとう。 – GMarsh

+0

うわー。それは確かに助けた。その変化を50〜75msまで抑えることができます。好奇心が強い、熱心なローディング対怠け者の欠点? – GMarsh

+0

データベースはJOINを実行しますので、より多くの作業を行いますが、クエリでデータが必要であることがわかっている場合は、データを取得するのが最も効率的です(別の '遅延クエリ'を実行する場合と比較して)。あるいは、デフォルトを遅延読み込みとして使用し、結合するクエリでjoinedload()オプションを使用することもできます。 – Naishy

関連する問題