テーブルパーティションとパーティション分割とは何ですか?MySqlデータベースパーティションとテーブルパーティション分割方法

テーブルパーティションとパーティション分割とは何ですか?MySqlデータベースパーティションとテーブルパーティション分割方法

1. テーブルとパーティションを分割する必要があるのはなぜですか?

日常の開発では、大きなテーブルに遭遇することがよくあります。いわゆる大きなテーブルとは、数百万、数千万のレコードを格納するテーブルを指します。このようなテーブルは大きすぎるため、データベースのクエリと挿入に時間がかかり、パフォーマンスが低下します。結合クエリが関係する場合、パフォーマンスはさらに悪くなります。テーブル シャーディングとテーブル パーティショニングの目的は、データベースの負荷を軽減し、データベースの効率を向上させることです。一般的に言えば、テーブルの追加、削除、変更、チェックの効率を向上させることです。

2. テーブル シャーディングとパーティショニングとは何ですか?

2.1 サブテーブル

テーブル シャーディングとは、特定のルールに従って、大きなテーブルを独立したストレージ スペースを持つ複数のエンティティ テーブルに分解することです。これらはサブテーブルと呼ぶことができます。各テーブルは、MYD データ ファイル、.MYI インデックス ファイル、および .frm テーブル構造ファイルの 3 つのファイルに対応します。これらのサブテーブルは、同じディスクまたは異なるマシンに分散できます。アプリは読み取りおよび書き込み時に、事前に定義されたルールに従って対応するサブテーブル名を取得し、それを操作します。

2.2 パーティション分割

パーティショニングはテーブル シャーディングに似ており、どちらもルールに従ってテーブルを分解します。違いは、テーブル シャーディングでは大きなテーブルを複数の独立した物理テーブルに分割するのに対し、パーティショニングではデータをセグメントに分割して複数の場所 (同じディスクまたは異なるマシン) に保存することです。パーティション分割後も表面上はテーブルのままですが、データは複数の場所にハッシュされます。アプリが読み取りおよび書き込みを行う場合、大きなテーブル名に対して操作が行われ、DB はパーティション化されたデータを自動的に整理します。
パーティショニングの主な目的は、特定の SQL 操作で読み書きされるデータの総量を減らして、応答時間を短縮することです。

2.3 MySQL テーブルのシャーディングとパーティショニングの関係は何ですか?

1) どちらも MySQL のパフォーマンスを向上させ、高同時実行条件下でも優れたパフォーマンスを発揮します。
2) テーブル シャーディングとパーティショニングは矛盾するものではなく、相互に連携できます。トラフィックが多くテーブル データが多いテーブルの場合は、テーブル シャーディングとパーティショニングを組み合わせることができます。トラフィックは少ないがテーブル データが多いテーブルの場合は、パーティショニングを採用できます。
3) テーブル パーティション テクノロジはより面倒です。サブ テーブルを手動で作成する必要があり、アプリケーション サーバーは読み取りおよび書き込み時にサブ テーブル名を計算する必要があります。マージを使用する方が適切ですが、サブテーブルを作成し、サブテーブル間の結合関係を構成する必要もあります。
4) テーブル シャーディングと比較すると、テーブル パーティショニングは操作が簡単で、サブテーブルの作成も必要ありません。

3. テーブルを分割するいくつかの方法

3.1 MySQL クラスタ

サブテーブルではありませんが、サブテーブルと同じ役割を果たします。クラスターはデータベース操作の数を共有し、タスクを複数のデータベースに分散できます。クラスターは読み取りと書き込みを分離して、読み取りと書き込みの負荷を軽減できます。これにより、データベースのパフォーマンスが向上します。

3.2 カスタムルールテーブル

大きなテーブルは、ビジネス ルールに従って複数のサブテーブルに分解できます。通常は以下の種類がありますが、独自のルールを定義することもできます。

範囲 –このモードでは、データをさまざまな範囲に分割できます。たとえば、テーブルを年ごとに複数のパーティションに分割できます。
ハッシュ –このモードでは、テーブルの 1 つ以上の列のハッシュ キーを計算し、ハッシュ コードの異なる値によってデータ領域をパーティション分割できます。たとえば、主キーによってパーティション分割されたテーブルを作成できます。
キー –上記のハッシュ モードの拡張です。ここでのハッシュ キーは MySQL システムによって生成されます。
リスト –このモードでは、システムは事前定義された値のリストによってデータをパーティション分割できます。
複合上記のモードの組み合わせ

テーブル分割ルールはパーティション分割ルールと同じであり、パーティション分割モジュールで詳細に説明されています。

以下では、Range を使用してテーブルを(年ごとに)分割する方法を簡単に紹介します。

テーブル構造に、自動増分 ID、名前、入金額、入金額の 4 つのフィールドがあるとします。入金額をルールとして使用してテーブルを分割し、複数のテーブルを個別に作成します。
2011: アカウント_2011
2012: アカウント_2012

2015: アカウント_2015
読み取りおよび書き込み時に、アプリは日付に基づいて対応するテーブル名を検索しますが、日付は手動で決定する必要があります。

var getTableName = 関数() {
  varデータ = {
    名前: 'トム',
    お金: 2800.00,
    日付: '201410013059'
  };
  var テーブル名 = 'account_';
  var year = parseInt(data.date.substring(0, 4));
  (年 < 2012) {
    テーブル名 += 2011; // account_2011
  } そうでない場合 (年 < 2013) {
    テーブル名 += 2012; // account_2012
  } そうでない場合 (年 < 2014) {
    テーブル名 += 2013; // account_2013
  } そうでない場合 (年 < 2015) {
    テーブル名 += 2014; // account_2014
  } それ以外 {
    テーブル名 += 2015; // account_2015
  }
  テーブル名を返します。
}

3.3 マージストレージエンジンを使用してテーブルシャーディングを実装する

マージ テーブルは、メイン テーブルとサブ テーブルに分かれています。メイン テーブルは、サブ テーブルを論理的にカプセル化するシェルのようなものです。実際、すべてのデータはサブ テーブルに格納されます。

メインテーブルを通じてデータを挿入したりクエリを実行したりできます。サブテーブルのルールがわかっていれば、サブテーブルを直接操作することもできます。

サブテーブル 2011

テーブル「account_2011」を作成します(
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(50) 文字セット utf8 COLLATE utf8_general_ci NULL デフォルト NULL ,
`money` float NOT NULL ,
`tradeDate` 日時 NOT NULL
主キー (`id`)
)
エンジン=MyISAM
デフォルト文字セット=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=2
チェックサム=0
ROW_FORMAT=動的
遅延キー書き込み=0
;

サブテーブル 2012

テーブル「account_2012」を作成します(
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(50) 文字セット utf8 COLLATE utf8_general_ci NULL デフォルト NULL ,
`money` float NOT NULL ,
`tradeDate` 日時 NOT NULL
主キー (`id`)
)
エンジン=MyISAM
デフォルト文字セット=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=2
チェックサム=0
ROW_FORMAT=動的
遅延キー書き込み=0
;

メインテーブル、全年

テーブル `account_all` を作成します (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(50) 文字セット utf8 COLLATE utf8_general_ci NULL デフォルト NULL ,
`money` float NOT NULL ,
`tradeDate` 日時 NOT NULL
主キー (`id`)
)
エンジン=MRG_MYISAM
デフォルト文字セット=utf8 COLLATE=utf8_general_ci
UNION = (`account_2011`,`account_2012`)
INSERT_METHOD=LAST
ROW_FORMAT=動的
;

メイン テーブルを作成するときに、挿入方法を指定する INSERT_METHOD があります。値は次のとおりです: 0: 挿入を許可しない、FIRST: UNION の最初のテーブルに挿入する、LAST: UNION の最後のテーブルに挿入する。

メイン テーブルをクエリする場合、すべてのサブ テーブルをまとめてクエリすることと同じです。これはサブテーブルの利点を反映していません。サブテーブルをクエリすることをお勧めします。

4. 分割のいくつかの方法

4.1 範囲

テーブル範囲を作成( 
  id int(11)、 
  お金 int(11) unsigned not null、 
  日付 日時 
  )範囲(年(日付))でパーティション分割( 
  パーティションp2007の値は(2008)より小さい、 
  パーティションp2008の値は(2009)より小さい、 
  パーティションp2009の値が(2010)より小さい 
  パーティションp2010の値がmaxvalueより小さい 
);

4.2 リスト

テーブルリストを作成( 
  整数(11)、 
  b 整数(11) 
  )(リストによる分割(b) 
  パーティションp0の値を(1,3,5,7,9)に分割し、 
  パーティションp1の値は(2,4,6,8,0) 
 );

4.3 ハッシュ

テーブルハッシュを作成する( 
  整数(11)、 
  b 日時 
  )ハッシュによるパーティション(YEAR(b) 
  パーティション4;

4.4 キー

テーブルt_keyを作成します( 
  整数(11)、 
  b 日時) 
  キーによるパーティション(b) 
  パーティション4;

4.5 パーティション管理

4.5.1 新しいパーティションの追加

テーブルsale_dataを変更する
パーティションを追加します (パーティション p201010 の値は (201011) より小さい)。

4.5.2 パーティションの削除

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

テーブル sale_data を変更し、パーティション p201010 を削除します。

4.5.3 パーティションの結合

次のSQLはp201001 - p201009を3つのパーティションp2010Q1 - p2010Q3にマージします。

テーブルsale_dataを変更する
パーティション p201001、p201002、p201003 を再編成します。
p201004、p201005、p201006、
p201007、p201008、p201009 に
(
パーティション p2010Q1 の値は (201004) より小さいです。
パーティション p2010Q2 の値は (201007) より小さいです。
パーティション p2010Q3 の値が (201010) より小さい
);

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL データベースの最適化: テーブルとデータベースのシャーディング操作の詳細な説明
  • MySQLデータベースとテーブルシャーディングの概要
  • MySQL テーブルとデータベース シャーディングのアプリケーション シナリオと設計方法
  • MySQL データベース テーブルとデータベース パーティショニング戦略
  • MyBatis は、Mysql データベースのサブライブラリとサブテーブルの操作と概要を実装します (推奨)
  • MYSQL データベースのデータ分割の概要: サブライブラリとサブテーブル
  • MySQL データベースのパーティション分割とテーブル パーティション分割の方法 (一般的に使用される)
  • MYSQL パフォーマンス最適化共有 (データベースとテーブルのシャーディング)
  • MySQLテーブルシャーディングとパーティショニングの具体的な実装方法
  • MySQL のテーブル シャーディングとパーティショニングの違いを簡単に分析します
  • MySql テーブル、データベース、シャーディング、パーティショニングの知識ポイントの紹介

<<:  js で継承を実装する 5 つの方法

>>:  Windows Server 2008 R2 リモート デスクトップのポート 3389 を変更する方法

推薦する

React+TypeScriptプロジェクト構築事例解説

React プロジェクトの構築は非常に簡単ですが、Typescript と組み合わせると、実際にはそ...

JavaScriptのプリミティブ値とラッパーオブジェクトの詳細な紹介

目次序文文章プリミティブ型プリミティブ値ラッパーオブジェクト物体コンストラクタ通常機能(関数)プリミ...

Mysql のいくつかの複雑な SQL ステートメント (重複行のクエリと削除)

1. 重複行を見つける blog_user_relation a から * を選択 WHERE (...

MySQL でファイルデータをインポートする際の 1290 エラーの解決方法

エラーシナリオcmd の mysql コマンドを使用して、学生情報テーブルにデータを追加します。デー...

springcloud alibaba nacos linux 設定の詳細なチュートリアル

まず、github から nacos の圧縮パッケージをダウンロードします: https://git...

フィルターを使用して画像に透明な CSS を書く方法

フィルターを使用して画像に透明な CSS を書く方法コードをコピーコードは次のとおりです。 html...

Apache、Tomcat、Nginx サーバーの詳細な理解と比較分析

質問1件会社のサーバーはApacheを使用しており、バックエンドはPHP、サーバーはLinux C/...

html リンク タグ タイトル属性 改行 マウス ホバー プロンプト コンテンツ 改行効果

オブジェクト上にマウスを移動したときにコンテンツ(タイトル属性の内容)を折り返す方法、HTML タイ...

Nginx の一般的な設定とテクニックの概要

序文この記事では、Nginx の一般的な、実用的で興味深い構成をいくつか紹介します。この記事を読んだ...

HTMLフォーム属性のreadonlyとdisabledの使い方

1. readonly 読み取り専用属性なので、値を取得できます2. 無効: 無効な属性、値を取得で...

JS を使用してファイルを操作する (FileReader は --node の fs を読み取ります)

目次JS はファイルを読み取る FileReader書類イベントとメソッド基本的な使い方イベント処理...

HTML フォーム_PowerNode Java アカデミー

1. フォーム1. フォームの役割HTML フォームは、さまざまな種類のユーザー入力を受け取り、ユー...

ウェブフォームデザインのための5つの実用的なヒント

1. フォームテキスト入力のモバイル選択: テキスト入力フィールドにプロンプ​​トが追加されている場...

MySQL 8.0.23 メジャーアップデート (新機能)

著者: Guan Changlong は、Aikesheng の配送サービス部門の DBA です。主...

Vue3における7種類のコンポーネント通信の詳細

目次1. Vue3コンポーネント通信方式2. Vue3通信の使い方2.1 小道具2.2 $エミット2...