2017-01-19 8 views
0

かなり大きなWebサイトを構築しているときにSilverStripeがデータベースの使用状況を見て、適切に拡大縮小できるようにしたいと考えました。単純なページのデータベース読み込み

私は現時点では非常に単純なページを持っていますが、それを構築するためにいくつかの質問があったのは間違いありません。私は、データベースにログオンして、何が要求されているかを確認しました。私は(私が行うもの)は問題かもしれないと思った

クエリは、その多くの場合ではありませんが、データベースは次のように約50のクエリがあります。

SELECT conname,pg_catalog.pg_get_constraintdef(r.oid, true) 
FROM pg_catalog.pg_constraint r WHERE r.contype = 'c' AND conname = $1 ORDER BY 1; 

約10 SiteTreeためのクエリと約10をメンバーのために今は問題ではありませんが、各ページに約100のクエリがロードされている場合(これらのクエリの上に他のクエリがある場合)、私は起動時にいくつかの問題が生じるでしょう。

これらのすべてのクエリの原因は何ですか?私はそれらを下げるために何か、特に上のものをすることができますか?私がしなければ

また、:

$data = DataObject::get()->filter('field1' => 'value1'); 
if ($data->exists()) { 
    $one = $data->filter('field2' => 'value2'); 
    // do something 
    $two = $data->filter('field2' => 'value3')->First(); 
    echo $two->Has_One_Field()->Field //accessing a has_one relationship 
    //do something 
} 

は、その結果は4つのクエリまたはちょうど1及び2つの他のフィルタにちょうど、すでに生産されてDataListのthatsを検索しているのだろうか?

+0

私には早すぎる最適化とよく似ています。これらのクエリをパフォーマンスのボトルネックと特定/テストしましたか? – bummzack

+0

@bummzackいいえ、パフォーマンスが非効率性に基づいて構築されている可能性があります。 – Rudiger

答えて

3

まず、メンバーとしてログインすると、それらのメンバークエリーが実行されます。ログインしていない場合、これらのクエリは実行されないため、10個のクエリが節約されます。

新たに追加されたそれぞれのフィルタは、最後のクエリを実際に実行していない新しいDataListを返すだけです。あなたの例はうまくいかないが、$ 2はDataListであり、DataObjectではない。実際のアイテムを入手するには、$two->HasOneObject()->Fieldを実行する必要がありますが、それは別にしてください。

これらのクエリを減らすには、キャッシングを検討するとよいでしょう。しかし正直言って、私はあまり心配してはいけません。データベースは、この種のものを意味します。実際にそれらをPHPでオブジェクトとしてロードした場合、メモリを食い込むようになるため、問題は悪化します。

別のオプションは、ページを拡張し、特定のクエリの結果を変数ArrayListオブジェクトにキャッシュすることで、メモリからそれらをフィルタリングすることができます。理論的には、これは高速ですが、PHPがより多くの作業を行う必要があり、PHPが大きくなると処理が遅くなります。

+0

申し訳ありませんが、私はそのクエリを更新しました、それは単に私がやっていることを示すためのものでした。私の2番目の質問について、あなたが言ったことから、exist()は1つのリクエストをトリガし、$ 1のフィルタは(私がそれに何をするかによって)2番目のトリガをトリガし、エコーをやった。そうですか? – Rudiger

+0

また、ユーザーがその段階でサインインしているので、私が付ける必要があるメンバークエリーが、最初のクエリーでは、なぜ実質的に同じクエリーが50であるのか理解できません。 – Rudiger

+0

はい、存在が最初のリクエストを行います。最後の2ドルで2回目のリクエストが行われます。 –

関連する問題