mita2 database life

主にMySQLに関するメモです

MySQL 8.0 でクエリーキャッシュはなくなりました

先日、MySQL 8.0 がGAリリースされました。888888!
こないだ、MySQL 5.7がGAになった気がしたんですが、調べてみたら、5.7 GAは2015/10でした。
いつのまにか約2年半もたっていたようです。。。


頂いたMySQL 8.0 Tシャツ。これは背中側。 

さて、MySQL 8.0 でクエリーキャッシュは廃止されます!私は大歓迎です

なぜ、廃止になるのか?



クエリーキャッシュが効果がある場面は限定的です。
テーブルのデータが変更されると、クエリの結果に変化があろうとなかろうと、そのテーブルに関するキャッシュは無効になります。
更新頻度が高いデータであれば、キャッシュヒット率は低くなり、効果を発揮しません。更新頻度が低いデータであれば、キャッシュヒット率は高くなりますが、更新頻度が低いのであれば、データベースに保存せず、静的なファイル等で保存したほうがより良いレスポンスタイムを期待できると思います。
私の経験ではクエリーキャッシュを正しく理解して利用している人はごく一部でした。

また、レスポンスタイムや負荷のバラ付きも問題です。
キャッシュヒットの有無によりレスポンスタイムのバラ付きが大きくなります。
普段は負荷の低いDBサーバが、テーブルに更新が入るタイミングで、急に負荷がスパイクし、
クエリーキャッシュヒットを狙っていなかったクエリも含めてレスポンスが全体的に悪化する・・・という場面を経験したことがあります。
負荷が安定しなかったり、予測がつかないというのは非常に運用しにくいものです。

そして、スケーラビリティの問題もあります。
MySQLのクエリーキャッシュは内部でmutexが競合するため、性能向上を妨げてしまいます。

詳しい経緯は、yakst さんに翻訳記事が上がっています。


ということで、クエリキャッシュはなくなります!