MySQLパーティショニング:パーティションの数と各パーティションのサイズの間にパフォーマンスのトレードオフはありますか?


10

効率的に分割したい大きなテーブル(数億行)があります。私の質問は、パーティションサイズとパーティション数の間にトレードオフがあるかどうかです。私が理解している限り、クエリは(ほとんどのクエリに対して)クエリに適用可能なパーティション内のみを検索する必要があるため、パーティションで使用される列に対するほとんどのクエリはより高速になります。したがって、効率を最大化するには、大きなテーブルを最大数のパーティションに分割する必要があるので、各パーティションをできるだけ小さくする必要があります。MySQLの場合、これは1024パーティションを意味します。しかし、多数のパーティションを持つことにはパフォーマンス上の欠点がありますか?そうであれば、どのようにして最適なパーティション数を見つけるのでしょうか?

注:stackoverflowについて多少似た質問がすでにありますが、(私の観点から)マークを逃す答えは1つだけです。だから私は私自身の方法で質問を述べます...うまくいけばそれはより明確です

回答:


6

それらを比較してみましょう

パーティションサイズ

次のものがある場合:

  • テーブル内の1億行
  • BTREEインデックス
  • BTREEの各ページは1024のキーを保持します

メトリックはどのように見えますか?

LOG(100000000)/ LOG(2)= 26.575424759099なので、ページツリーノードあたり1024キーのBTREEインデックスは、ツリーの高さが3(CEILING(LOG(100000000)/ LOG(1024)))しかありません。3ページのみのノードの場合、アクセスされた各ツリーノードで必要なキーをバイナリ検索すると、約30個のキーが剪定および分離されます。

パーティション数

次のものがある場合:

  • テーブル内の1億行
  • BTREEインデックス
  • BTREEの各ページは1024のキーを保持します
  • 1024のパーティションを作成します

数値は少し異なります。

各パーティションには約97656行が必要です。メトリックは今どのようになりますか?

LOG(97656)/ LOG(2)= 16.575421065795なので、ページツリーノードあたり1024キーのBTREEインデックスは、ツリーの高さが2(CEILING(LOG(97656)/ LOG(1024)))しかありません。2ページのみのノードの場合、アクセスされた各ツリーノードで必要なキーをバイナリ検索すると、約20個のキーが剪定および分離されます。

結論

キーを分散すると、1つのツリーレベルが削除されるだけですが、基本的には1024のインデックスが作成されます。クエリは違いを知りません。検索時間は、パーティションを優先して、せいぜい名目上です。ただし、すべてのデータがアクティブであることを確認してください。それ以外の場合、ごく少数のパーティションにヒットする可能性がありますが、ほとんどアクセスされないデータを持つ他のパーティションは領域を占有するだけで、パーティション分割を正当化するほど頻繁にアクセスされることはありません。より露骨なことを心配するために、さまざまなパフォーマンスメトリックがある場合があります(XFSの内部デフラグ、ext3とext4など)。また、次の理由により、使用しているストレージエンジンについても考慮する必要があります。

  • クラスタ化されたインデックスを管理する必要があるため、InnoDBのインデックス作成はMyISAMと比較すると少し厄介です
  • InnoDBは、ibdata1および現在のログファイル(ib_logfile0またはib_logfile1)にデータを二重に書き込みます

1
RolandoMySQLDBAに感謝します。これは非常に興味深いものです。このことから私が理解しているのは、パーティショニングはクエリ速度にわずかながらかなりのプラスの影響を及ぼしますが、断片化などの他のマイナスの影響を与える可能性があるということです。しかし、私が興味を持っているのは、パーティションの最適な数を決定する方法です。常に最大許容数(つまり1024)を使用する必要がありますか、それとも他の数が正の効果と負の効果の間の良い妥協点になるでしょうか?または、この種の最適化を分析することは不可能ですか?
robguinness 2012

:ところで、この記事では、答えはもう少し複雑であることを示唆しているmysqlperformanceblog.com/2010/12/11/...
robguinnessは

答えは良いですが、それはキー(またはインデックス付きフィールド)による検索についてです。私はパーティショニングの経験はあまりありませんが、私の観点からは、完全なテーブルスキャンを実行する必要がある場合に役立ちます。このような場合、テーブル全体ではなく、いくつかのパーティションのみをスキャンします。
チェリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.