MySQL でパーティション分割後にクエリを実装するために MRG_MyISAM (MERGE) を使用する例

MySQL でパーティション分割後にクエリを実装するために MRG_MyISAM (MERGE) を使用する例

大量のデータベース データを最適化することは非常に高度な科学であり、開発者が習得する必要がある専門的なスキルでもあります。

MySQL のテーブル パーティショニングは、垂直パーティショニングと水平パーティショニングに分けられます。どちらのパーティショニング形式も比較的簡単です。簡単に言えば、垂直パーティショニングとは、テーブル内のレコード数は多くないが、フィールドが非常に長く、テーブルが大きなスペースを占め、テーブルを取得するときに大量の IO を実行する必要があり、パフォーマンスが大幅に低下することを意味します。このとき、大きなフィールドを別のテーブルに分割する必要があり、このテーブルは元のテーブルと 1 対 1 の関係を持ちます。水平テーブル パーティショニングとは、同じデータベース内で特定のルールに従って、同じテーブルのデータを複数のテーブルに分割することです。その目的は、1 つのテーブルに大量のデータが存在することによるパフォーマンスの問題を最適化し、IO 競合を回避し、テーブルがロックされる可能性を減らすことです。

テーブル シャーディングを実装するのは簡単ですが、複雑なのはシャーディング後にデータをどのようにクエリするかということです。今日の実装では、MysqlテーブルエンジンMRG_MyISAM(MERGE)を使用します。
MERGE ストレージ エンジン (MRG_MyISAM エンジンとも呼ばれます) は、1 つのテーブルとして使用できる同一の MyISAM テーブルのコレクションです。 「同じ」とは、すべてのテーブルで同じ列とインデックス情報を意味します。列が異なる順序でリストされているテーブル、まったく同じ列を持たないテーブル、またはインデックスが異なる順序でリストされているテーブルをマージすることはできません。さらに、myisampack を使用して、任意またはすべてのテーブルを圧縮できます。 AVG_ROW_LENGTH、MAX_ROWS、PACK_KEYS などのテーブル オプションの違いは重要ではありません。

MERGE テーブルを作成すると、MySQL はディスク上に 2 つのファイルを作成します。ファイル名はテーブル名で始まり、ファイルの種類を示す拡張子が付きます。 .frm ファイルにはテーブル定義が保存され、.MRG ファイルには使用するテーブルの名前が含まれます。これらのテーブルは、MERGE テーブル自体と同じデータベースに存在する必要はありません。

テーブルのコレクションに対して SELECT、DELETE、UPDATE、および INSERT を使用できます。 MERGE テーブルにマップするテーブルに対して、SELECT、UPDATE、および DELETE 権限が必要です。

MERGE テーブルを DROP すると、MERGE 仕様のみが削除されます。基になるテーブルは影響を受けません。

MERGE テーブルを作成するときは、UNION=(list-of-tables) 句を指定して、1 つのテーブルとして使用するテーブルを指定する必要があります。 MERGE テーブルへの挿入を UNION リストの最初のテーブルまたは最後のテーブルで実行する場合は、必要に応じて INSERT_METHOD オプションを指定できます。挿入をそれぞれ最初のテーブルまたは最後のテーブルに実行するには、FIRST または LAST 値を使用します。 INSERT_METHOD オプションを指定しない場合、またはこのオプションを NO の値で指定した場合。 MERGE テーブルにレコードを挿入しようとするとエラーが発生します。

例えば:
2 つのサブテーブルを作成します。

テーブル `yzm_table1` を作成します (
  `id` int(10) 符号なし NOT NULL,
  `title` varchar(100) NOT NULL デフォルト ''
  `content` varchar(255) NOT NULL DEFAULT ''
  主キー (`id`)
)ENGINE=MyISAM デフォルト文字セット=utf8;

テーブル `yzm_table2` を作成します (
  `id` int(10) 符号なし NOT NULL,
  `title` varchar(100) NOT NULL デフォルト ''
  `content` varchar(255) NOT NULL DEFAULT ''
  主キー (`id`)
)ENGINE=MyISAM デフォルト文字セット=utf8;

テーブルが作成されました。ここでの ID は自動増分に設定できないことに注意してください。また、構造、タイプ、長さ、フィールドの順序など、すべてのテーブル構造が一貫している必要があります。では、この ID はどうやって取得するのでしょうか。これについては後で詳しく説明します。ここで、クエリを実行するために結合されたテーブルが必要です。結合されたテーブルを作成するコードは次のとおりです。

テーブル `yzm_table` を作成します (
  `id` int(10) 符号なし NOT NULL AUTO_INCREMENT,
  `title` varchar(100) NOT NULL デフォルト ''
  `content` varchar(255) NOT NULL DEFAULT ''
  主キー (`id`)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 INSERT_METHOD=NO INSERT_METHOD=LAST UNION=(`yzm_table1`,`yzm_table2`);

マージされたテーブルは、前のテーブルと同じ構造、タイプ、長さ、フィールドの順序を持​​つ必要があります。ここで INSERT_METHOD=NO は、このテーブルでは挿入操作が許可されないことを意味します。クエリを実行する必要がある場合、yzm_table テーブルに対してのみ操作できます。つまり、このテーブルでは選択操作のみを実行できます。

データテストを挿入します:

`yzm_table1` に値 ('1'、'table1-1'、'content1-1') を挿入します。
`yzm_table1` に値 ('2'、'table1-2'、'content1-2') を挿入します。
`yzm_table2` に値 ('3'、'table2-1'、'content2-1') を挿入します。
`yzm_table2` に値 ('4'、'table2-2'、'content2-2') を挿入します。
`yzm_table2` に値 ('5'、'table2-3'、'content2-3') を挿入します。

次に、マージされたテーブル(メインテーブル)をクエリします。

`yzm_table` から * を選択し、制限を 10 にします。

確かに、関連するすべてのサブテーブルのすべてのデータをクエリできるため、ページング、統計などによってすべてのデータをクエリできます。

上記は、MRG_MyISAM (MERGE) を使用して MySQL でシャーディング後のクエリを実装する例の詳細です。MySQL でのシャーディング後のクエリの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySql テーブル、データベース、シャーディング、パーティショニングの知識ポイントの紹介
  • MySQL データベースの最適化: テーブルとデータベースのシャーディング操作の詳細な説明
  • MySQLテーブルシャーディングとパーティショニングの具体的な実装方法
  • MySQLデータベースとテーブルシャーディングの概要
  • MySQLの水平および垂直テーブルパーティションの説明
  • MySQL テーブルとデータベース シャーディングのアプリケーション シナリオと設計方法
  • MySQL データベース テーブルとデータベース パーティショニング戦略
  • MySQL 5.7 における部分テーブルのデュアルマスター同期の実装プロセスの詳細な説明
  • MyBatis は、Mysql データベースのサブライブラリとサブテーブルの操作と概要を実装します (推奨)
  • テーブルパーティションとパーティション分割とは何ですか?MySqlデータベースパーティションとテーブルパーティション分割方法
  • MYSQL データベースのデータ分割の概要: サブライブラリとサブテーブル
  • MySQLテーブルにおける自己増分IDの問題の解決

<<:  HTML ウェブページ作成のための 8 つの強力なテクニック

>>:  Docker コンテナで DockerFile を使用して複数の Tomcat サービスをデプロイする手順

推薦する

JavaScriptは両端キューを実装する

この記事の例では、両端キューを実装するためのJavaScriptの具体的なコードを参考までに共有して...

Linux システムにおける時間設定の概要

1. 時間の種類は次のように分けられます。 1. ネットワーク時間(タイムゾーンの設定、ntpサーバ...

Linux ソースコードからのソケット (TCP) バインドの詳細な説明

目次1. 最も単純なサーバー側の例2. バインドシステムコール2.1、inet_bind 2.2、i...

Webデザインチュートリアル(6):デザインへの情熱を持ち続ける

<br />前の記事:Webデザインチュートリアル(5):Webビジュアルデザイン。 1...

MySQL 5.7.21 winx64 無料インストールバージョン設定方法グラフィックチュートリアル

MySQL 5.7.21 winx64無料インストールバージョンの設定方法、参考までに、具体的な内容...

mysql 5.7.5 m15 winx64.zip インストール チュートリアル

win7 64 ビットで mysql-5.7.5-m15-winx64 をインストールして構成する方...

SQL ファジー クエリ レポート: ORA-00909: パラメータの数が無効です。解決策

あいまいクエリにOracleデータベースを使用する場合、コンソール エラーは次の図に表示されます。理...

CSS中級者向けアダプティブレイアウトの5つのソリューションの詳細な説明

序文ページを作っていく上で、ページレイアウトに関する内容に遭遇することが多く、面接でも聞かれることも...

Vueプラグインの詳しい説明

要約するこの記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS....

Docker Nginxコンテナの制作と展開の実装方法

クイックスタート1. Docker Hubでnginxイメージを見つけるdocker 検索 ngin...

MySQL 5.7 に組み込まれているストレス テストの mysqlslap コマンドと構文の詳細な説明

序文mysqlslap は、MySQL サーバーへのクライアント負荷をシミュレートし、各ステージの時...

IE8 ベータ 1 には注意が必要な 2 つの領域があります

<br />関連記事: Web スキル: 複数の IE バージョンを共存させるソリューシ...

Linux で pip 操作中にタイムアウトが発生する問題を解決する方法

Linuxインスタンスでpipを使用する際のタイムアウト問題を解決する方法pip は最も人気のある ...

Javascript での JSBridge に関する予備的研究

目次JSBridgeの起源JSBridgeの双方向通信原理JSはネイティブを呼び出すネイティブコール...

Dockerでコンテナを作成するときのディレクトリ権限

昨日プロジェクトを書いていた時に、MySQL の派生版である Percona を使う必要があったので...