8

ファイル内のデータのキャッシュ ( serialize/unserialise vs json_encode/decodevar_exportigbonary ) と mysql クエリ (optimizations、stored procedurequery 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 はどうですか」と尋ねるかもしれません。

4

1 に答える 1

2

最初の質問:

あなたの操作は で問題ないはずLOCK_EXです。同時にアクセスするとファイルがロックされる可能性があり、確実に速度が低下しますが、すべての操作は正しく完了するはずです。ただし、これは、独自のキャッシュ システムを実装してはならない理由の良い例です。

2 番目の質問:

MySQL は間違いなくキャッシュ システムよりも高速です (ただし、PHP 以外で真剣にウィケット コーディングを行っている場合を除きます)。MySQL のようなデータベースは、パフォーマンスを最適化するために多くの作業を行ってきました。

SELECT上記の例では、MySQL のストアド プロシージャが、単純な古いクエリよりも実際に役立つとは思いません。

サーバー クラスターでシャーディングを使用する場合は、MongoDB のような NoSQL アプローチを使用すると役立ちます。これは書くのが難しく、サーバーが増えるほど費用がかかります。また、あなたの質問からは、別のデータベース システムへの移行がオプションであるかどうかは明確ではありません。

MySQL に固執する場合は、データベース サーバー クラスターよりも負荷分散アプリケーション サーバーを実装する方がおそらく簡単です。これを念頭に置いて、MySQL でより多くの作業を行うよりも、PHP でより多くの作業を行うことが推奨されます。しかし、私はこのアプローチには従いません。なぜなら、あなたはわずかな利益のために多くをあきらめているからです。

要するに、SELECT必要なものを取得するために単純なクエリを使用することをお勧めします。アプリケーションとデータベースを別々のサーバーで実行し、より強力なサーバーを DB サーバーに使用します。

PS。Facebook は、PHP のプリコンパイラを作成して、コードをより高速に実行できるようにします。私の意見では、PHP はそれほど高速な言語ではなく、Python または Node.js からより良い結果を得ることができます。

Stackoverflow は、MS SQL Server で ASP.NET MVC を使用します。彼らはデータベース用に単一の強力なサーバーを持っており、可能な場合は DB クエリを使用しているようです。また、DB サーバーとは別の負荷分散されたアプリケーション サーバーも使用します。

于 2013-02-14T22:57:26.950 に答える