3

私は Symfony を初めて使用し、すぐに退職した人から会社の Symfony 1.4 (Propel ORM) プロジェクトを引き継ぎました。

私は jobeet チュートリアルを経て、一般的に Symfony に慣れました。プロジェクトはもうすぐ終了しますが、ログを見ると、ページごとに多くのクエリが実行されていることがわかります。多くのページで、クエリがループ内で実行されています。私の経験によると、SQL クエリをループで実行する必要はありません。

これにより、プロジェクトのリリース後のパフォーマンスが心配になりました。

jobeet のチュートリアルなどでは、symfony 1.4/propel を使用したデータベースの最適化についてあまり見つけられませんでした。Symfony 1.4 のデータベースとパフォーマンスの最適化に関する適切なチュートリアル/ガイドラインはありますか (proper を使用)

どこから、最適化フェーズを開始する必要がありますか。私は基本的に、いくつかのリンクと、他の経験豊富な symfony 開発者がプロ​​ジェクトを最適化する方法を知りたいと思っています。

4

1 に答える 1

1

私は、(Symfony 1.* での私の経験から) 問題が Propel の join の貧弱なサポートに関係していることに賭けても構わないと思っています。最近のバージョンでは実際に改善されていますが、Criteria または Peer クラスを使用している場合は、古いバージョンを使用しており、この問題が発生する可能性があることを示しています。

データベースから一連のレコードを取得するクエリを実行するとします。そのテーブルが別のテーブルと 1 対多のリレーションシップを持っている場合は、別のクエリを実行してそれらの関連付けられたレコードを取得する必要があります。多対 1 または 1 対 1 の関係がある場合、「doSelectJoin」ピア メソッドを使用すると、そのプロセスをより効率的に行うことができます。

例を挙げる必要があるかもしれません: オンライン書店があり、スキーマに 3 つのテーブル (本、著者、出版社) があるとします。

  1. 1 つの本に複数の著者を含めることができます。
  2. 1 つの本に発行者を 1 人だけ指定できます。

book テーブルに対してクエリを実行して、すべての book オブジェクトを取得する場合。「doSelectJoin」メソッドを使用してすべての書籍オブジェクトを返すことができ、関連する出版社を取得するために追加のクエリは必要ありません。これらは book で水和されます。つまり、 $book->getPublisher() は別のクエリを実行しません。ただし、その本に関連付けられている著者を取得したい場合。次に、関数 $book->getAuthors() を初めて呼び出すと、別のクエリが実行されます (同じオブジェクトに対する getAuthor メソッドへの後続の呼び出しでは、関連する著者オブジェクトが遅延ロードされ、別のクエリは必要ありません)。ただし、1 ページに 50 冊の本を表示している場合、本の著者も表示するには、さらに 50 のクエリを実行する必要があります。

于 2012-10-03T07:18:13.030 に答える