SQLからNoSQLに移行すると、どのサイズのデータ​​で有益になりますか?


24

リレーショナルデータベースプログラマーとして(ほとんどの場合)、リレーショナルデータベースがどのようにスケールしないか、MongoDBなどのNoSQLソリューションがどのようにスケールするかについての記事を読みました。これまでに開発したデータベースのほとんどは小規模から中規模であったため、インデックス作成、クエリの最適化、またはスキーマの再設計によって解決されなかった問題は一度もありませんでした。

MySQLはどのようなサイズに苦しんでいると予想されますか。何行ですか?

(これはアプリケーションと保存されるデータの種類に依存することを知っています。基本的には遺伝学データベースだったので、3つまたは4つのルックアップテーブルを持つ1つのメインテーブルがあります。メインテーブルには、他のもの、染色体参照、および位置座標。おそらく、そこに保存されているものを確認するために、染色体上の2つのポーション間の多くのエントリを照会されます。


4
おそらく、MySQLがリレーショナルデータベースが処理できる行数の上限であるという仮定の下で苦労するべきではありません。あなたは本当に2つの質問をしていますMySQLはいつ文字列を使い果たしますか?そして、SQL RDBMS容量の制限は何ですか? 誰に答えたいですか?
Blrfl

回答:


13

どのくらいのデータですか?

2つの重要なしきい値があります。

  1. データ全体がRAMに収まる
  2. インデックスデータ全体がRAMに収まる

高速SSDを使用すると、トラフィックが非常に多い場合を除き、最初のしきい値の問題が少し少なくなります。

酸度

RDBMSのスケーリングに関する問題の1つは、それらが設計上ACIDであるということです。これは、トランザクションと行レベルのロック(または、一部の古い/単純なRDBMSのテーブルレベル)を意味します。同時に実行する多くのデータを変更する多くのクエリがある場合、制限要因になる可能性があります。通常、NoSQLソリューションは結果整合性モデルに適しています。

RDBMSはデータサイズをどのようにスケーリングしますか?

RDBMSがデータサイズをスケーリングできないことは完全に真実ではありません。2つの選択肢があります。垂直分割と水平分割(別名、シャーディング)です。

垂直分割では、基本的には無関係のテーブルを別々のDBサーバーに保持するため、各テーブルのサイズは上記のしきい値を下回っています。これにより、プレーンSQLを使用したこれらのテーブルの結合が単純でなくなり、効率が低下します。

シャーディングとは、特定のキーに基づいて、さまざまなサーバー間で1つのテーブルからデータを配布することです。これは、ルックアップのために、そのキーに基づいてどのサーバーを照会するかを知っていることを意味します。ただし、これにより、シャーディングキーのルックアップではないクエリが複雑になります。

両方の種類のパーティションの場合、極端に進んだ場合、基本的にNoSQLデータベースと同じ状況になります。


9
Oracle、PostgreSQL、MySQL、MS SQL Server、Sybaseはすべて、クライアントが作業を行わなくても、リモートサーバー上のテーブル間で結合を実行できます。
Blrfl

4
「RAM内のデータ全体」については、これは実際のワーキングセットに関するものであることに注意してください。多くの場合、データベースは、メモリよりも大きいが、それのほとんどはめったにディスク上に長いインデックスと、多くの場合、フェッチされた行などがメモリ内にあるほど、あまりにも悪いわけではないことを持つ、アクセスされていない
ヨハネス

2
@vartecでは、月に1回だけ検索するので、私の2年前のメールをメールデータベースから削除したいのですが、メインのワーキングセットは最後の10メールのみです。
ヨハネス

3
@wobbily_colヒント:そうではありません。一貫性、信頼性、耐久性を気にしない限り。その場合、一方を他方よりもはるかに高速にする多くの機能をオフにできます。それぞれのデフォルト設定は何だと思いますか?(もちろん、MySQLはデータの安全性の頂点でもありません...)
ハビエル

1
@vartecの「自動シャーディング」は、適切な場合に便利です。しかし、突然すべてのデータを結合することはできなくなりました-ああ、ドキュメントデータベースでは実際にそれを行うことはできません。また、すべてのデータを検索したり、レポートを作成するのは面倒になります。操作は、他のシステムで同じ一致...だけではデータの量には因子(私は成功しテラバイト領域のデータで実行されている十分なのMySQLインスタンスを知っている...と数百MBとのプロジェクトは失敗)ではありません
ヨハネス

13

データのサイズが唯一の要因だとは思いません。「データモデル」も非常に重要な部分です。

Eコマースカタログページ(Solr、ElasticSearch)、Web分析データ(Riak、Cassandra)、株価(Redis)、ソーシャルネットワーク(Neo4J、FleetDB)のリレーションシップ接続は、NoSQLソリューションが本当に輝いている場合のほんの一例です。

私見、NoSQLソリューションまたはRDBMSを検討する場合、データモデルはデータのサイズよりも重要な役割を果たします。


9
まさに。このすべての「ビッグデータ」は、マーケティングのスピーチであり、「NoSQLのNoSQL!」ものも同様です。NoSQLは、従来のRDBMSよりも高速であるため、大規模なデータセットには適していますが、機能のトレードオフが大きいため高速です。多くのデータモデルは、これらのトレードオフを考慮すると大幅に低下しますが、一部は正常に機能します。NoSQLにアクセスしたときに何が失われているのかを把握し、そのような損失を被る可能性のあるデータにのみNoSQLを使用することが重要です。
ジミー・ホッファ

1
それは本当ですが、質問に対する答えではありません。
バルテック

これは答えではなく、真実でもありません。JSONデータ型を使用するだけで、SQLデータベースのテーブルのようなドキュメントを作成し、SQLデータベースをNoSQLに照らすことができます。
エフゲニー・アファナシエフ

6

リレーショナルデータベースが拡張されない場合、何も拡張されません。スケーリングの問題を心配する必要はありません。

SQLにはある種の分析に関する問題がありますが、問題を引き起こすのに多くのデータを必要としません。たとえば、一意のキーに基づいて他の行を参照する列を持つ単一のテーブルを考えます。通常、これはツリー構造を作成するために使用されます。関連する行を参照する高速SQLステートメントを作成できます。または、関連する行の関連する行。実際、特定の数のジャンプを行うことができます。ただし、各行に対して、チェーンの最初の関連する行で、ある基準を満たすフィールドを選択する場合、複雑になります。

国、州/州、郡、町、村のレベルでオフィスの場所のテーブルを考えてみましょう。各オフィスは、報告先のオフィスを参照します。各オフィスのレポートオフィスが1レベル上にあるという保証はありません。すべてが1つのレベルにあるわけではない、選択されたオフィスのセットについて、各オフィスに関連付けられているナショナルオフィスをリストする必要があります。これにはSQLステートメントのループが必要であり、今日でも長い時間がかかります。(以前は30のオフィスを選択して30秒を取得していましたが、それはかなり前のことであり、ストアドプロシージャへの切り替えは少し役立ちました。)

そのため、別の方法は、構造全体を1つの大きなデータブロックに入れ、ラベルを付けて保存することです。データを分析する場合は、一度にすべてのデータをメモリに読み込み、構造を追跡するためのポインターを設定すれば、瞬く間に数百万のオフィスを処理できます。

これはどれもデータの量とは関係ありません。キーは、データの組織の性質です。リレーショナルレイアウトが役立つ場合は、RDBMSが必要です。そうでない場合、ある種のバルクストレージは、わずかに1倍から1兆倍高速になります。

これらのデータセットの1つが大きすぎてメモリに収まらない場合、SQL以外のデータベースは機能しなくなることに注意してください。別の問題は、一度に複数のブロックからのデータが必要な場合です。あなたはこれを行うことができた場合、およびのみ場合、すべてのブロックを一度にメモリに収まります。そして、ユーザーはそれらをロードするまで待つ必要があります。

リレーショナルデータベースが問題を引き起こす場合、大量のデータを入れる前にそれを行います。唯一のスケーリングの問題は、nosql DBにアセンブルしているデータのブロック(使用する必要がある場合)が大きすぎる場合のプログラムの問題です。(メモリ不足エラーについて調べてください。新しい言語では、メモリに関して奇妙なことをすることがあります。)


0

NoSQLまたは分散ソリューションに移行する最初の理由は、すべてのデータのサイズではなく、テーブルのサイズだと思います。分散ソリューションが優れているのは、テーブルを異なるノードに分割し、テーブルを照会する必要がある場合、各ノードがテーブルの一部を処理することです。

RDBMSはこれを行うことができますが、これを行うためにNoSQLデータベースの新しい波が構築されました。Oracle、MSSQL、MySQLは、集中型モデルを採用し、分散環境で動作するように調整しました。ただし、一部の新しいデータベースは結果整合性を使用するなどの厳格なルールを順守していませんが、それらは依然として厳格なACIDルールを順守しています。

どちらか一方を選択する必要があるデータの量は決まっていない。考慮に入れる必要があるのは、データベースのニーズとそれが受け取る使用量です。NoSQLデータベースは、より大きなデータセットをより迅速に処理できますが、リレーショナルデータベースは、ACIDの原則によりデータが正しいことを確信できます。


0

また、データモデルが物事に大きな影響を与えることに言及する価値があるかもしれません。何らかの形式のツリー構造を作成する必要がある場合(つまり、複合主キーに外部キーを含むテーブルに自己参照外部キーがある場合)、おそらくそれらを処理するデータベースの何らかの形でそれを行う必要がありますデータの種類(mongodbやcouchdbなど)。

他の人が言ったように、あなたはあなたのアプリケーションで何が起こっているのかも考慮に入れるべきです。複数のテーブルにまたがるACIDが本当に必要な場合は、RDBMSに固執する必要がありますが、少し古いデータがあり、NoSQLスキーマの柔軟性が必要な場合(必要に応じてスキーマレスと呼びます)まだ何らかの形式の暗黙的なスキーマがあります)、NoSQLストアを取得することを検討するかもしれません(http://www.10gen.com/customers/craigslistは、craigslistが切り替えられた理由の例ですが...小規模から中規模のデータベースサイズには収まらないデータですが、ユースケースが役立つ場合があります)。

RDMSを置き換えるためにNoSQLシステムが必ずしも存在するわけではないことに注意してください何らかの形式のNoSQLストアへのデータ。


0

Mongo多数のコンピューター/ノードにインストールできます。PostgreSQLシャーディング用の組み込みツールは提供していませんが、citusは存在します。

MongoDBは最大64テラバイトのデータベースをサポートし、ドキュメントサイズは16メガバイトです。

MySQLのデータベースの制限は256テラバイト、テーブルの最大サイズは64テラバイト、レコードの制限は4ギガバイトです。

PostgreSQLはデータベースに制限がなく(テスト用に4テラバイトが存在します)、テーブル内の1つのフィールドのサイズに1ギガバイト、テーブルの最大サイズに64テラバイトの制限があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.