2010-12-27 5 views
2

私のCMSでは、すべてが独立しているため冗長クエリを作成することがあります。このようなクエリをキャッシュしてもよろしいですか?:"キャッシュ" mySQLクエリ、これはOKのプラクティスですか?

 global $cache_query, $cache_result; 
     if(!is_array($cache_query) || !is_array($cache_result) || !in_array($q,$cache_query)) 
     {//The query is new. 
      $r = query_($q); 
      $cache_query[] = $q; 
      $cache_result[] = $r; 
     } 
     else 
     {//The query is cached. 
      foreach($cache_query as $k=>$c) // Cycle through my cached queries to find the key. Is there an getElementKey function? 
       if($c == $q) { 
        if(@mysql_fetch_array($cache_result[$k])) // is the resource is still valid? 
         mysql_data_seek($cache_result[$k], 0); // rewind the pointer 
        else 
         $cache_result[$k] = query_($q); // reset the resource 
        $r = $cache_result[$k]; 
        break; 
       } 
     } 
     return $r; 

ORは新しいクエリを毎回作成する方がよいでしょうか? $qが私のクエリです。関数query_()は何か問題が生じた場合にリソースとログを返します。

答えて

1

データベースクエリは頻繁に実行時間の大部分を占めるため、キャッシュすることができる場合は実行する必要があります。

しかし、名前付き変数(または連想配列の名前付き変数)にそれらを保存する方が良いかもしれません。なぜあなたは配列を歩くのではなく、次のようにします:

if(isset($cache_result[$query])) { 
    return $cache_result[$query]; 
} else { 
    // not cached 
} 
+0

私はインデックスが長すぎることを心配していました。クエリ内に ''がある場合 – Jason

+2

+1提案/改善:SQLクエリがかなり大きくなる可能性があるため、クエリ自体をassoc配列のキーとして使用するのではなく、SQLクエリのハッシュ値を計算できます – Ronnis

+0

@ロンニス、私はこれが好きです。良い考え。 – Jason

3

データベースクエリの結果リソースをキャッシュすることで、パフォーマンスが大幅に向上することはありません。データベースエンジンは、頻繁に実行されるクエリでキャッシュを提供していますが、そのリソースを大部分のオーバーヘッドが発生するアレイに変換する必要があります。

あなたはパフォーマンスを改善したい場合は、結果の配列代わりのリソースをキャッシュプリペアドステートメントを検討してください。このようにして、結果を何度も処理する必要はなく、実際の配列をキャッシュから取得するだけです。

+0

実際に質問を投稿した後、私は間違っていると考えていました。私はこれを行うだろうが、メモリに大規模な配列を格納するのか、単に再クエリするのかを決めることはできません。 – Jason

+0

-1。問合せ自体とは別に、最大のオーバーヘッドはホスト言語とデータベース・サーバー間の通信です。メモリ内のデータ構造を再利用することは、データベースから再取得することよりも数千倍も速くなります。 – Ronnis

+0

@ロンニス、私はこれを票決しました。なぜなら、答えにはこれを行う正しい方法が言及されているからです(結果配列をキャッシュする)。 –

0

これは大きな質問です!あなたの質問には一般的な答えがあります。

あなたのケースでは、キャッシュエントリをページの期間使用するように見えます。他の同時トランザクションがデータベースを上書きして、キャッシュされた結果無効を作るが、通常のページは非常に高速にロードされ、競合の可能性は十分に稀であるすること

可能です。

また、ではなく、という銀行システムを作成しているようですので、問題ありません。

メモ2 !!!キャッシュはページロード後に破棄されます。 は複数のページにまたがってロードされません。各ページの読み込みには少なくとも1つのクエリが必要です。

+0

それを永続化することについてはあまり気にしないでください。現在のページだけです。 – Jason

+0

あなたのセットアップに潜在的な問題はないことを伝えたいと思います。あなたのケースでは、これはあなたが尋ねたように、良い習慣と判断できます。一般的に、キャッシングは細心の注意を払って調べる必要があります –

関連する問題