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_inserts
やQcache_hits
は変化なし
参考
- MySQL Bugs: #64821: Query Cache not used when table name contains dollar sign and engine is innodb
- MySQLのクエリーキャッシュが効かない場合 - ウィリアムのいたずらの開発日記
- mysql - query cache doesn't work - Stack Overflow
- MySQL :: MySQL 5.6 Release Notes :: Changes in MySQL 5.6.9 (2012-12-11)
- 下から3番目
- The server failed to use the query cache for queries in which a database or table name contained special characters and the table storage engine was InnoDB. (Bug #64821, Bug #13919851)
- 下から3番目
- データベース名の規則 MySQL :: MySQL 5.5 Reference Manual :: 9.2 Schema Object Names
$
は、OKとなっているのにクエリキャッシュされなく落とし穴があった