あなただけでクエリキャッシュを無効にする必要があります
[mysqld]
query_cache_size = 0
その後、mysqlを再起動します。なぜ私はそれを提案するのですか???
クエリキャッシュは、常にInnoDBに突き当たります。変更が他のトランザクションの反復可能な読み取りに影響しない場合、InnoDBのMVCCがクエリキャッシュからクエリを提供できるようにすると便利です。残念ながら、InnoDBはそれを行いません。どうやら、かなり早く無効化され、おそらく再利用されないクエリがたくさんあります。
MySQL 4.0のInnoDBの場合、クエリキャッシュはトランザクションに対して無効にされていました。MySQL 4.1+の場合、テーブルごとにクエリキャッシュへのアクセスを許可すると、InnoDBはトラフィック警官を再生します。
あなたの質問の観点から、クエリキャッシュを削除する正当化はオーバーヘッドではなく、InnoDBがどのように管理するかということです。
InnoDBがクエリキャッシュと対話する方法の詳細については、書籍「High Performance MySQL(Second Edition)」の 213-215ページを参照してください。
データのすべてまたは大部分がMyISAMである場合、SQL_NO_CACHEを使用するという元のアイデアを使用できます。
InnoDBとMyISAMが混在している場合、キャッシュミスの大きさに基づいて、アプリケーションに適切なバランスを見つける必要があります。実際、同じ本のページ209-210はキャッシュミスの理由を指摘しています:
- クエリには、非決定的な構造(CURRENT_DATEなど)が含まれているか、結果セットが大きすぎて格納できないため、クエリはキャッシュできません。
- サーバーは以前にクエリを見たことがないため、結果をキャッシュする機会がありませんでした。
- クエリの結果は以前にキャッシュされましたが、サーバーはそれを削除しました。これは、それを保持するのに十分なメモリがなかった、誰かがサーバーにそれを削除するように指示した、または無効にされたために発生する可能性があります
キャッシュできないクエリがほとんどない場合のキャッシュミスの根本的な原因は次のとおりです。
- クエリキャッシュはまだウォームではありません。これは、サーバーが結果セットでキャッシュを埋める機会がなかったことです。
- サーバーは、これまでに見たことのないクエリを見ています。クエリの繰り返しが多くない場合は、キャッシュがウォームアップされた後でも発生する可能性があります。
- 多くのキャッシュ無効化があります。
更新2012-09-06 10:10 EDT
最新の更新情報を見ると、query_cache_limit
1048576(1M)に設定されています。これにより、結果セットが1Mに制限されます。より大きなものを取得した場合、単にキャッシュされません。あなたがきているがquery_cache_size
104857600(100M)に設定され、これが唯一の完璧な世界に設定された100のキャッシュされた結果が可能になります。何百ものクエリを実行すると、断片化がかなり早く発生します。また、最小サイズの結果セットとして4096(4K)があります。残念ながら、mysqlにはクエリキャッシュを最適化するための内部メカニズムがありません。
クエリキャッシュが必要で、RAMが非常に多い場合は、次を実行できます。
SET GLOBAL query_cache_size = 0;
SELECT SLEEP(60);
SET GLOBAL query_cache_size = 1024 * 1024 * 1024;
クエリキャッシュをパージするため。キャッシュされた結果はすべて失われるため、これらの行はオフピーク時に実行してください。
また、次のものを割り当てます。
- query_cache_size = 1G
- query_cache_limit = 8M
これにより、23GのRAMが残ります。私は以下を提起します:
- innodb_buffer_pool_size = 12G
- key_buffer_size = 4G
7Gが残ります。これは、OSおよびDB接続に十分なはずです。
キーバッファーはMyISAMインデックスページのみをキャッシュし、InnoDBバッファープールはデータとインデックスをキャッシュすることに注意してください。
もう1つの推奨事項:MySQL 5.5にアップグレードして、複数のCPUと読み取り/書き込みI / Oの複数のスレッド用にInnoDBを構成できるようにします。
InnoDBの複数のCPUへのアクセスと併せてMySQL 5.5を使用することに関する以前の投稿を参照してください。
更新2012-09-06 14:56 EDT
クエリキャッシュをクリアする私の方法は、キャッシュされたデータをホースし、RAMの完全に異なるセグメントを形成するため、かなり極端です。あなたがコメントで指摘したように、FLUSH QUERY CACHE
(あなたが提案したように)またはさらにRESET QUERY CACHE
良いでしょう。明確にするために、「内部メカニズムなし」と言ったとき、私はまさにそれを意味していました。最適化が必要であり、手動で行う必要があります。crontab'dする必要があります。
MyISAMよりもInnoDBでDML(INSERT、UPDATE、DELETE)を頻繁に行う場合、最初に言ったように、クエリキャッシュを完全に削除すると言います。