2011-08-10 13 views
1

当サイトには、当社のウェブサイトに登録しているすべてのユーザーの絶えず更新された内部Webサイトが書かれていました。このWebサイトは、過去5分間に登録されたユーザーに関する情報を提供しました。一定のSQL(select * from users...)がすべてのユーザーを取得するためにフェッチする必要がありました。where (Current time - Registered time) <= 300 seconds残念ながら、一定のSQLクエリはボトルネックになっています(これは起こりえないことを知らなかったわけではありませんが、対象読者が非常に小さく、これが迅速な解決策だったため、内部サイトが必要でした)。ウェブサイトの掲載結果を改善するための推奨事項 - PHP/MySQL

ウェブサイトのパフォーマンスを向上させることができる他のソリューションを使用して定期的なSQLフェッチをどのように排除することができますか?

+0

何らかのキャッシュ形式を使用してください。私は[redis](http://www.redis.io)を使用します。これはphpモジュールphpredisを持っています。最後のユーザーをキャッシュに追加すると、負荷の一部が取り除かれます。 –

+0

実行している正確なクエリを表示してください。 – sanmai

答えて

3

キャッシングは通常ここで考慮されるオプションです。 memcachedの拡張モジュールであるmembase(物理メモリ)には、ディスクやスケールに永続する機能を備えたメモリ内のキー値キャッシュがあります。 PHPクライアントライブラリはCouchbase's websiteにあります。キャッシングすると、1s +クエリがサブミリ秒のものに変わります。 APIは非常にシンプルです。

$mc = new Memcached; 
    $mc->addServer("localhost", 11211); 
    $mc->set("a", 1); // set a 1 to the key 'a' 
    $mc->get("a"); // retrieve value at key 'a' 
3

多分あなたはここでキャッシングを使うことができます。登録時に新しいユーザーをキャッシュします。彼らは記憶に残っている。

特定の番号のキューイングまたは一定時間が経過した後で、データベースに登録してINSERTするすべてのユーザーをキャッシュします。

2

この特定の問題を解決するには、おそらく結果をキャッシュするのが最適な解決策です。数秒間だけキャッシュする必要があります。データが最大10秒遅れている場合、ほとんどの人は気付かないでしょう。アプリケーションによっては、10分ほど遅れることがあります。

高価なクエリをキャッシュするもう1つの要素は、キャッシュされたデータにフラグを追加して、更新中の状態を示す必要があることです。これにより、複数のスレッドが期限切れであり、すべてが更新プログラムを取得していると判断されます。それを行うにはスレッドが1つだけ必要です!

関連する問題