MySQL-クエリのテスト速度のためにキャッシュを使わないことを強制


343

MySQLでいくつかのクエリの速度をテストしています。データベースがこれらのクエリをキャッシュしているため、これらのクエリの速度をテストするときに信頼できる結果を得ることが難しくなっています。

クエリのキャッシュを無効にする方法はありますか?

システム:Linux Webホスティング上のMySQL 4、PHPMyAdminにアクセスできます。

ありがとう

mysql 

回答:


527

クエリでSQL_NO_CACHE(MySQL 5.7)オプションを使用してみてください。(MySQL 5.6ユーザーはこちらをクリックしてください)

例えば。

SELECT SQL_NO_CACHE * FROM TABLE

これによりMySQLは結果のキャッシュを停止しますが、他のOSおよびディスクキャッシュもパフォーマンスに影響を与える可能性があることに注意してください。これらは回避するのが難しいです。



4
mysqlクエリキャッシュに関する素晴らしい記事。キャッシュを設定して実際の動作を確認する方法!読む価値があります。databasejournal.com/features/mysql/article.php/3110171/...
エイドリアンP.

1
パフォーマンスを向上させる前に、mysqlサーバーを再起動してみてください。一部のプロセスがすべてに影響している可能性があります。それは私に起こりました。問題とは直接関係のないコメントですが、多くの人に役立ちます。
dellasavia 14

2
これは結果のキャッシュを停止しますが、キャッシュの使用も停止しますか?
ブレット

3
@ブレットは、11年にSalmanPKのコメントを参照してください。そのドキュメントページは文字通り4文であり、質問に直接回答します。今後ページが削除される場合:「クエリキャッシュをチェックして、結果が既にキャッシュされているかどうかを確認することも、クエリ結果をキャッシュすることもありません。」
モーリス

121

現在の接続のみに影響を与える別の選択肢:

SET SESSION query_cache_type=0;

私の悪い。それはだったquery_cache_size、私が見ていたではありませんquery_cache_type。私はあなたのものとSeniorDevの答えを混同していた。
マイク


30

設定オプションもあります:query_cache_size = 0

サーバーの起動時にクエリキャッシュを無効にするには、query_cache_sizeシステム変数を0に設定します。クエリキャッシュコードを無効にすることで、顕著なオーバーヘッドはありません。MySQLをソースからビルドする場合、-without-query-cacheオプションでconfigureを呼び出すことにより、クエリキャッシュ機能をサーバーから完全に除外できます。

http://dev.mysql.com/doc/refman/5.1/en/query-cache.htmlを参照してください


24

followコマンドを実行してクエリキャッシュをリセットすることもできます。

RESET QUERY CACHE

9
これはおそらくやり過ぎです...理想的には、MySQLに一時的にキャッシュを無視させたいだけです。
BMiner

3
これには特別な権限も必要です。
エリックロバートソン

19

の1つの問題

SELECT SQL_NO_CACHE * FROM TABLE

メソッドは、クエリの結果がキャッシュされるのを防ぐだけのようです。ただし、テストするクエリでアクティブに使用されているデータベースをクエリしている場合、他のクライアントがクエリをキャッシュし、結果に影響を与える可能性があります。私はこれの周りの方法を研究し続けています、私が見つけたらこの投稿を編集します。


1
しかし、キャッシュが他の人によっていっぱいになると、高速であるかのような錯覚に陥ります。しかし、時にはそうではありません。
karatedog

14

以下を使用します。

SHOW VARIABLES LIKE 'query_cache_type';
SET SESSION query_cache_type = OFF;
SHOW VARIABLES LIKE 'query_cache_type';

3

クエリ内でユーザー定義変数を使用すると、クエリがキャッシュ不可能になります。私はそれを使用するよりもはるかに良い指標を見つけましたSQL_NO_CACHE。ただし、変数の設定がパフォーマンスに重大な影響を与えない場所に変数を配置する必要があります。

SELECT t.*
FROM thetable t, (SELECT @a:=NULL) as init;

3
「私はそれを使用するよりもはるかに良い指標だと思いましたSQL_NO_CACHE。」どうして?明示的なキーワードが主張していることを実行していない場合を除き、明示的なキーワードに対してあいまいなハックを使用するには、かなり強力なケースが必要と思われます。
Air

1
@AirこのソリューションはSQL_NO_CACHEよりもうまく機能することがわかりました。SQL_NO_CACHEは初めてクエリを実行したときに機能しましたが、その後は再び機能しませんでした。これはキャッシュの他のメカニズムによるものだと思います。変数に依存する検索は、どのレイヤーやメカニズムでもキャッシュできないため、これはうまくいくと思います。少なくとも、それが私の推測です。
Klik

2

クエリキャッシュを無効にする場合は、mysql構成ファイルで 'query_cache_size'を0に設定します。セット0の場合、mysqlはクエリキャッシュを使用しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.