2011-02-08 9 views
2

私はそれがmemcacheの内、「ressource」を記憶することが可能ですかどうかを知りたいと思い、私は現在、次のコードをしようとしているが、どうやらそれは正しくないです。memcacheを使ってmysql_queryをキャッシュする方法は?

$result = mysql_query($sSQL); 
$memcache->set($key, $result, 0, $ttl); 
return $result; 
+2

リソースはキャッシュできません。クエリ結果... ** YES ** – ajreal

答えて

-2

は、なぜあなたはとても必要なのでしょうか? MySQLはパフォーマンスquery cache

独自のを持っていますが、あなたはまだあなたの奇妙なアイデアをフォローしたい場合 - あなたはmemcachedのにその配列(mysql_fetch_assocまたは任意で)配列にし、その店の後にすべてのデータをフェッチする必要があります。

+3

私のアプリケーションで同じことを2回データベースに照会したくありません。 – Roch

+0

@mnml:memcachedのストレージでもありませんか? mysqlをクエリする(とクエリキャッシュからデータを取得する)とmemcachedから取得することの違いは何ですか? ;-)とにかく、リソースからすべてのデータを抽出し、結果配列をキャッシュする必要があります。 – zerkms

+2

複数のサーバーを使用すると、Webサーバーとデータベース間のネットワークトラフィックが減少し、クエリがキャッシュに入ればより速くなります。 – Roch

9

私は不快感に同意しなければなりません。 MySQLにキャッシュシステムがあるという理由だけで(実際にはいくつかあります)、データベースへのアクセスを最適化するメリットはありません。 MySQLのクエリキャッシュは素晴らしいですが、それはまだのような制限があります。

  • 大規模なデータが
  • クエリは(文字の文字)は同一である必要はあり設定のために、それは適切ではないのです
  • それは使用して準備された文またはクエリをサポートしていませんテンポラリ・テーブル、またはカラム・レベルの特権を持つテーブル
  • 結果セットが影響を受けるかどうかにかかわらず、テーブルが変更されるたびにキャッシュ結果がクリアされます
  • Webと同じマシン上に存在しない場合それはまだunnecが発生するサーバーネットワーク上のオーバーヘッド

リモートサーバーの場合でも、Memcached is roughly 23% faster than MQCです。また、APCのオブジェクトキャッシュを使用すると、MQCだけを使用する場合に比べて最大990%の改善が得られます。

したがって、MySQLのクエリキャッシュの外部でデータベースの結果セットをキャッシュする理由はたくさんあります。結局のところ、同じスクリプトで複数回アクセスする必要がある場合、結果データをPHP変数にローカルにキャッシュします。結果セットが変更されない場合、なぜこれを複数のリクエストにわたって拡張しないのですか?

サーバーが十分に速いからといっても、効率的なコードを書くことに努力すべきではありません。この正確な目的のために、APCやMemcachedのようなアクセラレータが設計されているときは、データベースの結果をキャッシュするのに多くの努力が必要ではありません。— (some of the largest sites on the internet use Memcached in conjunction with MySQLの場合、このような「奇妙なアイデア」としてこの質問を却下しません)。

つまり、結果を最初に取得してから、APCまたはMemcachedを使用してデータをキャッシュすることができます。ただし、クエリ結果を手動でキャッシングする別の方法があります。これはMysqlnd query result cache pluginを使用することです。これは、MySQLクエリ結果のクライアントサイドキャッシュです。

Mysqlndクエリ結果キャッシュプラグインを使用すると、APC、Memcached、sqlite、またはユーザー指定のデータソースを使用してクエリを透過的にキャッシュできます。ただし、このプラグインは現在、プリペアドステートメントをキャッシュできないという点でMQCと同じ制限を共有しています。

関連する問題