2012-02-23 7 views
2

私は、MySQLテーブルにデータをキャッシュする(共有ホスティングはmemcachedなので)テーブルを持っています。MySQLのジレンマ

私はページを持っている負荷(静的)データと、その後キャッシュ:

コンセプトはこれです、それはページを照会

  • キャッシュが存在しない場合は、HTMLをレンダリングし、それをキャッシュテーブルに保存します。
  • ページがキャッシュに存在しない場合、12のクエリ(メニュー、ページコンテンツ、SEO、プロダクトリストなど)を実行し、レンダリングされたHTMLをテーブルに保存します。

キャッシュテーブルはこのようなものです:

=cache= 
url varchar(255) - primary key 
page mediumtext 

は、今私は、私は(共有ホストなどmemcachedの、のようなキャッシングなし)持っているものに基づいて、私は正しいことをやっていると思いますが、私の質問はこれです:URLはvarchar指標であるので

けど(intのような)数値IDが高速であるため、ユニークな整数に/contact-us/または/product-category/product-name/のようなURLに変換する方法はありますか?あるいはこれを最適化する他の方法がありますか?

+0

は、通常のAUTO_INCREMENT int型主キーを使用するすべてのハッシュcolisionsで正確なURLを検索し、ハッシュですべてのキャッシュされたURLを選択して、ユニークな(しかし、主要ではない)として、URLを保存するキーフィールド。物を参照するときにintを運ぶ方が簡単です。 urlテキストを使用してauto_inc idを検索します。 –

+1

だから、まだIDではなくURLでルックアップする必要がありますか? – Alexei

+0

12個のクエリをキャッシュしますか?それほど多くはありません。 。 。複雑かどうかによって異なります。なぜあなたはmysqlにキャッシュを格納していますか?なぜファイルシステム上にファイルを作成せずにキャッシュとして使用するのですか? – Flukey

答えて

2

私は短いキーを可能にするハッシュのフォームを作成します。多くの場合、要求経路のハッシュのような簡単なものが実行可能な可能性があります。あるいは、CRC32( '/ your/path/here')のようなもっと単純なものが、あなたの状況にプライマリキーとして適しているかもしれません。この例では、次の列は、あなたはそれからさらに一歩これを取ると、すなわちあなたが、その後作成することができ

NEW.urlCRC = CRC32(NEW.url) 

を含む、urlCRCの値を計算するだろうトリガBEFORE INSERTを追加することができ

urlCRC INT(11) UNSIGNED NOT NULL (PRIMARY KEY) 
url VARCHAR(255) NOT NULL 
page MEDIUMTEXT 

存在します引数inURL(文字列)として受け取り、返される行数が0の場合、内部的には

SELECT * FROM cacheTable WHERE urlCRC = CRC32(inURL); 

を行うだろう、ストアドプロシージャ、その後、あなたがtrigのことができますそれをキャッシュするロジックです。

これはもちろん過度のことかもしれませんが、競合がなければ十分であると想定して動作する数値キーを提供します。 VARCHAR(255)としてURLを保存することで、競合が発生した場合でも、別のアルゴリズムを使用して簡単に新しいハッシュを再生成できます。

私はちょうど私の頭の上の例としてCRC32()を使っています、より適切なアルゴリズムがあります。取り除く主なポイントは、数値キーがより効率的に検索できるので、文字列を一意の数値に変換することができれば、データを取得するときに効率が向上することです。

0

テーブルに動的サイズの列(TEXT)がない場合、URL列を固定長文字列に変更すると、インデックス作成が少し速くなります。 URL構造に応じて、整数に変換することも可能です。何らかのハッシュ関数を使用することもできます。しかし、なぜあなたはあなたの人生を楽にしませんか?

キャッシュの結果を直接ディスクに保存し、ファイルが存在する場合はそれに一致するmod_rewriteフィルタを作成して(それを.htaccessに設定します)、それ以外の場合はPHPスクリプトを呼び出すことができます。これには2つの利点があります:

  1. キャッシュが熱い場合、PHPは実行されません。これにより、時間とメモリが節約されます。
  2. ファイルが頻繁に要求され、十分に小さい(またはRAMが多い)場合は、RAMに保持されます。これはMySQLよりはるかに高速です。
0

その後、

select page from (select * from cache where HASHEDURL = STOREDHASH) where url = 'someurl'