InnoDBテーブルのみを使用するサーバーで、MySQLクエリキャッシュを有効/無効にする決定をどのように行う必要がありますか。たとえば、キャッシュが有効になっている場合、出力は次のようになります。
SHOW STATUS LIKE 'Qcache%';
決定するために解釈されますか?または、他のクエリ/プロファイリングを実行して詳細情報を取得し、それらをどのように解釈すべきですか?有効にする場合、そのサイズはどのように決定する必要がありますか? MySQL 5.6を使用して、Amazon RDSにいます。結局、約250の個別のデータベースになり、合計で約200 GBになります。
以前の投稿でこれについて話しました
Sep 05, 2012
: 頻繁なクエリキャッシュの無効化のオーバーヘッドは価値がありますか?Sep 26, 2013
: クエリキャッシュヒット値がデータベースで変更されないInnoDB内部は、クエリキャッシュエントリの無効化を細かく管理するため、クエリキャッシュに対して非常に実践的なアプローチを持っています。 MySQL 4.xでは、クエリキャッシュはInnoDBのためにデフォルトで無効にされていました。 MySQL 5.xでは、トスアップになる可能性があります。 @akuzminskyからのコメントは、InnoDBを中心とした地域の問題を示しています。
Amazon RDSを使用しているという事実を考えると、次の課題が見つかります
私はすべての推測作業を取り除き、クエリキャッシュを無効のままにします。 (@akuzminskyの2番目のコメントで提案されているように)バッファープールサイズが大きい場合は、より大きなサーバーモデル($$$ Cha-Ching $$$)に移行する必要があります。サーバーモデルのバッファプールサイズは次のとおりです
MODEL max_connections innodb_buffer_pool_size
--------- --------------- -----------------------
t1.micro 34 326107136 ( 311M)
m1-small 125 1179648000 ( 1125M, 1.097G)
m1-large 623 5882511360 ( 5610M, 5.479G)
m1-xlarge 1263 11922309120 (11370M, 11.103G)
m2-xlarge 1441 13605273600 (12975M, 12.671G)
m2-2xlarge 2900 27367833600 (26100M, 25.488G)
m2-4xlarge 5816 54892953600 (52350M, 51.123G)
_SHOW GLOBAL STATUS;
_
次に、これらを計算します(MyISAMとInnoDBのどちらを使用していても)。
Qcache_lowmem_prunes / Uptime
_-QCがプルーニングされる頻度-15 /秒を超えると、QCをオンにするとオーバーヘッドが多くなります。Qcache_not_cached / Uptime
_-キャッシュ試行が失敗しました(1秒あたり)。 > 40はおそらく悪い。Qcache_not_cached / (Qcache_hits + Com_select + Qcache_not_cached)
-QCにキャッシュされないSELECTs
の割合-> 30%は、QCがあまり役に立たないことを意味します。Qcache_hits / Qcache_inserts
_-ヒットと挿入の比率-> 10が望ましい実際のデータの読み取りと書き込みの分割に大きく依存します。読み込みが重い場合は、query_cacheを使用してスマートにRDSのCPU負荷を節約できます。ただし、デフォルトでONにすることはお勧めしませんが、DEMAND(RDSパラメータの数値2)を使用して、選択ステートメントでSQL_CACHEを使用し、特に煩雑なクエリでディスクにアクセスする可能性を回避できます(非常に低速です)。 RDSは通常)query_cacheがなく、データの期限切れにより、制御不能な方法でDBが引き継がれます。
オプション2を使用すると、最悪のクエリ実行結果をキャッシュするための十分なスペースを確保しながら、query_cache_sizeを小さく保ち、エビクションを回避できます。読み取りが多い状況では、これにより、システムに負荷をかけずに、500GB RDSデータベースを使用した最も遅いクエリの速度が大幅に向上しました。
HTH