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 サービスをデプロイする手順

推薦する

MySQL の準同期レプリケーションについての簡単な説明

導入MySQL はレプリケーションを通じてストレージ システムの高可用性を実現します。現在、MySQ...

Mysql 主キー UUID と自動増分主キーの違いと利点と欠点

導入私はしばらくの間、postgresql データベースを使用していました。クラウドに移行した後、自...

一般的なDocker Composeコマンドの詳細な説明

1. Docker Compose の使用方法は docker コマンドの使用方法と非常に似ています...

Quill エディタでカスタム HTML レコードを挿入する詳細な例

もう2020年です。飢えた人間は単純なテキストでは満足できなくなり、さまざまなスタイルの派手なテキス...

負の距離(共感) - 相互影響の反復プロセス

ネガティブな距離は共感を意味します。序文(疑問の提起):プロダクトマネージャーは機能を把握します。機...

Dockerコンテナ起動時に固定IPを設定する実装

Dockerインストール後のネットワークタイプ [root@insure updev]# docke...

IE イメージ ツールバーを無効にする

IE6 で試してみたところ、ツールバーが表示されました。オプションに「イメージ ツールバーを有効にす...

初心者向けウェブサイト構築ガイド⑦:美しいウェブサイトを作るのはとっても簡単

私はかつて、ウェブサイトを一度も構築したことのない人々が、初心者向けのウェブサイト構築方法に関する私...

docker で php+nginx+swoole+mysql+redis 環境を構築する方法

オペレーティングシステム: Alibaba Cloud ESC インスタンス centos7.4ソフ...

一般的な CSS プロパティのブラウザ互換性の概要 (推奨)

CSS プロパティのブラウザ互換性をまとめる必要があるのはなぜですか?使用する際は、Can I U...

古典的なスネークゲームの JavaScript 実装

この記事では、古典的なスネークゲームを実装するためのJavaScriptの具体的なコードを参考までに...

MySql の集計関数に条件式を追加する方法

MySQL のフィルタリングのタイミングは、集計関数で使用される where 条件と having ...

WEB中国語フォントアプリケーションガイド

Web 上でフォントを使用することは、基本的なスキルであると同時に芸術でもあります。英語のフォントに...

HTML ファイルにファイルの内容を含める方法の概要

フォーラムでは、ネットユーザーから「HTML ファイル内の別の HTML ファイルの内容を読み取るこ...

ウェブデザインのグラフィック構成と組版機能の紹介

すべてには基礎が必要です。家を建てるには基礎が必要です。方程式を解くには、まず九九を覚える必要があり...