それらを比較してみましょう
パーティションサイズ
次のものがある場合:
- テーブル内の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)にデータを二重に書き込みます