web-dev-qa-db-ja.com

PHP MySQLの結果をキャッシュする最良の方法?

私は現在PHPフレームワーク(元の、私は知っています)を構築しており、そのためのいくつかの最適化機能に取り組んでいます。私が遭遇した1つのジレマは、MySQLの結果をキャッシュする最良の方法は何ですか?I最初にMySQLを最適化するなどと言う人もいますが、議論のために言うと、私のクエリの実行には1分かかり、可能な限り最適化されています。

PHPに結果をキャッシュするための最良の方法は何ですか?したがって、ページをロードするたびにクエリを再実行する必要はありませんか?

私の最初の考えは、おそらく結果をループして配列に追加することでした...それらをシリアル化してファイルに保存しました。キャッシュの作成は1回だけなので、配列に100万個の結果が含まれている場合は、シリアライズ関数のオーバーヘッドを許容できます。ただし、キャッシュされたファイルをロードしてから、すべてのページロードで配列のシリアル化を解除すると、パフォーマンスに影響を与える可能性があります。

キャッシュ中に、結果をシリアル化してファイルに書き込むのではなく、PHP読み取り可能な配列で結果を表示する方法でファイルに書き込むことをお勧めします。ロードされ、シリアライズ解除のオーバーヘッドはありません。

頻繁に使用するために遅いクエリをキャッシュする他の方法(読み取り:より高速)はありますか?

29
Ozzy

これがストレート配列の場合、シリアル化するのではなく var_export() を使用できます(適切な ""でラップして.phpファイルに書き込み、次に include()) これがスクリプト内にあります。htdocsツリーの外に書き込むことができ、メモリキャッシュが過度と見なす大量のデータにのみ適している場合に最適です。

18
Mark Baker

Memcached

ほとんどの場合、内部で何が行われているのかをよく理解するために、常に少なくとも1回は独自のソリューションを作成するようにしています。独自のキャッシングソリューションを作成したとき、私は本質的にあなたが話していることを行いました。

// serialize an array of all results
$serialzedData = serialize($resultData);

// set TTL (60 seconds) and create cache filename with timestamp
$ttl = 60;
$cacheFilename = $ttl . '_' . time() . '_' . md5($sqlQuery)

// dump
file_put_contents($cacheFilename, $serializedData);

クエリが実行される前に、cacheディレクトリを検索して、一致するクエリハッシュを持つファイルを探します。含まれている場合、テストはtimestamp + ttl <= current_time、trueの場合、シリアル化されていないファイルの内容を返します。それ以外の場合は、上書きします。

12
Dan Lugg

MySQLはクエリの結果をキャッシュしますが、mysqlクエリのキャッシュサイズを増やす必要がありますか?または、スタンドアロンテーブルに大きなクエリの結果をキャッシュしますか?

4
Scalar

Google for Memcache。これで正しい方向に進むはずです。

3
Furicane