4

Web サイトの SQL ベースのアクティビティ フィードのパフォーマンスを改善する方法が必要です。Heroku で Django を使用しています。

現在、Django ORM で汎用外部キーを使用してアクティビティ フィードを実装する Django アプリである actstream を使用しています。基本的に、すべてのアクションには、次のように、そのアクターと、それが作用している可能性のあるオブジェクトへの一般的な外部キーがあります。

アクション: (クレイ-俳優) が (スターバックスのアンドリューのレビュー-ターゲット)に (コメント-アクション オブジェクト) を書きました

規模を拡大するにつれ、非常に遅くなりました。これは、大きくてコストのかかる SQL 結合に依存しているため、理解できます。

少なくとも 2 つのオプションがあります。

  1. SQL データベースの上に Redis レイヤーを配置し、そこからアクティビティ フィードを取得します。
  2. Django ORM を回避し、生の SQL ですべてのクエリを実行してみてください。これにより、パフォーマンスが向上することがわかっています。

これらの 2 つのいずれか、またはその他のアイデアについて考えがある人は、ぜひ聞いてみたいと思います。

4

3 に答える 3

1

レディスって言った?redis を使用すると、すべてが改善されます。

キャッシュは、ソフトウェア開発における最良のアイデアの 1 つです。マテリアライズド ビューを使用する場合は、それらをキャッシュすることも検討する必要があります。ユーザーは違いに気付くと思います。

于 2012-12-28T18:40:32.543 に答える
1

具体化されたビューを見たいと思うかもしれません。Heroku を使用していて、一般的に PostgreSQL を使用しているため、 Materialized View Support for PostgreSQL を見ることができます。他のデータベース サーバーほど成熟していませんが、私の知る限り、動作させることができます。Django ORM を使用するには、フィード用に新しい「エンティティ」を作成し (ここでは Django に慣れていないため、必要に応じて変更します)、テーブルであるかのようにクエリを実行する必要があります。ビューの手動管理は考慮事項であるため、コミットする前に注意深く調べてください。

お役に立てれば!

于 2012-12-28T17:19:23.823 に答える
1

2 つの提案を組み合わせたようなアプローチを採用しました。

データベース内のすべてのアクションのマスター リストを作成しました。これには、アクションに関して必要なすべての情報が含まれ、Redis に貼り付けられました。アクション ID を指定すると、Redis ルックアップを実行して、フロントエンドに返す準備ができているディクショナリ オブジェクトを取得できるようになりました。

また、ユーザーが利用できるさまざまなタイプのアクティビティ ストリームすべてに対応するアクション ID リストも作成しました。したがって、ユーザー ID が与えられると、彼の友人のアクティビティ、彼自身のアクティビティ、お気に入りの場所のアクティビティなどを検索できるようになります。(これらは PSQL ではなく Redis にありますが、マテリアライズド ビューにある程度対応していると思います。)

したがって、ユーザーのフィードをアクション ID のリストとして取得します。次に、マスター アクション リストの ID を検索して、これらのアクションの詳細を取得します。次に、フィードをフロントエンドに戻します。

提案をありがとう、皆さん。

于 2013-01-07T18:16:22.960 に答える