、私は大体このようなクエリを構築していますDrupalの6、PHP 5.3、とMySQLでの作業:埋め込みMySQLの選択を何度も「キャッシュ」できますか?
SELECT val from table [and some other tables joined in below]
where [a bunch of clauses, including getting all the tables joined up]
and ('foo' not in (select ...))
and (('bar' in (select...) and x = y)
or ('baz' in (select ...) and p = q))
私が何をしようとしているの偉大な表現ではないですが、うまくいけば、それは意志足ります。要点は、クエリの途中に何度も使用される埋込みSELECTがあることです。それは常に同じです。完全に自己完結型ではありません。クエリの最上位にあるテーブルの1つから引き出された値に依存します。
は、私はちょうどそれが必要なのたびにクエリを繰り返すために少しは/罪悪汚れた感じているが、私は一度値を計算し、必要に応じて再利用する他の方法が表示されません。それが最上位レベルのテーブルから値を参照するので、私は、MySQL変数を介して、またはクエリ文字列の周りmonkeyingいずれかによって、クエリ外一度計算するだけクエリに値を挿入することができません。とにかく、とにかく、私は思う。
私はこれについて何かできることはありますか?コードは厄介かもしれませんが、MySQLは値自体をキャッシュし、何度も何度もクエリを実行しないように十分にスマートであるparhaps:または、多分それはパフォーマンスの観点から非問題ですか?何かアドバイス?ありがとう!
なぜ関数呼び出しでそのテストをオンにしませんか? 'FoundInTable( 'foo')とNot FoundInTable( 'bar')とFoundInTable( 'baz')'? –
説明から、依存サブクエリがあるようです。悪いニュース:パフォーマンスにはあまり効果がありません(これはおそらく目にしています)。良いニュース:ほとんどの場合、これははるかに速い 'JOIN'に書き直すことができます。私たちはもう少し詳細を見る必要があります。 – Mchl
Thxの両方。 @BradChristie:私は、ストアドプロシージャに関する私をhanstringingさはDrupal 6、中だ(私が最初に考えたが、D6はmysqliのを使用するようにコアをハックすることなく、それらをサポートしていません)。 Mchi:あなたは両方のアカウントの権利です。私はそれをモンスターの参加として考えることにします。 –