質問

私は現在、膨大な量のデータ (数十億行) のクエリを実行する問題に取り組んでいますが、この種のことには多少慣れていないため、賢明なアドバイスが欲しいです。

データ/問題は次のようになります。

  1. 各テーブルには 2 ~ 5 つのキー列と 1 つの値列があります。
  2. すべての行には、キーの一意の組み合わせがあります。
  3. キーの任意のサブセットによってクエリを実行できる必要があります (つまり、key1='blah' および key4='bloo')。
  4. 新しい行をすばやく挿入できれば便利ですが (行がすでに存在する場合は値を更新します)、これをゆっくり実行できれば満足です。

現在、これを単一のマシン上で実行する MySQL に実装しており、キーごとに個別のインデックスが定義されており、すべてのキーにまたがる 1 つのインデックス (一意)、および最初と最後のキーを組み合わせた 1 つのインデックス (現在、私が作成している最も一般的なクエリです)しかし、それは簡単に変わる可能性があります)。残念ながら、これは非常に遅いです (そしてインデックスは最終的に最大 10 倍のディスク領域を占有することになりますが、これは大きな問題ではありません)。

私はたまたま高速のコンピューターを多数 (約 40 台) 自由に使えるようにしているため、この単一マシンのデータベースの信じられないほどの遅さがさらにイライラさせられます。このすべてのパワーを利用して、このデータベースを高速化したいと考えています。分散ハッシュ テーブルを構築することを検討しましたが、キーのサブセットのみをクエリするのが難しくなります。BigTable / HBase のようなものが適切なソリューションであるように思えますが、より単純なソリューションが存在しないという確信はまだありません。

誠にありがとうございます。何かご協力をいただければ幸いです。

正しい解決策はありません

他のヒント

私はあなたの分散型データベース上のいくつかの優れた情報については、このポッドキャストを聴くことをお勧めしたいです。 エピソード-109-ebays -architecture原理 - と - ランディ・シャウプする

明白なことを指摘して:あなたはおそらくディスクバインドされている。

。 あなたがrandomishクエリをやっているし、あなたのワーキングセットがRAMに比べて十分に大きい場合は、

いくつかの時点で、あなたはディスクが行うことができますランダムIOPSの小さな数によって制限されます。あなたが接続されているディスクあたり毎秒サブクエリの数十より良い行うことができるようにするつもりはないされます。

あなたがそのボトルネックに直面している場合は、あなたが希望よりも、ほとんどがちょうどより多くのあなたを得ることになる(多くのコンピュータ間でデータベースを分散することにより、SSD、より大きなRAID、またはたくさん-の-RAMに切り替えることで、よりを得るかもしれません最後の2つのリソースの)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top