Webサービスのパフォーマンス改善の一環として、
理解が適当だったクエリキャッシュについて改めて調べたので、メモ
クエリキャッシュとは
SQL実行結果をクライアントに返すと同時に内容をキャッシュしておき、
同一のSQLが送信された時にキャッシュされた内容をそのまま返し、
SQL実行を避ける事で応答速度の向上が可能。
対象DB
MySQL 5.6
特徴
- アプリ実装なしにDB設定のみで透過的にキャッシュの恩恵を受けられる。
- ロックはクエリキャッシュ全体で一つのみ利用可能。
- 明示的にクエリキャッシュを利用したい場合はSQLに「SQL_CACHE」を追加する。
- システム設定 query_cache_type を「ON」もしくは「DEMAND」にすること
クエリキャッシュを利用する上での注意点
- クエリキャッシュのチェック、格納、無効化にコストがかかるため、キャッシュヒットが低いと逆に遅くなる可能性がある。
- クエリキャッシュをSQLを大文字小文字、スペースの数、コメントのサイズを完全に一致させること。
- クエリキャッシュのサイズは大きくしすぎないようにする。
- サイズの大きさに比例して、キャッシュの無効化のコストが増大するため。
- クエリキャッシュのロックは全体で一つのみなので、そのキャッシュにアクセスするすべてのクエリをロックされ、システムがストールする可能性があり。
- 数十メガバイトを超えない程度の小さなクエリキャッシュをちょうど良い。
- サイズの大きさに比例して、キャッシュの無効化のコストが増大するため。
- 以下のクエリはそもそもキャッシュされない。
- ユーザー定義関数、ストアドファンクション、ユーザー変数、一時テーブル、mysqlデータベース内のテーブル、または列レベルの特権を持つテーブルを参照するクエリ
- NOW() 、CURRENT_DATE()などの非決定的なクエリ
クエリキャッシュを利用するかの判断ポイント
- 他に利用できるキャッシュストアが存在しない場合はお手頃にキャッシュの効果を受けられる可能性がある。
- 参照に比べて、更新頻度が高いサービスではクエリキャッシュは有効にならないケースが多いため、無効にしたほうが良い。
- キャッシュヒット率が高く、更新の頻度が少ないシステムには特に有効。
- 参照系の処理が大多数のECサイトやSNSには相性が良いかも。
- 負荷が高いシステムであれば、memcash、Redisを検討してみるのも手。
参考URL
- MySQL クエリーキャッシュ
- 実践ハイパフォーマンスMySQL第3番 第7章12節
最後に...
ここまで調べて最後にとても重要な事実を見つけてしまった...
The query cache is deprecated as of MySQL 5.7.20, and is removed in MySQL 8.0.
(クエリキャッシュは5.7.20で非推奨に、8.0で削除されます。)
( ゚д゚)ポカーン