データベーステーブルをパーティショニングすると挿入効率が向上しますか?

青灯夜游
リリース: 2020-07-22 11:52:12
オリジナル
3136 人が閲覧しました

データベース テーブルのパーティション化により、挿入効率が向上します。データベース テーブルのパーティション化により、テーブルの追加、削除、変更、およびクエリの効率が向上します。データベース テーブル パーティション挿入操作の原理: レコードを書き込むとき、パーティション レイヤーはすべての基礎となるテーブルを開いてロックし、次にどのパーティションがレコードを受け入れるかを決定し、対応する基礎となるテーブルにレコードを書き込みます。

データベーステーブルをパーティショニングすると挿入効率が向上しますか?

#パーティションとは何ですか?

パーティショニングとは、ルールに従ってテーブルを分解し、同じディスク上または異なるマシン上にある複数の保存場所にデータを分割することです。パーティション分割後も、表面上にはまだ 1 つのテーブルが存在しますが、データは複数の場所にハッシュされます。アプリが読み書きするときも、大きなテーブル名で動作し、データベースはパーティション化されたデータを自動的に整理します。

#パーティションは 2 つのタイプに分類できます:

1. 水平パーティション

##このフォームパーティショニングとは、テーブルの行をパーティショニングすることです。このようにして、異なるグループの物理列によって分離されたデータ セットを組み合わせて、個別のパーティショニング (単一パーティション) または集合的なパーティショニング (1 つ以上のパーティション) を実行できます。テーブルで定義されているすべての列は、すべてのデータ セットで見つけることができます。

そのため、テーブルの特性は維持されます。

簡単な例: 10 年間の請求書レコードを含むテーブルを 10 の異なるパーティションに分割し、各パーティションに 1 年間のレコードを含めることができます。 (注: ここで使用される具体的な分割方法については後ほど説明します。最初に言えることは、特定の属性列で分割する必要があるということです。たとえば、ここで使用される列は year です。)

#2. 垂直パーティショニング (垂直パーティショニング)

このパーティショニング方法は通常、テーブルを垂直に分割することでターゲット テーブルの幅を減らし、特定の列が特定のパーティションに分割され、各パーティションに列に対応する行。 簡単な例を見てみましょう: テーブルには大きなテキスト列と BLOB 列が含まれています。これらのテキスト列と BLOB 列は頻繁にアクセスされません。現時点では、これらの頻繁に使用されないテキスト列と BLOB 列は別のパーティションに分割する必要があります。データの相関性を確保しながらアクセス速度を向上させます。

#パーティション テーブルの原理

パーティション テーブルは、複数の関連する基礎となるテーブルによって実装されます。これらの基礎となるテーブルは、ハンドル オブジェクトによっても表されます。したがって、各パーティションに直接アクセスすることもできます。ストレージ エンジンは、通常のテーブルを管理するのと同じ方法で、パーティションの基礎となるテーブルを管理します (すべての基礎となるテーブルは同じストレージ エンジンを使用する必要があります)。パーティション テーブルのインデックスは、単にインデックスを追加するだけです。ストレージ エンジンの観点から見ると、基礎となるテーブルは通常のテーブルと何ら変わりはなく、ストレージ エンジンはそれが通常のテーブルであるか、パーティション テーブルの一部であるかを認識する必要はありません。 パーティション テーブルに対する操作は、次の操作ロジックに従って実行されます:

select query:

パーティション テーブルをクエリする場合、最初にパーティション レイヤーが開いてロックされます。 all 基礎となるテーブルであるオプティマイザーは、一部のパーティションをフィルターできるかどうかを判断し、対応するストレージ エンジン インターフェイスを呼び出して各パーティションのデータにアクセスします。

挿入操作:

レコードを書き込むとき、パーティション層 すべての基礎となるテーブルを開いてロックし、どのパーティションがこのレコードを受け入れるかを決定し、対応する基礎となるテーブルにレコードを書き込みます。

削除操作:

レコードが削除されると、パーティション レイヤー まず、基になるすべてのテーブルを開いてロックし、次にデータに対応するパーティションを特定し、最後に対応する基になるテーブルを削除します。

更新操作:

データの一部を更新する場合、パーティションはレイヤーが最初に開かれ、基礎となるすべてのテーブルをロックします。MySQL はまず、更新する必要のあるレコードが存在するパーティションを決定し、次にデータを取り出して更新し、次に更新されたデータを配置するパーティションを決定し、そこに書き込みます基礎となるテーブルを削除し、元のデータを更新します。そのテーブルが存在する基礎となるテーブルを削除します。

各操作では、すべての基礎となるテーブルを開いてロックしますが、これは、処理中にパーティション テーブルがテーブル全体をロックすることを意味するわけではありません。ストレージ エンジンが innodb などの行レベルのロックを実装できる場合、対応するテーブル ロックはパーティション レベルで解放されます。このロックおよびロック解除のプロセスは、通常の Innodb のクエリと似ています。

次のシナリオでは、パーティショニングが非常に重要な役割を果たす可能性があります:

A: テーブルが大きすぎてすべてを収めることができません。メモリ内のデータ、またはテーブルの最後の部分のみにデータがあり、残りは履歴データであるB: パーティション化されたテーブル データの方が保守が容易です。たとえば、メモリ内の大量のデータを削除する場合、バッチの場合は、パーティション全体をクリアする方法を使用できます。さらに、独立したパーティション上で最適化、チェック、修復などの操作を行うこともできます#C: パーティション テーブルのデータは異なる物理デバイスに分散できるため、複数のハードウェア デバイスを効率的に利用できます

D: パーティション テーブルを使用すると、innodb の単一インデックスへの相互排他的アクセス、ext3 ファイル システムでの i ノード ロックの競合などの特別なボトルネックを回避できます。

E: 必要に応じて、独立したパーティションのバックアップと復元もできるため、非常に大規模なデータ セットを使用するシナリオで非常にうまく機能します

F: クエリを最適化します。where 句にパーティション列が含まれている場合、クエリの効率を向上させるために必要なパーティションのみを使用できます。同時に、sum() や count( などの集計関数をクエリするときも同様です。 )、各パーティションを追加できます。パーティションは並行して処理され、最終的にはすべてのパーティションの結果のみを要約する必要があります。

mysql データベースのパーティションは、常に null を null 以外の値よりも小さい値として扱います。これは、null 値を処理するデータベースの order by 操作と同じです。昇順でソートする場合、null は次のようになります。したがって、パーティション タイプが異なると、mysql データベースは null を異なる方法で処理します。

レンジ パーティショニングの場合、パーティション列に null が挿入されると、MySQL データベースはその値を左端のパーティションに配置します。パーティションが削除されると、そのパーティションの下にあるすべてのコンテンツがディスクから削除されることに注意してください。 . 、null が配置されているパーティションが削除され、null 値も削除されます。

リスト パーティションで null を使用するには、パーティションのハッシュ値で明示的に定義する必要があります。そうしないと、null の挿入時にエラーが報告されます。ハッシュ パーティションとキー パーティションは、範囲パーティションやリスト パーティションとは異なる方法で null を処理します。どのパーティション関数も null を 0 として返します。データベースまたはその構成要素をさまざまな独立した部分に分割します

#これはテーブル ストレージを事前に編成する方法です#mysql は水平パーティショニングをサポートします

特定のテーブル行を行のサブセットとして分散します

#パーティションの分散は物理ストレージ全体です

#--必要に応じてユーザーが設定します仕様規則

——各パーティションは独自のユニットとして保存されます##データの分割

##データはサブセットに分割されます

##--パーティション タイプと式はテーブル定義の一部です

--式は整数または整数値を返す関数にすることができます。

——この値は、定義

1 に従って各レコードがどのパーティションに保存されるかを決定します。主キーと一意キーはパーティション キーに含まれている必要があり、それ以外の場合は主キーと一意キーが含まれている必要があります。一意のキーが作成されます。

##2 のインデックス作成時に「エラー 1503 (HY000)」が報告されます。レンジ パーティションにパーティションを追加する場合、最大値

## の後にのみパーティションを追加できます。 #3. すべてのパーティションのエンジンは同じである必要があります

4. 範囲パーティション化パーティション フィールド: 整数、数値式、日付列、日付関数式 (year()、to_days()、to_seconds() など) 、unix_timestamp())

パーティション管理

パーティションの追加

ALTER TABLE sale_data
ADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011));
ログイン後にコピー

削除パーティション

–パーティションを削除すると、パーティション内のすべてのデータも削除されます。

ALTER TABLE sale_data DROP PARTITION p201010;
ログイン後にコピー

パーティションのマージ次の SQL は、p201001 ~ p201009 を 3 つのパーティション p2010Q1 ~ p2010Q3

ALTER TABLE sale_data
REORGANIZE PARTITION p201001,p201002,p201003,
p201004,p201005,p201006,
p201007,p201008,p201009 INTO
(
PARTITION p2010Q1 VALUES LESS THAN (201004),
PARTITION p2010Q2 VALUES LESS THAN (201007),
PARTITION p2010Q3 VALUES LESS THAN (201010)
);
ログイン後にコピー

関連する推奨事項:PHP にマージします。チュートリアル》、《mysqlチュートリアル》

以上がデータベーステーブルをパーティショニングすると挿入効率が向上しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート