2011-06-22 4 views
5

私はオンラインショップ&を構築しており、MYSQLクエリを最小限に抑えてパフォーマンスを向上させようとしています。PHP - MYSQLクエリをtxtファイルにキャッシュするのは良い方法ですか?

mysqlクエリをtxtファイルでキャッシュしてからクエリの代わりにフェッチするのは良い方法ですか?これは、PHPのクラスは、文字列としてSQLクエリを必要なものを私は

  1. 「やっている
  2. これは
  3. は、クエリを実行する実行しています初めてであれば、それのMD5データベース
  4. に配列
  5. の結果は、配列をシリアライズ取得し、md5_Of_Query.txt
  6. リターンのいずれかアンシリアライズ(のfile_get_contents(md5_of_Query.txt))または$ RESとして保存しますキャッシュが存在し、かつ有効であるかどうかに応じて、実際の照会の最高値を計算します。
  7. また、クラスはtxtファイルのfilemtime()をチェックし、1時間以上経過している場合は、クエリを再実行してキャッシュを更新します。

毎回SQLクエリを実行するより効率的ですか?私が紛失しているセキュリティ上の問題?

答えて

5

あなただけのアプリケーションを起動している場合は、memcacheのは、テキストファイルを使用するよりも行くにははるかに高速な方法です。

http://memcached.org/

テキストファイルには、仕事をし、そしてあなたが作るセンスを概説しましたが、memcacheのがより速くなると、あなたのために重い物を持ち上げるの多くを処理する手順します。

+0

ありがとう、私のWAMPサーバーにインストールされたmemcacheがあります。このキャッシュを使ってビルドします。 – Emmanuel

+0

1つのWAMP上で違いはありません.Windowsでのテキストファイルへのアクセスは**すでに**メモリにキャッシュされています。 Memcachedはオーバーヘッドを追加し、**メモリを盗みます**ウェブサーバーとDBはより多くの使用をします。 Memcachedは多くの*大* **多くの**大規模シナリオのためのものです。クエリとサブクエリに応答するキャッシングサーバの* large *サーバファームと*プール*このシナリオではmemcached(**は**メモリソケットを介して**メモリプロトコルを使用してメモリプールを調べます)は、リソースの豊富な冗長性の中で最高の性能を発揮します。単一のマシンはそれから利益を得ることはできません。 – ZJR

+0

しかし、優れた点です。アプリケーションの開発ライフサイクルの始めに展開を計画することをお勧めします。私はアプリケーションがWAMPサーバー上でホストされるとは考えていませんが、開発とテストのためだけだと思います。 – serialworm

2

あなたの方法は、問題を1つのコーナーからもう1つのコーナーにシフトするように見えます。

キャッシュを導入しても、MySQLのパフォーマンスは向上しません。実際にどのクエリが遅いかを見て、クエリを最適化してください。

http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html

8

ベンチマークを行う場合、一意のハッシュを作成してディスクからIOを実行するコストは、MySQLサーバーから単純にフェッチするよりも大きくなります。

IMHO、程度まで気にしないでください。良い考えですが、MySQLにはすでに内部キャッシングとパフォーマンスの調整があります。

「時期尚早な最適化はすべての悪の根源です」とアプリケーションを構築することに重点を置いています。

+0

ありがとうございます。あなたは私にあなたのアドバイスで多くの試行錯誤を救った。 – Emmanuel

2

今後のスケーラビリティを考慮してキャッシュを実現するには、データベースでクエリを実行するRESTfulサービスを設定し、WebサーバーのHTTPキャッシュ機能を使用して結果をキャッシュすることをお勧めします。手順は次のようになります。

  1. 元のページには、それは
  2. URLににあるPHPスクリプトをクエリパラメータなどのパラメータを渡すサービスURLに対してHTTP GETリクエストを生成し、クエリ
  3. を実行する必要がありますURLは、それらを検証し、クエリのパラメータを受け入れ、およびMySQLのクエリ
  4. スクリプトに追加するスクリプトがWebの結果をシリアライズし、
  5. 出力として設定します
  6. データベース上でクエリを実行しますERVERは、元のページには、あなたは、ApacheとPHPをキャッシュについての詳細を読むことができますHTML

を生成するために、サービスからのシリアル化された結果を使用して要求に対する応答をキャッシュし、同じURL

  • との将来の要求のためにそれを返すhere 。あなたが今やっていることはこれに近いですが、サービスベースのアプローチでアプリケーションの拡張性を高めることができます。

  • 1

    シリアルワームとthephpdeveloperが言ったことは、メモリ/ RAMがディスクIOバインド操作よりもはるかに速いという事実を分かち合っています。 mysqlにできるだけ多くのRAMを投げてください。本当にクラスタにアップグレードする必要があり、その他の考慮事項が必要な場合を除き、キャッシュ管理に対処する必要はありません。 Memcacheを使用すると、キャッシュ管理をより詳細に制御できるため、より多くのコーディングが必要になります。

    私はまずアプリケーションを構築し、それをストレステストし、クエリを最適化したり、必要に応じてキャッシュ管理を追加したりします。

    1

    2つのものを見ると、benchmarkingprofilingです。あなたの現在のmysql設定、php.ini、httpd.conf、.htaccess、mod書き換えのもの、その他の多くのものをベンチマークとプロファイリングとすることで、これらのdiciplinesの2つのメトリックを一緒に使用することで、演技技術はその仕事をしています。

    1

    それは無意味なので、結果をキャッシュする必要があります。

    クエリ組み立て時間は、はかなり無視してください。 (そうでない場合は、それはになっていて、あなたがSQLを使用していないしている、発電は、代わりに、スマートjoinが解決しているだろう愚かなselect秒のストリーム)

    読み込んで、ディスクからのクエリは明らかです遅くなる傾向があります。
    本当にとにかく時間を取るべきである何、DBの外に結果を取得し、その後バックWebページにそれらのスタイルを設定されて

    を(OSはしかし、ディスクIOをキャッシュし、それは難しいスポットすることことができます)テンプレートを介して。あなたの場所で私はディスクにキャッシュするでしょうスタイルの結果与えられたクエリの質問に、キャッシュがそれほど古くない場合は、私は直接readfile()それらになります。

    関連する問題