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

推薦する

ウェブ開発で遭遇した問題と経験

<br />以下は開発中に遭遇した問題と、そこから得た経験です。デバッグに時間がかかりま...

MySQLで最新のトランザクションIDを照会する方法

前に書いた内容: ビジネス ロジックの判断を行うために、最新のトランザクション ID を表示する必要...

MySQLストレージエンジンについて学びましょう

目次序文1. MySQL メインストレージエンジン: 2. さまざまなストレージエンジンがテーブルを...

一般的な HBase 運用および保守ツール 10 個の概要

概要: HBase には、ユーザーに管理、分析、修復、デバッグ機能を提供するための多くの操作および保...

Vscode が Ubuntu にリモート接続する際のエラー問題の解決方法

1. 事件の背景:仕事上、Ubuntu への vscode リモート接続を使用する必要があります。 ...

VMware での Ubuntu と Windows 間のファイル共有

この記事では、VMware 環境下で Ubuntu と Windows 間でファイルを共有する方法を...

JS でオブジェクトが空オブジェクトかどうかを判断する 5 つの方法

1. jsonオブジェクトをjson文字列に変換し、文字列が「{}」であるかどうかを判断します。 v...

MySQL のグループ分けの例

mysql のような php switch case ステートメント。 xxフィールドを選択、ケース...

docker compose の使い方の詳しい説明

目次Docker Compose の使用シナリオ基本的なデモ基本的な操作とメンテナンスdocker-...

Vue はアップロードした画像に透かしを追加できるようになりました (アップグレード版)

vueプロジェクトでは、アップロードした画像に透かしを追加して参照できるようにするアップグレード版...

Dockerコンテナを停止または強制終了できない問題の解決策

Docker バージョン 1.13.1問題プロセス特定の環境のMySQLコンテナを停止、強制終了、ま...

MySQL データをエクスポートする際の secure-file-priv 問題の解決方法

エラー 1290 (HY000) : MySQL サーバーは –secure-file-priv オ...

Webpack ファイル パッケージ化エラー例外

webpack をパッケージ化する前に、次の作業が完了していることを確認する必要があります。 1) ...

Html/Css (初心者が最初に読むべきガイド)

1. Web標準の意味を理解する - なぜWeb標準を採用するのか***** コンテンツとスタイル...

Dockerコンテナのセルフスタートを実装する方法

コンテナの自動起動Docker は、コンテナが終了したとき、または Docker が再起動されたとき...