ファイル内のデータのキャッシュ ( serialize/unserialise vs json_encode/decode、var_export、igbonary ) と mysql クエリ (optimizations、stored procedure、query cache )について多くの検索を行いましたが、現時点では、どの方法がより良いのか疑問に思っています。次のような具体的なケースを最適化します。
前もって申し訳ありません:これは私が推測する小さな答えの長いトピックですが、プロジェクトを理解する必要があります. そして、私の母国語ではない下手な英語を許してください。
このデータベース関係があると想像してみましょう。
データベースの説明 (括弧内は推定レコード数) :
- MODULE (10) : アイテムのタイプで、記事、フォーラムのトピック、広告、ニュースなどがあります...
- ITEM (百万) : タイトルとテキストを含む任意のタイプ
- CATEGORY (50) : アイテムのカテゴリ (動物、政治、車、コンピューターなど)
- TAG (数十万): カテゴリのタグ (例: 政治: 国際、フランス、バラク・オバマ...)
- ITEM_TAG (outch) : アイテムとタグの関連付け
そのため、いくつかの関係があり、それぞれが ITEM の作成/更新の記録者です。
次の例では、ITEM データをフォルダーとファイルに既にキャッシュしています。
public function cacheItem()
{
$req=mysql_query("SELECT id, title, content, id_mod, id_cat
FROM ITEM
WHERE ITEM.id='".$this->id."'")or die(mysql_error());
if(mysql_num_rows($req)==1)
{
$this->itemData=mysql_fetch_array($req);
$this->folder=floor($this->id/1000);//1000 items max per folder
$this->itemUrl=$this->folder."/".$this->id.".txt";
if(!file_exists($this->itemUrl))
{
touch($this->itemUrl);
}
file_put_contents($this->itemUrl,serialize($this->itemData),LOCK_EX);
}
}
そして、私はそれらを手に入れますunserialize(file_get_contents($url))
、この部分は魅力のように機能します!
ここで、ITEM のリストを最適化して、いくつかのオプション(たとえば) で表示するようにしたいと考えています。
- 全てのアイテム
- MODULEのITEM
- CATEGORYのITEM
- CATEGORY と MODULE の ITEM
- TAGのITEM
- TAGとCATEGORYのITEM
- TAG と CATEGORY と MODULE の ITEM
SQL でこれを行う方法と、結果をキャッシュ ツリーに入れる方法は既に知っています。
これらのキャッシュ ファイルに関する私の問題は、新しい ITEM が作成/更新されると、リストを非常に厳密に更新する必要がある場合があることです。
最初の質問:
では、ITEM が同時に作成/更新された場合 (それらのリストも) はどうなるでしょうか?
LOCK_EX
からファイルを取得している間、file_put_contents();
は自分の仕事をしますfile_get_contents();
か?
2 番目の質問
より多くの PHP が機能し、mySQL がより少なく (およびそれ以外の場合) 機能することは理解していますが、ページネーションを使用してこれらのリストを実行するためのより良い (表示が高速な) 方法は何でしょうか。新しいアイテムを更新しますか?
- 私のキャッシュシステム (私はそうは思わない...)
- MySQL のストアド プロシージャ
- 複数のデータベース サーバーおよび/または複数のファイル サーバー
- 他の
アイデア、例、リンクは大歓迎です。
PS : 楽しみのために、「Facebook はどうですか」と「stackoverflow はどうですか」と尋ねるかもしれません。