3

データベーステーブルがmysqlでパーティション化されている場合、個々のパーティションはどのようにアクセス/クエリされますか?

編集

@Crackのコメントに応えて。

したがって、パーティションがテーブルに配置されている場合でも、通常のクエリを使用します。クエリのデータベース側で、「プルーニング」はどこから入りますか?それでは、すべてのクエリに適用されるのはかなり複雑な保存Where句ですか?個別にアクセスされない場合、パーティションに名前が付けられるのはなぜですか?

4

2 に答える 2

4

さて、これを一度に1つずつ取り上げましょう。

したがって、パーティションがテーブルに配置されている場合でも、通常のクエリを使用します。

はい。パーティショニングは透過的であり、物理的に分割することでクエリのパフォーマンスを最適化することを目的としています(よく使用されている場合)。データとインデックスを別々の「ビン」に保存します。

クエリのデータベース側で、「プルーニング」はどこから入りますか?それでは、すべてのクエリに適用される、かなり複雑な保存されたWhere句ですか?

はいといいえ。パーティショニングスキーマに応じて、MySQLはデータをばらばらの「ビン」に入れます。後でWHEREクエリの句を読み取り、それに答えるためにチェックする必要のあるパーティションを認識します。MySQLのドキュメントには、ドキュメントにいくつかの良い例があります:パーティションプルーニング

これにより、各パーティションを異なる物理ストレージデバイスに保存でき、MySQLはいくつかの操作を並行して実行することも、一部のパーティションをまったくスキャンしないこともできます(上記のリンクの例を参照)。

個別にアクセスされない場合、パーティションに名前が付けられるのはなぜですか?

それらは個別にアクセスされますが、この決定は行いません。オプティマイザーが行います。パーティション名を使用すると、パーティション名を簡単に管理できます。ドキュメント(パーティション管理)で可能な操作を見つけることができます。

MySQL 5.6.2以降、個々のパーティションからデータを選択できます。「パーティションの選択」を参照してください。アドバイスです。この構文を使用すると、クエリがデータのストレージ構造にバインドされるため、必要がない場合はこの構文を使用しないでください(また、本番環境で不安定なバージョンのMySQLを使用しないでください;)。

于 2012-04-05T21:22:13.373 に答える
3

データのプルーニングは、主にデータを挿入するときに実際に機能します。

たとえばid、整数列のハッシュでテーブルを分割し、ハッシュ関数が整数が奇数/偶数かどうかをチェックしていると仮定します。したがって、MySQLは事実上2つのビン(と)を作成odd bineven binます。

挿入するid = 1と、MySQLはハッシュ関数を適用します。結果は。oddなので、データはに入れられodd binます。を挿入するid = 2と、データはに移動しますeven bin

クエリにはプルーニングは含まれず、ほんの少しのスマートロジックが含まれます。MySQLは、このテーブルで実行されたクエリから、1つのパーティション(この場合はデータの半分)しか見ることができなければ、パフォーマンスが向上する可能性があることを認識しています。そのため、パーティションを識別しようとします。

idの列を含むクエリが実行されるwhereと、MySQLは渡された値にハッシュ関数を再度適用します。私が言うWHERE id = 2 AND <some other condition>と、ハッシュはを返しますeven。したがって、MySQLは。のみを調べますeven bin

この簡単な例では、データをクエリ/挿入するときに、完全なデータセットの半分だけをスキャン/更新する必要があり、パフォーマンスが約2倍向上することがわかります。2回(今のところハッシュオーバーヘッドを割り引いてみましょう)。

于 2012-10-15T10:45:03.597 に答える