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

推薦する

Dockerでプロジェクトを実行する方法

1. プロジェクトwarが保存されているディレクトリを入力しますDockerfileを編集する vi...

Linuxシステムはポート3306、8080などを外部に開放します。ファイアウォール設定の詳しい説明

多くの場合、Linux システムに Web サービス アプリケーション (Tomcat、Apache...

TortoiseSvn Little Turtle インストール 最新の詳細なグラフィックチュートリアル

tortoiseGit のインストール時にいつも問題があったので、単純に svn に変更しました。途...

CSS導入方法4つのまとめ(共有)

1. インライン参照:ラベルに直接使用されるが、メンテナンスコストが高い スタイル='フォ...

Linux CentOS でスクリプトを定期的に実行するように設定する方法

多くの場合、サーバーでスクリプトを定期的に実行して操作をトリガーする必要があります。たとえば、Qin...

Linux環境変数の設定に関する完全なガイド

Linux環境変数の設定ソフトウェアのインストールをカスタマイズする場合、多くの場合、環境変数を設定...

...

行の高さと垂直方向の配置についての深い理解

いくつかの概念行ボックス: インライン ボックスを囲むボックス。1 つ以上の行ボックスが積み重ねられ...

Vue/React シングルページ アプリケーションをリフレッシュなしで復元するソリューション

目次導入なぜわざわざ?落とし穴のあるコミュニティソリューション(Vue を例に挙げる)現時点では良い...

MySQL クエリのソートとクエリ集計関数の使用法の分析

この記事では、例を使用して、MySQL クエリのソート関数とクエリ集計関数の使用方法を説明します。ご...

MySQL binlog ログを開く方法

binlog は、すべての mysql dml 操作を記録するバイナリ ログ ファイルです。 bin...

Vueの使用に関する深い理解

目次Vueのコアコンセプトを理解するVueの双方向バインディングの原理と実装を探るVue 双方向バイ...

背景のグラデーションと自動フルスクリーンを実現するCSSコード

背景グラデーションと自動フルスクリーンに関する CSS の問題編集長は CSS の開発中に致命的な問...

VMWare Linux MySQL 5.7.13 のインストールと設定のチュートリアル

この記事では、参考までにVMWare LinuxにMySQL 5.7.13をインストールするチュート...