3

私はシャーディングに不慣れで、シャーディングがさまざまなクエリにどのような影響を与えるかを知りたいと思いました。「people」という名前のサンプルデータセットの場合:

person_id | person_fname | person_lname | person_dob
----------------------------------------------------
1         | John         | Smith        | 1972-03-04
2         | Sally        | Jones        | 1968-09-14
3         | Phil         | Forrester    | 1976-11-25
4         | Gwen         | Langley      | 1955-04-20
5         | Pedro        | Romero       | 1962-12-21
6         | Gene         | Halford      | 1978-01-11
7         | Juan         | Peza         | 1977-08-07
8         | Pierre       | Henry        | 1980-04-30

代理ID「id」のハッシュを作成することにより、データは4つのノード間で均等にシャーディングされます。ただし、次のようなすべてのノードにまたがる可能性のあるレコードに対して、読み取りおよび書き込み操作を実行する必要があります。

SELECT person_fname, 
       person_lname 
FROM   people 
WHERE  person_dob > '1970-01-01'

または、「person_id」列の「people」を参照する「orders」のテーブルがさらにあり、結合を実行したいとします。

SELECT    order_id,
          order_amount,
          order_date,
          person_fname,
          person_lname
FROM      orders
LEFT JOIN people
WHERE     order_amount > 50

事実上、すべてのノードがクエリを並行して実行するのは事実ですか?1つのインスタンスが8つのレコードに対してクエリを実行する代わりに、4つのインスタンスが2つの(ish)レコードに対してクエリを実行するため、各サーバーで実行する作業が各ステップで少なくなると想定しています。シャード選択を実行できる場合、他のノードはそれ以上の命令を実行し続ける必要はありません。この仮定は正しいですか?

シャーディングと複雑な結合(この単純な例以外)のパフォーマンスへの既知の影響はありますか?

4

3 に答える 3

2

実際、それを並行して行うことができます。

実際、結合が複雑になり、異なるシャードをまたぐ必要がある場合は遅くなる可能性があります。

ただし、多対 1 の場合、たとえば、テーブルorders内のすべての行がordersテーブル内の関連する行と同じシャードにあるような方法でシャーディングした場合people、このクロス シャードの問題は発生しません。

シャーディング アプローチを設計して、そのようなケースが多くなり、シャードをまたがるケースがほとんど (理想的にはゼロ) になるようにする必要があります。

また、実際に最も探しているキーにシャードを配置する必要があります。例えば。他のすべての出発点としてユーザー名で人を見つける場合は、id ではなくユーザー名でシャードする必要があります。ほとんどからゼロ行を返します。

于 2012-08-28T10:33:35.900 に答える
1

はい、シャーディングはパフォーマンスに深刻な変化をもたらします。アプリケーションを変更しないままにすることはできません

シャードする最も健全な方法は、データ モデルがデータを完全に独立してパーティション分割できる場合です。テナントがまったくやり取りしないマルチテナントの状況のように。この場合、結合がパーティションにまたがることはなく、すべて問題ありません。

これは、クロスパーティションの相互作用でシャーディングするときに非常に厄介になります。すべてのシャードに対して実行されるクエリを作成すると、パーティションの数に比例してコストがかかります。これは、ノードを追加してもスピードアップがゼロになることを意味します。

于 2012-08-28T10:38:22.957 に答える
0

免責事項: 私は完全なスケールアウト ソリューションのメーカーであるScaleBaseで働いています。必要に応じて「自動シャーディング マシン」を作成し、1 つの MySQL のように見え、「シャード」のグリッドにプロキシし、コマンド ルーティングを自動化し、クロスデータベースを並列化します。クエリ、マージ結果 - 1 DB から得られた結果との違いは見られません。ORDER、GROUP、LIMIT、agg機能に対応!ルーティングと並列化は、コマンドとパラメーターに従って「コントローラー」内で行われます。

お客様との経験から、並列クエリでパフォーマンスが大幅に向上しただけでなく、メンテナンスも改善されました。インデックスの作成、テーブルへの列の追加について考えてみてください。これらも並列化され、はるかに高速に実行されます。コードへの変更はまったくないか、ほとんどありません。

あなたのクエリの例は、「all-db」実行の古典的な例であり、分散および並列化された場合に確実に高速になります。インデックスがより効率的になり、RAM が使用されるなど...

私が助けてくれることを願っています。

于 2012-08-28T17:56:54.710 に答える