zz log

zaininnari Blog

MySQLでデータベース名に「-(ハイフン)」を使うとクエリキャッシュされない(Qcache_not_cachedになる)

概要

MySQLでデータベース名またはテーブル名に「-(ハイフン)」(「$」も)が含まれてると、クエリキャッシュを有効にしているにも関わらず、Qcache_not_cachedになってしまいます。

対策は、

  • MySQL 5.6.9, 5.7.0 以降のバージョンを使用する
    • これらのリリースノートに記載がある
  • 5.5系は、5.5.33はNGで、5.5.37(現時点での最新版)はOKだった
    • リリースノートには記載がない
  • 0-9a-zA-Z_ のみの名前にリネームする

手順

  • have_query_cache YES
  • query_cache_size 0より大きく
  • query_cache_type 1

  • ハイフンを含まないデータベース名でSELECT文を実行

    • Qcache_insertsが増え、もう一度実行すると、Qcache_hitsが増えます
  • ハイフンを含むデータベース名でSELECT文を実行
    • Qcache_not_cachedが増えます。Qcache_insertsQcache_hitsは変化なし

参考

まとめ

  • MySQLのデータベース名またはテーブル名に特殊文字が含まれていると、クエリキャッシュされないバグがありました。
    • 通常はcreate database db-testは通りません(バッククォートが必要です)が、ツールから作成するとバッククォートしてくれるので、特殊文字と気づきませんでした。
  • 最新版では修正されています。