データベーステーブルがmysqlでパーティション化されている場合、個々のパーティションはどのようにアクセス/クエリされますか?
編集
@Crackのコメントに応えて。
したがって、パーティションがテーブルに配置されている場合でも、通常のクエリを使用します。クエリのデータベース側で、「プルーニング」はどこから入りますか?それでは、すべてのクエリに適用されるのはかなり複雑な保存Where
句ですか?個別にアクセスされない場合、パーティションに名前が付けられるのはなぜですか?
データベーステーブルがmysqlでパーティション化されている場合、個々のパーティションはどのようにアクセス/クエリされますか?
編集
@Crackのコメントに応えて。
したがって、パーティションがテーブルに配置されている場合でも、通常のクエリを使用します。クエリのデータベース側で、「プルーニング」はどこから入りますか?それでは、すべてのクエリに適用されるのはかなり複雑な保存Where
句ですか?個別にアクセスされない場合、パーティションに名前が付けられるのはなぜですか?
さて、これを一度に1つずつ取り上げましょう。
したがって、パーティションがテーブルに配置されている場合でも、通常のクエリを使用します。
はい。パーティショニングは透過的であり、物理的に分割することでクエリのパフォーマンスを最適化することを目的としています(よく使用されている場合)。データとインデックスを別々の「ビン」に保存します。
クエリのデータベース側で、「プルーニング」はどこから入りますか?それでは、すべてのクエリに適用される、かなり複雑な保存されたWhere句ですか?
はいといいえ。パーティショニングスキーマに応じて、MySQLはデータをばらばらの「ビン」に入れます。後でWHERE
クエリの句を読み取り、それに答えるためにチェックする必要のあるパーティションを認識します。MySQLのドキュメントには、ドキュメントにいくつかの良い例があります:パーティションプルーニング。
これにより、各パーティションを異なる物理ストレージデバイスに保存でき、MySQLはいくつかの操作を並行して実行することも、一部のパーティションをまったくスキャンしないこともできます(上記のリンクの例を参照)。
個別にアクセスされない場合、パーティションに名前が付けられるのはなぜですか?
それらは個別にアクセスされますが、この決定は行いません。オプティマイザーが行います。パーティション名を使用すると、パーティション名を簡単に管理できます。ドキュメント(パーティション管理)で可能な操作を見つけることができます。
MySQL 5.6.2以降、個々のパーティションからデータを選択できます。「パーティションの選択」を参照してください。アドバイスです。この構文を使用すると、クエリがデータのストレージ構造にバインドされるため、必要がない場合はこの構文を使用しないでください(また、本番環境で不安定なバージョンのMySQLを使用しないでください;)。
データのプルーニングは、主にデータを挿入するときに実際に機能します。
たとえばid
、整数列のハッシュでテーブルを分割し、ハッシュ関数が整数が奇数/偶数かどうかをチェックしていると仮定します。したがって、MySQLは事実上2つのビン(と)を作成odd bin
しeven 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回(今のところハッシュオーバーヘッドを割り引いてみましょう)。