Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.1Mb
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  MySQL クエリーキャッシュ

8.9.3 MySQL クエリーキャッシュ

クエリーキャッシュには、クライアントに送信された対応する結果とともに、SELECT ステートメントのテキストが格納されます。あとで同じステートメントを受け取った場合、サーバーはそのステートメントを再度解析して実行する代わりに、クエリーキャッシュから結果を取得します。クエリーキャッシュはセッション間で共有されるため、1 つのクライアントで生成された結果セットを、別のクライアントによって発行された同じクエリーへの応答で送信できます。

クエリーキャッシュは、あまり頻繁に変更されないテーブルがあり、それに対してサーバーが多くの同一のクエリーを受け取る環境で役立つことがあります。これは、データベースの内容に基づいて、多くの動的ページを生成する多くの Web サーバーに一般的な状況です。

クエリーキャッシュは古くなったデータを返しません。テーブルが変更されると、クエリーキャッシュ内の関連エントリがフラッシュされます。

注記

同じ MyISAM テーブルを更新する複数の mysqld サーバーがある環境では、クエリーキャッシュは機能しません。

クエリーキャッシュは、セクション8.9.3.1「クエリーキャッシュの動作」に説明された条件の下で、準備されたステートメントに使用されます。

注記

MySQL 5.6.5 現在、クエリーキャッシュは、パーティション化されたテーブルに対してはサポートされておらず、パーティション化されたテーブルを含むクエリーには自動的に無効にされます。そのようなクエリーに対しては、クエリーキャッシュを有効にできません。(Bug #53775)

クエリーキャッシュの一部のパフォーマンスデータを次に示します。これらの結果は、2G バイトの RAM と 64M バイトのクエリーキャッシュを搭載する Linux Alpha 2 × 500MHz システムで、MySQL ベンチマークスイートを実行して生成されました。

  • 実行しているすべてのクエリーは単純です (1 行のテーブルから行を選択するなど) が、それでも異なっているため、クエリーをキャッシュできない場合、クエリーキャッシュをアクティブにしておくためのオーバーヘッドは 13% です。これは最悪のケースのシナリオとみなすことができます。実際には、クエリーははるかに複雑になる傾向があるため、オーバーヘッドは通常かなり低くなります。

  • 単一行テーブル内の単一行の検索は、クエリーキャッシュがあると、それがない場合より、238% 高速化します。これは、キャッシュされているクエリーに予想される最小の高速化に近いとみなすことができます。

サーバーの起動時にクエリーキャッシュを無効にするには、query_cache_size システム変数を 0 に設定します。クエリーキャッシュコードを無効にすることによって、目立ったオーバーヘッドはなくなります。

クエリーキャッシュは、かなりのパフォーマンスの改善の可能性を提供しますが、すべての環境でそうなるものと想定しないでください。クエリーキャッシュの構成やサーバーのワークロードによっては、実際にパフォーマンスの低下が見られることもあります。

  • クエリーキャッシュのサイズを過度に大きくすると、キャッシュの保守に必要なオーバーヘッドが増え、それを有効にすることのメリットに勝る可能性があります。数十メガバイトのサイズが通常は有益です。数百メガバイトのサイズはそうでない可能性があります。

  • サーバーのワークロードは、クエリーキャッシュの効率にかなりの影響を与えます。ほぼ全体が固定の SELECT ステートメントのセットで構成される複合クエリーでは、頻繁な INSERT ステートメントによってキャッシュ内の結果が絶えず無効にされるような複合クエリーよりも、キャッシュを有効にすることでメリットが得られる可能性がはるかに高くなります。場合によっては、回避方法として、SQL_NO_CACHE オプションを使用して、頻繁に変更されるテーブルを使用する SELECT ステートメントに対して、結果をキャッシュに入れないようにします。(セクション8.9.3.2「クエリーキャッシュ SELECT オプション」を参照してください。)

クエリーキャッシュを使用することでメリットがあるかどうかを確認するには、キャッシュを有効および無効にして MySQL サーバーの動作をテストします。サーバーのワークロードが変わるとクエリーキャッシュの効率も変わることがあるため、その後、定期的に再テストします。


User Comments
  Posted by Jon Gabrielson on February 6, 2006
http://dev.mysql.com/doc/refman/5.0/en/mysql-cluster-limitations.html
states that:
>
>Unlike the case in MySQL 4.1, the Cluster storage engine in MySQL 5.0 supports MySQL' query cache.
>

Which combined with the statement above of:
>
>Note: The query cache does not work in an environment where you have multiple mysqld servers updating the same MyISAM tables.
>

seems to imply that the Cluster NBD knows how to correctly
flush the query cache for multiple mysqld servers.
  Posted by Adrian Marius Popa on March 26, 2009
Here is one article about the Query Cache
It's better explained what it really does and what it doesn't
do

http://www.mysqlperformanceblog.com/2006/07/27/mysql-query-cache/


  Posted by Vlatko Šurlan on July 5, 2010
A nice little treatise on MySQL Query Cache with some nasty gotchas and tricks that might shave a few days off of your 'what the heck is going wrong here' time: http://www.docplanet.org/mysql/mysql-query-cache-in-depth/
  Posted by sapan mohanty on August 19, 2010
Why Should Enable Mysql Cache?
If you want to get optimized and speedy response from your MySQL server then you need to add following two configurations directive to your MySQL server:

query_cache_size=SIZE
The amount of memory (SIZE) allocated for caching query results. The default value is 0, which disables the query cache.

query_cache_type=OPTION
Set the query cache type. Possible options are as follows:
0 : Don't cache results in or retrieve results from the query cache.
1 : Cache all query results except for those that begin with SELECT S_NO_CACHE.
2 : Cache results only for queries that begin with SELECT SQL_CACHE
Howto enable caching in MySQL

You can setup caching as follows:
$ mysql -u root –p

for more details :http://writemysqlquery.blogspot.com/
  Posted by Nicolas Muller on March 14, 2013
Hi, we write a post talking about query cache in portuguese, if somebody need this information in that language -> http://www.oficinadanet.com.br/artigo/mysql/usando_o_cache_de_consultas_no_mysql
  Posted by Jose Luis Palacios on June 11, 2013
"mysqldump", with "--lock-all-tables" option, runs "FLUSH TABLES" / "FLUSH TABLES WITH READ LOCK" which purges entire query cache.

"mysqlcheck --optimize" runs "OPTIMIZE TABLE" which will invalidate the table and its referring queries from the query cache.
  Posted by Hayden James on July 10, 2014
Due to all the variations of MySQL setups, hardware specs and the fact that databases are all different in demand, query types, reads vs writes, etc, you will have to play around with what query cache config works for "you" and finding that query_cache_size sweet-spot as it were. A MySQL query cache size may be fast on one server but slow on another. Pay attn to prunes just as must as over sizing. I wrote more about this... http://haydenjames.io/mysql-query-cache-size-performance/
  Posted by Chris Wilson on August 15, 2014
The documentation above says that "The query cache does not return stale data. When tables are modified, any relevant entries in the query cache are flushed."

But this is not true in at least one case: loading data into the timezone tables does not invalidate cached queries using CONVERT_TZ. http://bugs.mysql.com/73604.
Sign Up Login You must be logged in to post a comment.