5

最初の実行で18秒、後続の実行で4秒実行される低速のデータベースクエリがあります。「コールドスタート」実行時間を最適化しようとしています。しかし、それを継続的に再現することはできません。

select SQL_NO_CACHEディレクティブは役に立ちません。

以下のコマンドはいずれも、18秒後に実行されません。

FLUSH QUERY CACHE;
RESET QUERY CACHE;
FLUSH TABLES;

データベースを再起動しても、データベースが再び長く実行されることはありません。

キャッシュをフラッシュする他のコマンドはありますか?

テーブルエンジンはInnoDBです。

4

2 に答える 2

9

なぜ役に立たないのか説明させてください。

Your Requirement:ここでは、同じクエリを再度実行しようとしていますが、キャッシュをクリーンアップするだけで、最初の実行と同じように実行する必要があります。

クエリを実行すると、複数の種類のキャッシュが表示されます。「クエリキャッシュ」は、私たちが話している最も一般的なキャッシュです。次に、MySQLキャッシュ(たとえば、Innodbバッファプール)、table_cache(MySQLレベルおよびInnoDBレベルでも)、OSキャッシュ、ハードウェアキャッシュがあります。

select SQL_NO_CACHE :これにより、クエリを実行して「クエリキャッシュ」を保存できなくなります。つまり、「クエリキャッシュ」を持たない同じクエリを再度実行すると、他のキャッシュが表示されます。

FLUSH QUERY CACHE :これは、「クエリキャッシュ」を最適化して、メモリをより有効に活用するだけです。

RESET QUERY CACHE :「クエリキャッシュ」からすべてのクエリ結果を削除します。これは、以前のすべてのクエリで「SQL_NO_CACHE」を使用した場合には影響しません。

  • あなたが試みていることに加えて、あなたがこれらのキャッシュを避けるために試みることができる他のいくつかのこと。
  • MySQLの再起動は「MySQLキャッシュ」(Innodbバッファープール)に必須であり、他の方法はありません。
  • グローバルkey_buffer_size=0を設定します。キーバッファサイズをゼロにする
  • グローバルquery_cache_type=0を設定します。
  • グローバルquery_cache_size=0を設定します。
  • OSレベルのキャッシュ:この投稿はあなたを助けるかもしれません
于 2015-05-05T06:19:56.193 に答える
0

私は通常、ユーザー定義変数をクエリに追加して、クエリキャッシュをスキップするようにします。ただし、そのような方法でコールドスタートをエミュレートできるかどうかはわかりません。

SELECT a.* 
FROM a, (SELECT @a:=NULL) as foo;
于 2013-03-07T09:58:40.640 に答える