MySQL のパーティショニングはデータ テーブルをラップすることによって実装されます。つまり、インデックスは実際にはテーブル全体ではなく各パーティションに基づいて定義されます。この機能は、インデックスとテーブルをより柔軟かつ複雑な方法でパーティション分割できる Oracle とは異なります。 MySQL パーティショニングでは、PATITION BY 句の条件を定義することによって、データ行が属するパーティションを決定します。クエリを実行する際、クエリ オプティマイザーはパーティションを区別します。つまり、クエリはすべてのパーティションをチェックするのではなく、要求されたデータを含むパーティションのみをチェックします。 パーティショニングの主な目的は、データ テーブルを大まかにインデックス付けしてクラスタ化することです。これにより、広範囲のデータ テーブルにアクセスし、関連するデータ行を近くに格納する必要性が軽減されます。パーティション分割の利点は、特に次のシナリオで顕著です。
MySQL パーティショニングの実装の詳細は非常に複雑で、理解するのが困難です。パフォーマンスにのみ焦点を当てる必要があります。さらに詳しく知りたい場合は、MySQL マニュアルのパーティショニングに関するセクションをお読みください。パーティショニングには、他にも次のような問題や制限があります。
パーティション分割メカニズム前述したように、パーティション テーブルには実際には複数の隠し物理ストレージ テーブルがあり、それらはハンドル オブジェクトを通じて表示されます。パーティションに直接アクセスすることはできません。通常、各パーティションはストレージ エンジンによって管理され (したがって、すべてのパーティションに同じストレージ エンジンが必要になります)、データ テーブル内のインデックスは、実際には非表示の物理ストレージ テーブルのインデックスです。ストレージ エンジンの観点から見ると、パーティションもデータ テーブルです。ストレージ エンジンは、データ テーブルが独立しているか、またはより大きなデータ テーブルのパーティションであるかを実際には認識しません。パーティション テーブルに対する操作は、次の論理操作を通じて実装されます。 SELECTクエリパーティション化されたテーブルをクエリする場合、パーティション レイヤーはすべての非表示パーティションを開いてロックし、クエリ オプティマイザーはどの非表示パーティションを無視できるかを決定し、パーティション レイヤーはハンドル API を通じてパーティションを管理するストレージ エンジンを呼び出してクエリ結果を取得します。 INSERT操作データ行が挿入されると、パーティション レイヤーはすべてのパーティションを開いてロックし、現在のデータ行が格納されているパーティションを決定して、対応するパーティションにデータ行を格納します。 削除操作データ行を削除する場合、パーティショニング レイヤーはすべてのパーティションを開いてロックし、どのパーティションにデータ行が含まれているかを確認し、そのパーティションに削除要求を送信します。 更新操作データ行を変更する場合、パーティショニング レイヤーはすべてのパーティションを開いてロックし、どのパーティションにデータ行が含まれているかを確認し、変更するデータ行を取得して、どのパーティションに新しいデータ行を含めるかを決定し、そのパーティションに挿入要求を送信し、古いパーティションに削除要求を送信します。 パーティション レイヤーはすべてのパーティションを開いてロックしますが、パーティションがロックされたままになるわけではありません。 InnoDB などのストレージ エンジンは行レベルのロックをサポートしており、パーティション レベルでのみパーティションのロックを解除します。ロックおよびロック解除のプロセスは、通常の InnoDB データ テーブルのロック プロセスと同様です。 パーティションの種類MySQL はいくつかのタイプのパーティショニングをサポートしています。最も一般的に使用されるタイプは範囲パーティショニングで、特定の列の異なる範囲の値または式によってパーティショニングします。たとえば、次のステートメントは、売上データを年ごとに異なるパーティションに分割します。 テーブルsalesを作成する( order_date DATETIME NULLではない --その他の列定義) ENGINE=InnoDB PARTITION BY RANGE(YEAR(order_date)) ( パーティション p_2018 値が (2018) より小さい、 パーティション p_2019 値が (2019) より小さい、 パーティション p_2020 の値が (2020) より小さい、 PARTITION p_other の値が MAXVALUE 未満です); パーティション句ではさまざまな関数を使用できます。主な要件は、非定数の決定論的な整数を返す必要があることです。上記の例では YEAR 関数が使用されていますが、TO_DAYS() などの他の関数も使用できます。日付ベースのデータの場合、パーティション分割に時間間隔を使用するのが一般的なアプローチです。 MySQL はキー、ハッシュ、リストのパーティショニング方法もサポートしており、一部の MySQL ではサブパーティショニングもサポートされています (実際にはほとんど使用されません)。 MySQL 5.5 以降では、日付を整数に変換する関数を使用せずに、RANGE COLUMNS パーティション タイプを使用して、日付ベースの列で直接パーティション分割できます。 その他の一般的なパーティション分割手法には次のものがあります。
上記は、MySQL の高度な機能であるデータ テーブル パーティションの概念とメカニズムの詳細な内容です。MySQL の高度な機能であるデータ テーブル パーティションの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
イメージをプルし、コンテナを作成してコンテナを実行するだけです。 docker run -d --r...
Linux サーバーで作業している場合、ネットワーク カード/イーサネット カードに静的 IP アド...
私は最近、会社で統計レポートの開発に関わるプロジェクトに取り組んでいました。データの量が比較的多かっ...
<テンプレート> <div class="アプリコンテナ"&...
Web アプリケーションが 1 台のマシンでのみ実行される場合、パフォーマンスを向上させるのは非常に...
目次sakilaをインストールするインデックススキャンソートテーブル構造インデックススキャンをソート...
Web には一般的な読み込みアイコンが 2 つあります。1 つは iOS の「菊」、もう 1 つは ...
この記事では、指定された日付間のカウントダウンを実装するためのVueの具体的なコードを例として紹介し...
目次fileReader に関する落とし穴iOS における FileReader の落とし穴 (イメ...
Unicode 署名 BOM - BOM とは何ですか? BOM は Byte Order Mark...
HTML 構造は次のとおりです。 CCS 構造は次のとおりです。 ページ効果図は次のとおりです。 こ...
序文アプリケーション シナリオ: おそらく、内部 Web サイトは外部ユーザーにアクセス可能である必...
最近、ネイティブ JS を使用して、さらにいくつかの小さな機能を実装したいと思っています。現在、ブロ...
効果効果図は以下のとおりです実装のアイデアDivは太陽の長方形の光と影を実現します前の疑似要素は、既...
目次1. プロジェクトの説明2. Nginxイメージの作成3. MySQLイメージの作成4. PHP...