web-dev-qa-db-ja.com

MySQL 5.6からデフォルトでquery_cache_typeがデフォルトで無効になっているのはなぜですか?

MySQL 5.6にアップグレードし、dbサーバーの負荷が大幅に増加しているのがわかり始め、ついにquery_cache_typeのデフォルトは5.6以降です。

これを再度有効にすると、負荷の減少がわかります。なぜこの値がデフォルトで無効にされているのか、MySQL 5.6から開始しますか?有効にしても問題がわかりません。

28
Yoga

その理由を理解するには、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 を、パフォーマンスを向上させると思われる任意の数に設定する必要があります(これは地下の動きを開始することと同じです)。

エピローグ

私がこの戦争の話をどこで思いついたのか疑問に思っている場合は、私の古い投稿を見てください

私はこれを 高性能MySQL(第2版)のページ209-215から学んだので注意深く読んでください

以前に他のユーザーに対してクエリキャッシュを無効にすることをお勧めしました

注:質問は query_cache_type に関するものであることがわかりました。クエリキャッシュに影響します。キャッシュを無効にすると、InnoDBの優位性が失われます。 query_cache_type を手動で設定すると、開発者/ DBAは、クエリキャッシュで発生するクエリのタイプについて慎重に検討する必要があります。

39
RolandoMySQLDBA

私はブログ投稿があります これがここにある理由の説明

ショートバージョン:クエリキャッシュにより、マルチコアマシンでスケーラビリティの問題が発生します。そのため、デフォルトでは無効になっています。

8
Morgan Tocker

回答を完了するために、クエリキャッシュ機能を「置き換える」ためのOracleのプッシュは memcached統合 です。

4
jynus