MySQLで、同じSELECT文を発行する場合、クエリーキャッシュを使うと早くなることがある。
クエリーキャッシュは、my.cnf(my.ini)でも設定できるし、mysqlのコマンドとしても設定できる。
■ 設定
今回は、mysqlのコマンドで、以下のように行う。
SET GLOBAL query_cache_size = 100000;
■ 確認
これで、
SHOW VARIABLES LIKE 'have_query_cache';
でYES
SHOW VARIABLES LIKE 'query_cache%';
で
query_cache_sizeにいくつかの値が設定されている
(100000と設定しても100000にはならない)
SHOW STATUS LIKE 'Qcache%';
で
Qcache_hits (ヒットした件数)
Qcache_not_cached (ヒットしなかった件数)
Qcache_queries_in_cache (キャッシュ内のクエリ数)
等が表示される(他にも表示される)。
■効かない条件
しかし、このクエリーキャッシュは、いくつかの効かない条件がある。
http://dev.mysql.com/doc/refman/5.1/ja/query-cache-how.html
には、以下のようなものがあげられている。
・準備されたステートメント (準備文)
・クエリが外部クエリのサブクエリである場合
・Stored プロシージャ、Stored 関数、トリガ、イベントなどのボディ内で実行したクエリ
Zendの古いバージョンなどだと、クエリーキャッシュが効かないとかいうのは、
「準備されたステートメント」=PreparedStatementの問題。
で、ここから本題。
これ以外のケースではまったので・・・
データベース名に-を含むもの、たとえば、te-st1とかは、単純には作れない。
ところが、`te-st1`とかして、名前を指定すると作れる。
この場合、データベースの中に、テーブルは作れ、そのデータベース内に
入れば、SELECTはできるけど・・・
クエリーキャッシュは効かない。
■例
(以下、>は、本当は半角)
いま、test2とte-st1というDBに、
test1というまったく同じテーブルがあったとき、
でキャッシュをリセット後
というように、test2のデータベースを使って、
test1を3回検索すると、
Qcache_queries_in_cacheと、 Qcache_hits の数があがる
(その前に何回もテストしているので、0ではないけど)
ところが、この直後、te-st1のDBに対して、同じことをやっても、
というように、 Qcache_hits は上がらず、 Qcache_not_cachedがあがる。
つまり、キャッシュされてない。
クエリーキャッシュは、my.cnf(my.ini)でも設定できるし、mysqlのコマンドとしても設定できる。
■ 設定
今回は、mysqlのコマンドで、以下のように行う。
SET GLOBAL query_cache_size = 100000;
■ 確認
これで、
SHOW VARIABLES LIKE 'have_query_cache';
でYES
SHOW VARIABLES LIKE 'query_cache%';
で
query_cache_sizeにいくつかの値が設定されている
(100000と設定しても100000にはならない)
SHOW STATUS LIKE 'Qcache%';
で
Qcache_hits (ヒットした件数)
Qcache_not_cached (ヒットしなかった件数)
Qcache_queries_in_cache (キャッシュ内のクエリ数)
等が表示される(他にも表示される)。
■効かない条件
しかし、このクエリーキャッシュは、いくつかの効かない条件がある。
http://dev.mysql.com/doc/refman/5.1/ja/query-cache-how.html
には、以下のようなものがあげられている。
・準備されたステートメント (準備文)
・クエリが外部クエリのサブクエリである場合
・Stored プロシージャ、Stored 関数、トリガ、イベントなどのボディ内で実行したクエリ
Zendの古いバージョンなどだと、クエリーキャッシュが効かないとかいうのは、
「準備されたステートメント」=PreparedStatementの問題。
で、ここから本題。
これ以外のケースではまったので・・・
データベース名に-を含むもの、たとえば、te-st1とかは、単純には作れない。
ところが、`te-st1`とかして、名前を指定すると作れる。
この場合、データベースの中に、テーブルは作れ、そのデータベース内に
入れば、SELECTはできるけど・・・
クエリーキャッシュは効かない。
■例
(以下、>は、本当は半角)
いま、test2とte-st1というDBに、
test1というまったく同じテーブルがあったとき、
mysql> reset query cache; Query OK, 0 rows affected (0.00 sec) |
でキャッシュをリセット後
|
というように、test2のデータベースを使って、
test1を3回検索すると、
Qcache_queries_in_cacheと、 Qcache_hits の数があがる
(その前に何回もテストしているので、0ではないけど)
ところが、この直後、te-st1のDBに対して、同じことをやっても、
|
というように、 Qcache_hits は上がらず、 Qcache_not_cachedがあがる。
つまり、キャッシュされてない。