web-dev-qa-db-ja.com

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

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

私の場合

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

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

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

10
chell

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

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

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

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

5
zgguy

ここでの答え はよく書かれていて、引数を zgguy's answer のように作成します。パーティショニングは、もしあれば、あなたが多くを買うことはありません。最も頻繁なルックアップは、主キーまたは類似のものに基づいています(インデックス付きルックアップは同じくらい高速でなければならないため)。

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

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

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

2
chell

最初に頭に浮かぶのは パーティションの剪定 ;です。それがクエリで使用できるものでない場合。

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

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

1
mysql_user