0

MySQL を使用すると、次のようなクエリがいくつかあります。

SELECT * FROM table_name WHERE some_clause ORDER BY id LIMIT 1000 OFFSET 0
SELECT * FROM table_name WHERE some_clause ORDER BY id LIMIT 1000 OFFSET 1000
SELECT * FROM table_name WHERE some_clause ORDER BY id LIMIT 1000 OFFSET 2000
SELECT * FROM table_name WHERE some_clause ORDER BY id LIMIT 1000 OFFSET 3000

等々。重要な点は、結果セットをページ分割していることです。各オフセットは一度しか実行されないため、キャッシュしても意味がありません。ただし、最終的にはすべての結果を反復処理します。この状況でクエリキャッシュを汚染することは非常に心配です。

SQL_NO_CACHE を追加すると、MySQL は結果のキャッシュを停止します。特定の結果セットはそれぞれ 1 回しか使用されないため、これが最も効率的ですか? それとも、MySQL は結果セット全体を 1 回キャッシュし、各リクエストで制限とオフセットに基づいてサブセットをプルするほどスマートですか?

つまり、SQL_NO_CACHE を使用しない場合、上記の 4 つの SQL ステートメントの例では、1 つのクエリと 3 つのキャッシュされた応答が生成されるのでしょうか? それとも 4 つの個別のキャッシュされないクエリが生成されるのでしょうか?

4

1 に答える 1

1

クエリ キャッシングに関する MySQL のドキュメントによると、「後で同一のステートメントを受信した場合、サーバーはステートメントを再度解析して実行するのではなく、クエリ キャッシュから結果を取得します。」

具体的には、次の 2 つのステートメントは、大文字と小文字のみが異なる場合でも異なると見なされるため、キャッシュされません。

SELECT * FROM tbl_name
Select * from tbl_name

そのため、上記の私の質問では、SQL_NO_CACHE を追加することが正しいことであることは明らかです。MySQL のクエリ キャッシュはここでは役に立たないからです。

于 2012-09-25T18:05:48.510 に答える