なぜパーティション化しないのですか?


10

いつデータベースを分割したくないですか?(MySQLパーティショニングを考える)

私の場合

  • 私は数百万行から始めます。そこから成長するはずです。
  • 最も頻繁なクエリ制約として機能する文字フィールドの主キー(および検索が頻繁に-少なくとも1秒に数回)。
  • 主キーは、パーティションキーとして機能するようにハッシュされます
  • 上記の頻繁なクエリでプルされるすべての行が更新されます
  • (日付列などに対する)頻度の低い検索では、すべてのパーティションをヒットする必要があります

最後の点でさえ、ルックアップは並行して実行されないので、すべての場合において、これは勝利ですか?パーティショニングの欠点は何ですか?少なくとも、100万件以上のレコードを表示しているときに、誰もがデフォルトで使用するものではないのですか?

更新-私はzgguyの回答を選択しましたが、私にとって非常に有用な同様の質問に対する本当に良い回答へのリンクを含む自分の調査の結果に自分の回答を追加したことに注意してください。

回答:


5

パフォーマンスの問題に特効薬はなく、パーティショニングも1つではありません。

すべてのパーティションは、本質的にそれ自体のテーブルです。したがって、データベースが1つのパーティションのみで行を検索できるように記述されたクエリはより高速になります。大きなテーブル全体をスキャンする必要があるクエリの場合、違いは非常に大きくなりますが、パーティションテーブル内の1つのパーティションのみをスキャンするように制限できます。一意のキールックアップの場合、差ははるかに小さくなります。

ただし、データベースがすべてまたはほとんどのテーブル(インデックス)パーティションにアクセスする必要がある方法でインデックスルックアップを使用するクエリは、実行速度がかなり遅くなります。

並列実行はそれ自体のトピックです。大規模な夜間バッチを実行し、マシン全体でその単一のジョブを実行する場合、その並列化は良いことです。ただし、データベースが常に多くの同時ユーザーからのクエリを処理するOLTPシステムでは、1人のユーザーがすべてのリソースを占有することは望ましくありません。


PKインデックスの方が速いため、一意/主キーのルックアップでは実際には(もしあれば)大幅な改善は見られませんか?これは全面的にですか?PKインデックスが遅くなることがありますか?ルックアップが最近追加されたPKに偏っている場合はどうなりますか?ほとんどのアクティビティが1つのパーティションのみにヒットする原因となるPKに基づくパーティション(パーティションキーアルゴはモジュラスまたは類似のものであり、ハッシュではないはずだと思いますか?)は役に立ちますか?
シェル、2015

プライマリ/ユニークキーのルックアップでは、せいぜいパフォーマンスのマイナーな改善が見られます。一方、DMLステートメントの競合を減らすことを目的とする場合は、DMLがいくつかのパーティションに集中するのではなく、すべてのパーティションに均等に分散されるようにパーティションを分割する必要があります。
zgguy 2015

10日後に戻ってきて申し訳ありませんが、重要なポイントを上げました-パーティション分割がおそらく不要であると考える十分な理由を提供しました、私のシナリオには、読み取り後にすべてのレコードを更新することが含まれます(1秒あたり数回)。非常に多くの書き込みが必要なため、パーティションが(均等に分散されていれば)より説得力のあるケースになり、書き込み負荷が分散されますか?
シェル、2015

また、多くのパーティションにヒットするクエリ(遅い)に関するコメントについても理解しようとしています。クエリがパーティションキーとしても使用(ハッシュ化)されたPKに対するものである場合、DBは、ルックアップのハッシュに基づいてどのパーティションに移動するかをすぐに認識しませんか?手伝ってくれてありがとう!
シェル、2015

最近、スタック交換にアクセスできませんでした。あなたがリンクした答えは素晴らしいです。私はそれがあなたの両方の質問に答えると信じています。
zgguy 2015

2

ここでの答えはよく書かれていて、zgguyの答えと同様の議論をします。パーティショニングは、もしあるとしても、最も頻繁なルックアップが主キーまたは類似のものに基づいている単一マシンのシナリオに利益をもたらしません。インデックス付きルックアップも同様に高速である必要があります)。

実際、よくあるアドバイスは、分割する主な理由は接線方向であり、主に管理に関連しているためです。たとえば、古いレコードを頻繁にパージする必要がある場合は、データを日付に基づいて分離します。ただし、ほとんどのクエリが最近追加されたレコードにしかヒットしないようなデータの場合、これは検索パフォーマンスにも影響を与える可能性があることが指摘されています。

また、MySQLが並行して何も実行しないことについても言及しました(いくつかのリンクまたはそれについての詳細な説明を見るとよいでしょう)。

書き込みアクティビティがさまざまな考慮事項を追加するかどうかについて誰かが話すのを見たことはありません。


書き込みによって回答が変わるとは思わない。私が見つけた4つのユースケースのうちの2つについて言及しました。8.0でも、まだ並列処理はありません。
リックジェームズ

1

最初に頭に浮かぶのは、パーティション・プルーニングです。それがクエリで使用できるものでない場合。

パーティション分割が役立つので、テーブルから大量のデータをパージする必要がありますか?古いですが、ピーターからのこの投稿には考慮すべき点がほとんどありません。

もう1つ考えられるのは、単純なテーブルの使いやすさです...パーティション分割には、追加の作業とメンテナンスが必要です。


新しいバージョンには、クエリをパーティションに明示的に制限する構文があります。これを使う正当な理由は考えられません。
リックジェームズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.