2011-07-15 11 views
0

私はウェブ開発のほとんどの側面にかなり精通しており、私は自分自身をジュニアレベルのプログラマと考えています。私はいつもアプリケーションのスケーリングについて考えてみて、もう少し詳しく知りたいと思っています。仮説的な状況を作りましょう。15分間隔のSQL挿入、大きなMySQLテーブル

私はデバイスをポーリングし、約2kbのXMLデータを15分間隔で取得するWebアプリケーションを開発中です。このデータは、非常に長い時間(少なくとも2年以上)保管する必要があります。今、このWebアプリケーションには、それぞれがこのデバイスを持つ100人のユーザーがいると想像してください。

10年後、私たちは数千万のテーブル行を話しています。 100人のユーザーには、各ユーザーのデバイスにクエリを実行し、2 KBのXMLを取得し、15分ごとにSQLデータベースに挿入するcronジョブがあります。

私のクエリが比較的簡単で、必要な列を集め、結合を使用し、サブクエリを回避するだけで、これは縮尺すべきではない理由がありますか?

答えて

0

、これはスケールはならない何らかの理由 はありますか?

あなたが大きくなると、Facebook、Twitterなどのように、メモリ内のデータベース(ディスクよりも速い)にアクティブなデータセットを置く必要があります。活動的なデータセットをメモリに入れないとTwitterは非常に遅くなった/スケールアップ=>この失敗鯨と呼ばれる多くの人々が、どちらもmemcachedを使用しますが、あなたはただ一つのボックスであればRedis(私はこれが好きです)またはAPCを使うこともできます。コンパイルされたバイトコードのキャッシングにAPCが使用されるため、パフォーマンスが必要な場合は常にAPCをインストールする必要があります。

ほとんどのPHPは、(たとえ実行されないことがあり、一部またはすべてが)各要求を構文解析のオーバーヘッドを避けるために、PHP スクリプトのコンパイルされたバイトコードをキャッシュし、 上でソースコードをコンパイルして作業アクセラレータ。 はさらにパフォーマンスを向上させるために、キャッシュされたコードは共有メモリ に保存され、そこから直接実行され、実行時にディスクの読み込みとメモリのコピーを最小限に抑えることができます。

+0

ありがとう、memcachedはおそらく私が最終的に終わるところです。他の答えも素晴らしかったです。 – Chris

+0

ようこそ。レディスも見てみるべきだと思います。それはいいです。私はSimon => http://simonwillison.net/static/2010/redis-tutorial/からこの信じられないほど良いチュートリアルに言及するのを忘れていました。 – Alfred

4

テーブルのサイズが大きくなるにつれて挿入が一般的に遅くなることはありませんが、インデックスの更新には時間がかかることがあります。ある時点で、テーブルを2つの部分に分割することができます。 1つはアーカイブ保存用で、データ検索用に最適化されています(基本的に索引付けされています)。新しいデータを処理するための2番目のテーブルです。

しかし、いつものように、確かに唯一の方法は、物事をベンチマークすることです。数千の行を持つクローンテーブルと、何百万という行を持つクローンテーブルを設定し、何が起こるかを見てください。

2

データファイルを日付順に自動的に分割し、古いレコードを低速で大容量のディスクアレイにエージングし、新しいレコード(およびINSERT)を高速アレイに保存することも可能です。次に、索引ビルドは、トランザクション全体ではなくデータのサブセットで作業する必要があります。すばやく実行する必要があります(通常、ディスクI/Oはデータベースシステムの最も遅い部分です)。結合のみ使用し、必要な列 を収集し、サブクエリを避け、私のクエリは比較的単純で仮定し

関連する問題