MySQL交換パーティションの詳細な例

MySQL交換パーティションの詳細な例

MySQL交換パーティションの詳細な例

序文

exchange パーティションを紹介する前に、まず mysql パーティションについて理解しましょう。

データベースのパーティション分割には、水平パーティション分割と垂直パーティション分割の 2 種類があります。 MySQL は現在垂直パーティショニングをサポートしていないため、以下では水平パーティショニングについて説明します。水平分割とは、テーブルを行ごとに分割することを意味します。たとえば、時間ごとにパーティションを分けたり、年ごとに 1 つのパーティションを分けたりします。

MySQL では、パーティションは交換可能であり、パーティション テーブルのパーティション内のデータは、通常のテーブル内のデータと交換できます。

スワップパーティションの実装

1. スワップパーティションの構文

テーブル pt を変更し、パーティション p をテーブル nt と交換します。

説明する:

パーティション テーブル pt のパーティション p と通常のテーブル nt のデータを交換します。

交換の前提条件:

  • 通常のテーブル nt は一時テーブルではなく、パーティション化されたテーブルでもありません。
  • テーブル構造はパーティション テーブル pt の構造と一致しています。
  • 通常のテーブル nt には外部キー参照がありません。
  • 一般テーブル nt が空でない場合。 MySQL 5.6 以前のバージョンでは、データはパーティション範囲内になければなりません。MySQL 5.7 以降では、データがパーティション範囲外であっても、パーティションに正常に保存されます。

2. 実験的なスワップパーティション

(1)パーティションテーブルを作成し、データを挿入する

# パーティションテーブルを作成する
テーブルeを作成(
  id INT NOT NULL、
  fname VARCHAR(30)、
  lname VARCHAR(30)
)
  範囲によるパーティション分割 (id) (
    パーティション p0 値が (50) 未満
    パーティション p1 値が (100) 未満
    パーティション p2 の値が (150) 未満である、
    パーティション p3 の値が (MAXVALUE) 未満です
);

# パーティションテーブルに複数のレコードを挿入します e INSERT INTO e VALUES
  (1669年、「ジム」、「スミス」)、
  (337、「メアリー」、「ジョーンズ」)、
  (16、「フランク」、「ホワイト」)
  (2005年、「リンダ」、「ブラック」)

(2)パーティションテーブルeと同じ構造の共通テーブルe2を作成する

# テーブルe2を作成する
mysql> e のようなテーブル e2 を作成します。

# テーブル e2 のパーティションを削除して通常のテーブルにします。mysql> alter table e2 remove partitioning;

(3)テーブルeの各パーティションに何行あるか確認する

mysql> PARTITION_NAME、TABLE_ROWSを選択
  -> INFORMATION_SCHEMA.PARTITIONS から
  -> WHERE TABLE_NAME = 'e';
+----------------+------------+
| パーティション名 | テーブル行 |
+----------------+------------+
| p0 | 1 |
| p1 | 0 |
| p2 | 0 |
| p3 | 3 |
+----------------+------------+
セット内の 4 行 (0.00 秒)

(4)テーブルeのパーティションp0を通常のテーブルe2と交換する

mysql> テーブル e を変更し、パーティション p0 をテーブル e2 と交換します。

(5)結果を見る

# テーブル e のパーティション P0 のデータは消えましたmysql> SELECT PARTITION_NAME, TABLE_ROWS
  -> INFORMATION_SCHEMA.PARTITIONS から
  -> WHERE TABLE_NAME = 'e';
+----------------+------------+
| パーティション名 | テーブル行 |
+----------------+------------+
| p0 | 0 |
| p1 | 0 |
| p2 | 0 |
| p3 | 3 |
+----------------+------------+
セット内の 4 行 (0.00 秒)

# テーブル e2 には、テーブル emysql のパーティション p0 からのレコードがあります。> SELECT * FROM e2;
+----+-------+-------+
| id | fname | lname |
+----+-------+-------+
| 16 | フランク | ホワイト |
+----+-------+-------+
セット内の 1 行 (0.00 秒)

テーブル e のパーティション p0 のデータがテーブル e2 に移動されていることがわかります。

上記の例では、パーティションを通常の空のテーブルと交換します。これは、パーティションのデータを移動するのと同じです。これは通常、データのアーカイブで使用されます。

同様に、交換パーティションはパーティションと空でない通常のテーブル間で交換することもでき、通常のテーブル内のデータは指定されたパーティションに移動され、指定されたパーティション内のデータは通常のテーブルに移動されます。次のようにします。

(6)パーティションテーブルeのp0に別のデータを追加する

# パーティション p0 のレコードをテーブル e に追加します。mysql> INSERT INTO e VALUES (41, "Michael", "Green");      
クエリは正常、1 行が影響を受けました (0.05 秒)               

# 挿入されたデータがパーティションp0に実際に保存されていることを確認します
mysql> PARTITION_NAME、TABLE_ROWS を選択
  -> INFORMATION_SCHEMA.PARTITIONS から
  -> WHERE TABLE_NAME = 'e';      
+----------------+------------+       
| パーティション名 | テーブル行 |       
+----------------+------------+       
| p0 | 1 |       
| p1 | 0 |       
| p2 | 0 |       
| p3 | 3 |       
+----------------+------------+       
セット内の 4 行 (0.00 秒)

(7)スワップパーティションを実行する

​mysql> テーブル e を変更し、パーティション p0 をテーブル e2 と交換します。
クエリは正常、影響を受けた行は 0 行 (0.28 秒)

(8)結果を見る

# 以前は、テーブル e の p0 がテーブル e2 のデータの一部と交換されていましたが、現在はテーブル e に戻っています。
mysql> SELECT * FROM e;
+------+-------+-------+
| id | fname | lname |
+------+-------+-------+
| 16 | フランク | ホワイト |   
| 1669 | ジム | スミス |
| 337 | メアリー | ジョーンズ |
| 2005 | リンダ | ブラック |
+------+-------+-------+
セット内の 4 行 (0.00 秒)

mysql> e2 から * を選択;
+----+---------+-------+
| id | fname | lname |
+----+---------+-------+
| 41 | マイケル | グリーン |
+----+---------+-------+
セット内の 1 行 (0.00 秒)

このことから、テーブル e の p0 とテーブル e2 のデータが入れ替わっていることがわかります。このシナリオは、共通テーブルからパーティション テーブル内のパーティションにデータを移動する場合に使用できます

ただし、注意すべき点が 1 つあります。

共通テーブルのデータが交換するパーティションの範囲内にない場合、パーティションを交換するための上記の構文は正常に実行できません。操作方法は下記をご参照ください。

(9)テーブルeのp0範囲を超えるデータを通常のテーブルe2に挿入し、上記の交換文を実行する。

mysql> INSERT INTO e2 VALUES (51, "Ellen", "McDonald");
クエリは正常、1 行が影響を受けました (0.08 秒)

mysql> テーブル e を変更し、パーティション p0 をテーブル e2 と交換します。
エラー 1707 (HY000): パーティションと一致しない行が見つかりました

MySQL 5.6 ではこの問題を解決できませんが、MySQL 5.7.5 では上記のエラーを解決するために WITHOUT VALIDATION オプションが追加されました。操作は以下のとおりです。

mysql> ALTER TABLE e を VALIDATION なしで TABLE e2 と交換する PARTITION p0;
クエリは正常、影響を受けた行は 0 行 (0.02 秒)

結果を表示:

# ID 51 のデータはテーブル e の p0 にも保存されます。mysql> select * from e partition(p0);
+------+---------+----------+
| id | fname | lname |
+------+---------+----------+
| 41 | マイケル | グリーン |
| 51 | エレン | マクドナルド | 
+------+---------+----------+

mysql> e2 から * を選択;
+----+---------+-------+
| id | fname | lname |
+----+---------+-------+
| 16 | フランク | ホワイト |
+----+---------+-------+
セット内の 1 行 (0.00 秒)

要約する

上記の実際の操作を通じて、MySQL 交換パーティション機能には 2 つの適用可能なシナリオがあることがわかりました。

パーティション テーブルのパーティションを空の通常テーブルと交換して、パーティション テーブルのパーティションのデータを移動します。
パーティション テーブルのパーティションを空でない通常のテーブルと交換して、通常のテーブルのデータをパーティション テーブルの指定されたパーティションに移動します。

読んでいただきありがとうございます。お役に立てれば幸いです。このサイトをサポートしていただきありがとうございます。

以下もご興味があるかもしれません:
  • LinuxにインストールしたばかりのMySQLのパスワードを変更する簡単な方法
  • CentOS 6.6 ソースコードのコンパイルと MySQL 5.7.18 のインストールチュートリアルの詳細な説明
  • MySql エラー 1698 (28000) の解決策
  • CentOS 7 で MySQL 接続数が 214 に制限される問題の解決方法
  • MySQL の厄介な Aborted 警告をケーススタディで分析する
  • MySQLのINサブクエリによってインデックスが使用できなくなる問題を解決する

<<:  Vmwareでディスクを追加する方法:ディスクを拡張する

>>:  Vue の一般的な問題と解決策の概要 (推奨)

推薦する

Ubuntuで顔認識ログインを実装するための完全な手順

1. Howdyをインストール: howdyプロジェクトアドレス sudo add-apt-repo...

MySQLのユーザーアカウント管理と権限管理の詳細な説明

序文MySQL の権限テーブルは、データベースの起動時にメモリにロードされます。ユーザーが ID 認...

JS デコレータ パターンと TypeScript デコレータ

目次デコレータパターンの紹介TypeScript のデコレータデコレータの使用デコレーターファクトリ...

Hadoop 2.Xの新機能、ごみ箱機能の説明

ごみ箱機能をオンにすると、削除されたファイルの元のデータをタイムアウトなしで復元できるため、誤って削...

WeChatアプレットにナンバープレート入力機能を実装

目次序文背景大きな推測パターンを見つける構造とスタイルコンポーネントの実装パラメータキーボードの種類...

スプレッド演算子のサンプルコードと JavaScript での応用

スプレッド演算子を使用すると、式をある時点で展開できます。スプレッド演算子は、複数のパラメーター (...

Linux manコマンドの具体的な使い方

01. コマンドの概要Linux には充実したヘルプ マニュアルが用意されています。コマンドのパラメ...

PythonはデータベースMySQLの解凍バージョンのインストール構成に接続し、問題が発生しました

導入今日は Python でデータベースに接続する方法を学んだので、MySQL データベースをインス...

Linux で JDK をインストールして環境変数を設定する方法 (この記事で十分です)

目次1. Linuxのビット数を確認する2. JDKをダウンロードする3. JDKをインストールする...

vue+canvasでタイムラインを描く方法

この記事では、参考までにvueキャンバスのタイムライン描画の具体的なコードを紹介します。具体的な内容...

Linux にバイナリ MySQL をインストールして MySQL パスワードをクラックする方法

1. システムに必要な libaio ソフトウェアがインストールされていることを確認します。インスト...

HTML のオートコンプリートを無効にして履歴を表示しないようにする

入力ボックスには、コンテンツを入力するときに常に入力履歴が表示されます。これを無効にする現在の方法は...

Ubuntu ターミナル マルチウィンドウ 分割画面 ターミネーター

1. インストールターミネーターの最大の特徴は、1つのウィンドウで複数のターミナルを開くことができる...

Linux 環境の Apache サーバーでセカンダリドメイン名を設定する方法の詳細な説明

この記事では、Linux 環境の Apache サーバーでセカンダリ ドメイン名を構成する方法につい...

Linux で MySQL 8.0 バージョンをアンインストールする方法

1. MySQLをシャットダウンする [root@localhost /]# サービスmysqldを...