0

多くのネストされた SELECT ステートメントを含む大きなクエリがあります。簡略化されたバージョンは次のようになります。

SELECT * FROM tableA WHERE x IN(
   SELECT * FROM tableB WHERE x IN(
       SELECT * FROM tableC WHERE user_id = y
   )
)

重要なことに、最も内側のステートメントは、user_id を見て、クエリの残りの部分で使用する ID 番号のリストを選択することから始まります。

私が抱えている問題は、2 人のユーザーが tableC に同じデータを持っていても、残りのクエリがキャッシュされていないように見えることです。

たとえば、SELECT * FROM tableC WHERE user_id = 1(1,2,3,4,5) を返し、(1,2,3,4,5)SELECT * FROM tableC WHERE user_id = 2も返す場合

user_id = 1 で完全なクエリを実行すると、実行時間は約 0.007 秒です。クエリを再実行すると、実行時間が 0.002 短縮されます。user_id を 2 に変更してクエリを実行すると、クエリの初回実行時に実行時間が 0.007 に戻ります。mySQL がクエリの個々の部分の結果をキャッシュすることは可能ですか?

4

1 に答える 1

0

mysqlを使っているようです。したがって、クエリ 'SELECT * FROM tableC WHERE user_id = 1' を初めて実行すると、結果 '1,2,3,4,5' が得られ、クエリはクエリ キャッシュに移動します。したがって、2 回目の実行後の実行時間は、1 回目の実行よりも短くなります。この場合、結果は最初のクエリに関連付けられます。2 番目のクエリを実行すると、サーバーはそれについて何も知りません。したがって、それを実行して何かを返します(あなたの場合、結果は同じです)。次に 2 番目のクエリを実行すると、クエリ キャッシュから取得され、非常に高速になります。とにかく、サーバーは 2 つの異なるレコードをクエリ キャッシュに格納します。

于 2013-07-20T14:23:14.513 に答える