MySQL 5.6にアップグレードし、dbサーバーの負荷が大幅に増加しているのがわかり始め、ついにquery_cache_type
のデフォルトは5.6以降です。
これを再度有効にすると、負荷の減少がわかります。なぜこの値がデフォルトで無効にされているのか、MySQL 5.6から開始しますか?有効にしても問題がわかりません。
その理由を理解するには、InnoDBの履歴が必要です。ここに行く:
InnoDBとクエリキャッシュは常に戦争状態にあります。 InnoDBは、InnoDBバッファープール内の変更を検査し、同じ変更がないかクエリキャッシュをクロスチェックするときに、非常に手間がかかる傾向があります。
MySQL 5.0より前は、クエリキャッシュはInnoDBに対して無効でした。これで、InnoDBがそれと対話します。問題を簡単にするために、 query_cache_size を0に設定して、クエリキャッシュを無効にすることができます。
によるとquery_cache_timeのMySQLドキュメント
query_cache_type を0に設定してサーバーを起動した場合、サーバーはクエリキャッシュミューテックスをまったく取得しないため、実行時にクエリキャッシュを有効にできず、オーバーヘッドが減少します。クエリ実行中。
query_cache_size を0に設定することは、万能のソリューションではありません。
そもそも戦争の理由は頭上にある。 InnoDBは常に変更を検査します。クエリキャッシュが大きくなると、InnoDBの動作がはるかに難しくなります。クエリキャッシュを無効にして、InnoDBとクエリキャッシュを満足させましょう。ただし、このような平和条約が締結されていても、クエリのパフォーマンスが悪いために、あなた(開発者/ DBA)がその戦争の犠牲者になる可能性があります。
以下に応じて
query_cache_size を、パフォーマンスを向上させると思われる任意の数に設定する必要があります(これは地下の動きを開始することと同じです)。
私がこの戦争の話をどこで思いついたのか疑問に思っている場合は、私の古い投稿を見てください
Sep 05, 2012
: 頻繁なクエリキャッシュの無効化のオーバーヘッドは価値がありますか?私はこれを 高性能MySQL(第2版)のページ209-215から学んだので注意深く読んでください
以前に他のユーザーに対してクエリキャッシュを無効にすることをお勧めしました
Sep 25, 2013
: クエリキャッシュエントリ(キー)を無効化していますSep 26, 2013
: クエリキャッシュヒット値がデータベースで変更されませんDec 23, 2013
: CPUとメモリの使用率が高いMySQL注:質問は query_cache_type に関するものであることがわかりました。クエリキャッシュに影響します。キャッシュを無効にすると、InnoDBの優位性が失われます。 query_cache_type を手動で設定すると、開発者/ DBAは、クエリキャッシュで発生するクエリのタイプについて慎重に検討する必要があります。
私はブログ投稿があります これがここにある理由の説明 。
ショートバージョン:クエリキャッシュにより、マルチコアマシンでスケーラビリティの問題が発生します。そのため、デフォルトでは無効になっています。
回答を完了するために、クエリキャッシュ機能を「置き換える」ためのOracleのプッシュは memcached統合 です。