テーブルパーティションとパーティション分割とは何ですか?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 を変更する方法

推薦する

プロフェッショナルなMySQL開発設計仕様とSQL記述仕様

チーム開発のプロセスでは、プロジェクトの安定性、コードの効率性、管理の利便性のために、内部開発および...

共有サイドバーを実装するためのネイティブJS

この記事では、ネイティブ JS で実装された共有サイドバーを紹介します。効果は次のとおりです。 以下...

HTML(divレイヤー)を介してFLASHにリンクを追加するための実装コード

今日、クライアントが広告を掲載したいのですが、提供された素材は Flash です。私たちはあまり気に...

Centos7 ベースの Varnish キャッシュ プロキシ サーバーを展開する

1. ワニスの概要1. ワニスの紹介Varnish は、新しいソフトウェア アーキテクチャを使用し、...

Ansible を使用した Nginx のバッチ デプロイのサンプル コード

1.1 nginxインストールパッケージとインストールスクリプトをクライアントにコピーし、スクリプト...

Docker パッケージング ノード プロジェクトのプロセスの説明

バックエンド プログラマーとして、フロントエンドのものをいじらなければならないこともあります。そこで...

VMwareを使用したPermeateレンジシステムのインストール手順の詳細説明

1. 背景私たちは時々社内研修を行っており、実験環境をよく利用しています。最初はdockerコンテナ...

JS ES の新機能、変数分離割り当て

目次1. 配列の分離割り当て1.1 配列分離割り当てとは何ですか? 1.2 配列分離割り当てに失敗し...

Linux システムでキャッシュをクリアする方法の概要

1) キャッシュメカニズムの紹介Linux システムでは、ファイルシステムのパフォーマンスを向上させ...

React antdはフォームの動的な増減を実現します

以前、動的フォームを記述しているときに落とし穴に遭遇しました。インデックスの添え字をキーとして使用す...

Web でよく使われるフォントの紹介 (iOS および Android ブラウザでサポートされているフォント)

年末なので仕事も少なくなっています。私が何もせずにいるのを見ると、上司はきっと不快に思うでしょう。そ...

MySQL で行を列に変換したり、列を行に変換したりする詳細な例

mysql 行から列へ、列から行へ難しい文章ではないので、詳しく説明はしません。文章を読むときは、一...

CentOS 8.4 に Docker をインストールする詳細なチュートリアル

目次序文:システム要件:インストール環境:古いバージョンをアンインストールします: yum は具体的...

Docker+K8S クラスタ環境構築と分散アプリケーション展開

1. Dockerをインストールする yumでdockerをインストール #サービスを開始する sy...

Docker コンテナのデプロイの試み - マルチコンテナ通信 (node+mongoDB+nginx)

その理由はモッカー プラットフォームを導入したかったので、友人の勧めで既成のプロジェクト api-m...