2012-04-13 41 views
4

単純なWebアプリケーションの場合、できるだけ早く約30(10m * 3テーブル)百万レコードを処理することが主な要件です。私はそのような量のデータで作業していないので、経験豊富な人からアドバイスを受けたいと思っています。大規模なデータセット(数千万行)

データベースはビジネスの詳細を保持します。約25の属性が単一のビジネスを記述します。名前、住所など。テーブルの構造は以下の通りです。そこ

CREATE TABLE IF NOT EXISTS `businesses` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `type` int(2) NOT NULL, 
    `organisation` varchar(40) NOT NULL, 
    `title` varchar(12) NOT NULL, 
    `given_name` varchar(40) NOT NULL, 
    `other_name` varchar(40) NOT NULL, 
    `family_name` varchar(40) NOT NULL, 
    `suffix` varchar(5) NOT NULL, 
    `reg_date` date NOT NULL, 
    `main_trade_name` varchar(150) NOT NULL, 
    `son_address_l1` varchar(50) NOT NULL, 
    `son_address_l2` varchar(50) NOT NULL, 
    `son_address_suburb` int(3) NOT NULL, 
    `son_address_state` int(2) NOT NULL, 
    `son_address_postcode` varchar(10) NOT NULL, 
    `son_address_country` int(3) NOT NULL, 
    `bus_address_l1` varchar(50) NOT NULL, 
    `bus_address_l2` varchar(50) NOT NULL, 
    `bus_address_suburb` int(3) NOT NULL, 
    `bus_address_state` int(2) NOT NULL, 
    `bus_address_postcode` varchar(10) NOT NULL, 
    `bus_address_country` int(3) NOT NULL, 
    `email` varchar(165) DEFAULT NULL, 
    `phone` varchar(12) NOT NULL, 
    `website` varchar(80) NOT NULL, 
    `employee_size` int(4) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `type` (`type`), 
    KEY `phone` (`phone`), 
    KEY `reg_date` (`reg_date`), 
    KEY `son_address_state` (`son_address_state`), 
    KEY `bus_address_state` (`bus_address_state`), 
    KEY `son_address_country` (`son_address_country`), 
    KEY `bus_address_country` (`bus_address_country`), 
    FULLTEXT KEY `title` (`title`), 
    FULLTEXT KEY `son_address_l1` (`son_address_l1`), 
    FULLTEXT KEY `son_address_l2` (`son_address_l2`), 
    FULLTEXT KEY `bus_address_l1` (`bus_address_l1`), 
    FULLTEXT KEY `bus_address_l2` (`bus_address_l2`) 
) ENGINE=MyISAM; 

このような2つの他のテーブルであることを行って、各事業の詳細であることの理由は、(比較のため)3つのソースで提供されます。 1つのテーブルだけが書き込みを行う予定です。アプリの使用状況、

  1. 少数の書き込み、読み込みの負荷について

  2. 10 * 3百万のデータは、時間外に挿入されず、最初に挿入されます。
  3. アプリケーションには多くの要求がありません。< 1秒あたり10リクエスト。
  4. 初期データの読み込み後、ユーザーはこれらの詳細を更新します。あるテーブルのデータを他の2と比較し、最初のテーブルのデータを更新します。
  5. 主に名前、住所、電話番号、州によって多くの検索が行われます。 1回の検索で3つのテーブルがすべて検索されます。検索は高速にする必要があります。
  6. 私の質問は、

    1. あるPHP

    を使用して、それを構築するための滑走ではなく、3つのテーブルを持つよりも、1台の中に3つのソースを処理するために、それは価値がありますか?

  7. MySQLは良い解決策を提供できますか?
  8. MongoDBはハードウェアリソースを少なくして同じシナリオを処理できますか?
  9. サンプルデータベースをテスト用にセットアップする最も良い方法は何ですか?私はAmazon RDS(大)を購入し、10000レコードを挿入し、それらが1千万レコードになるまで倍増しました。
  10. このテーマについての良い読書ですか?

ありがとうございます。

+0

構造が確定していますか、それとも変更/改善できますか? – mamadrood

+0

はい、変更できます。 –

答えて

6

私はあなたの直接の質問に答えることはできませんが、私は大きなデータセットを扱った経験があります。

私が試してみるのは、大部分のケース(あなたのケースの検索では)操作がうまくいき、それに基づいてデータの保存/分割を検討することです。

次は測定、測定、測定です。いくつかのデータベースシステムはある種類の操作と他の操作とでうまく機能します。データの量が増え、運用の複雑さが増すと、うまくいったものが悪化し始める可能性があります。これがあなたが測定する理由です。使用しているDBシステムがこれらの負荷のもとでどのように動作するかの良い証拠なしに、これを設計しようとしないでください。

次に、追加操作を繰り返し実行します。

すべての人に最も適しているとは思わないでください。あなたのデザインと研究が掘り下げられるにつれて、最適化が必要となるかもしれない場所が見えます。過去に行ったように、さまざまな種類のキャッシングとインデックス作成が異なる時期に行われることもあります。

幸運 - 面白いプロジェクトのように聞こえる。

+1

返事をありがとう、私はいくつかのサンプルデータセットをもっと混乱させる必要があると思います。 –

関連する問題