MySql テーブル、データベース、シャーディング、パーティショニングの知識ポイントの紹介

MySql テーブル、データベース、シャーディング、パーティショニングの知識ポイントの紹介

1. はじめに

データベース内のデータ量が一定レベルに達すると、システムパフォーマンスのボトルネックを回避する必要があります。データ処理が必要であり、使用される方法は、パーティション分割、シャーディング、データベース シャーディング、およびテーブル シャーディングです。

2. シャーディング(データベースシャーディングに類似)

シャーディングは、データベースを複数の物理ノードにスケールアウトする効果的な方法です。その主な目的は、単一ノードのデータベース サーバーの I/O 容量の制限を打破し、データベースのスケーラビリティの問題を解決することです。 Shard という言葉は「破片」を意味します。データベースを大きなガラス片とみなしてそれを割った場合、それぞれの小さな破片はデータベース シャードと呼ばれます。データベース全体を分割するプロセスはシャーディングと呼ばれ、シャーディングと翻訳できます。

正式には、シャーディングは、大規模なデータベースを複数の物理ノードに分散するパーティション分割スキームとして簡単に定義できます。各パーティションには、スライスと呼ばれるデータベースの一部が含まれます。パーティション分割の方法は任意で、従来の水平分割や垂直分割に限定されません。シャードには、複数のテーブルの内容や、複数のデータベース インスタンスの内容を含めることができます。各シャードはデータベース サーバーに配置されます。データベース サーバーは、1 つ以上のシャードからのデータを処理できます。システムには、クエリのルーティングと転送を実行するサーバーが必要です。このサーバーは、クエリが実行のためにアクセスするデータを含むシャードまたはシャード コレクション ノードにクエリを転送する役割を担います。

3. スケールアウト/スケールアップと垂直分割/水平分割

MySQL には、スケール アウトとスケール アップという 2 つの拡張ソリューションがあります。

スケールアウトとは、アプリケーションを水平方向に拡張できることを意味します。一般的に、データ センター アプリケーションの場合、スケール アウトとは、マシンを追加しても、アプリケーションがこれらのマシンのリソースを有効に活用して効率を向上させ、優れたスケーラビリティを実現できることを意味します。

スケールアップとは、アプリケーションを垂直方向に拡張できることを意味します。一般的に、単一のマシンの場合、スケールアップとは、コンピューティング ノード (マシン) が CPU コアやストレージ デバイスを追加し、より大きなメモリを使用すると、アプリケーションがこれらのリソースを最大限に活用して効率を向上させ、優れたスケーラビリティを実現できることを意味します。

MySql のシャーディング戦略には、垂直シャーディングと水平シャーディングが含まれます。

垂直分割: テーブル間の IO 競合を解決するために機能モジュールごとに分割することを指します。例えば、注文ライブラリ、商品ライブラリ、ユーザーライブラリなどに分けることができ、このように複数のデータベースのテーブル構造は異なります。

水平分割: 同じテーブルのデータがブロックに分割され、異なるデータベースに保存され、単一テーブルのデータ量の増加によって生じる負荷を解決します。これらのデータベースのテーブル構造はまったく同じです。

テーブル構造の設計は垂直に分割されています。よくあるシナリオとしては、

a). 大きなフィールドの垂直分割。基本テーブルのアクセス パフォーマンスを向上させるには、別のテーブルに大きなフィールドを作成します。原則として、パフォーマンスが重要なアプリケーションでは、データベース内の大きなフィールドは避ける必要があります。

b). 用途に応じて縦に分割する。たとえば、企業の重要な属性は、基本属性、販売属性、調達属性、生産および製造属性、財務会計属性などに従って垂直に分割できます。

c). アクセス頻度に基づく垂直セグメンテーション。たとえば、電子商取引や Web 2.0 システムでは、ユーザー属性が多数ある場合、頻繁に使用される基本的な属性と、あまり使用されない属性を垂直に分離できます。

テーブル構造の設計は水平に分割されています。よくあるシナリオとしては、

a) たとえば、オンライン電子商取引サイトの注文表に大量のデータがある場合、それを年間レベルと月間レベルに分割する必要があります。

b). Web 2.0 Web サイトには、登録ユーザーとオンライン アクティブ ユーザーが多すぎます。関連ユーザーと、ユーザーに密接に関連するテーブルは、ユーザー ID の範囲に従って水平に分割されます。

c) たとえば、フォーラムのトップ投稿にはページングの問題が発生し、各ページにトップ投稿を表示する必要があります。この場合、トップ投稿を水平に分割して、トップ投稿を取得するときにすべての投稿のテーブルから読み取ることを回避できます。

4. テーブルとパーティション

テーブル シャーディングの表面的な意味は、テーブルを複数の小さなテーブルに分割することであり、パーティショニングはテーブルのデータを N 個の複数のブロックに分割することです。これらのブロックは、同じディスク上にあっても、異なるディスク上にあってもかまいません。

テーブルシャーディングとパーティショニングの違い

1. 実装

MySQL のテーブル シャーディングは、実際のテーブル シャーディングです。テーブルが多数のテーブルに分割された後、各小さなテーブルは 3 つのファイル (MyISAM エンジン: .MYD データ ファイル、.MYI インデックス ファイル、および .frm テーブル構造ファイル) に対応する完全なテーブルになります。

2. データ処理

テーブルが分割された後、データはサブテーブルに格納されます。メインテーブルは単なるシェルであり、データの格納とアクセスは各サブテーブルで行われます。パーティショニングにはテーブルを分割するという概念はありません。パーティショニングは、データを格納するファイルを多数の小さなブロックに分割するだけです。パーティション化されたテーブルは依然としてテーブルであり、データ処理は依然として自分で行われます。

3. パフォーマンスを向上させる

テーブルを分割すると、単一テーブルの同時実行能力が向上し、ディスク I/O パフォーマンスも向上します。パーティショニングはディスク I/O ボトルネックを解消し、ディスクの読み取りおよび書き込み機能を改善して MySQL のパフォーマンスを向上させることを目的としています。

この時点で、パーティショニングとテーブル シャーディングの焦点は異なります。テーブル シャーディングの焦点は、データにアクセスする際の MySQL の同時実行性を向上させる方法にあります。一方、パーティショニングの焦点は、MySQL のパフォーマンスを向上させるという目的を達成するために、ディスクの読み取りおよび書き込み機能を突破する方法にあります。

4. 実施の難しさ

テーブルを分割する方法は多数ありますが、マージを使用するのが最も簡単な方法です。このアプローチはパーティショニングとほぼ同じくらいの難しさがあり、プログラム コードに対して透過的です。他のテーブルパーティション分割方法を使用する場合、パーティション分割よりも面倒になります。パーティショニングの実装は比較的簡単です。パーティション テーブルの作成は通常のテーブルの作成と何ら変わりなく、コード側では透過的です。

パーティションの適用シナリオ

1. テーブルのクエリ速度が遅すぎるため、使用に影響します。

2. 表のデータはセグメント化されている

3. データに対する操作は、多くの場合、データ全体ではなく、データの一部のみに関係する。

テーブルsalesを作成する(
    id INT AUTO_INCREMENT、
    金額 DOUBLE NOT NULL、
    order_day DATETIME NOT NULL、
    主キー(id, order_day)
) エンジン=Innodb
範囲によるパーティション(YEAR(order_day)) (
    パーティション p_2010 値が (2010) 未満
    パーティション p_2011 値が (2011) より小さい、
    パーティション p_2012 値が (2012) より小さい、
PARTITION p_catchall 値が MAXVALUE 未満です);

サブテーブルの適用シナリオ

1. テーブルのクエリ速度が遅すぎるため、使用に影響します。

2. 頻繁な挿入や結合クエリが発生すると、速度が低下します。

シャーディングの実装には、比較的複雑なビジネス統合と移行が必要です。

5. テーブルとデータベースの分割

テーブルを分割すると、単一テーブル内のデータ量が多すぎるためにクエリ効率が低下するという問題は解決できますが、データベースの同時処理能力の質的な向上は得られません。同時実行性の高い読み取りおよび書き込みアクセスに直面して、データベース マスター サーバーが書き込み操作の負荷に耐えられない場合、スレーブ サーバーをどれだけ拡張しても、現時点では意味がありません。したがって、考え方を変えてデータベースを分割し、データベースの書き込み機能を向上させる必要があります。これをデータベース シャーディングと呼びます。

テーブルシャーディング戦略と同様に、データベースシャーディングでは、次の図に示すように、キーワードモジュロ方式を使用してデータアクセスをルーティングできます。

6. パーティショニングとシャーディングの違い

これで、MySql テーブル シャーディング、データベース シャーディング、シャーディングとパーティショニングの知識ポイントに関するこの記事は終了です。MySql テーブル シャーディング、データベース シャーディング、シャーディングとパーティショニングの関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL データベースのパーティション分割とテーブル パーティション分割の方法 (一般的に使用される)
  • MySQL データベース テーブルとデータベース パーティショニング戦略
  • MYSQL パフォーマンス最適化共有 (データベースとテーブルのシャーディング)
  • MyBatis は、Mysql データベースのサブライブラリとサブテーブルの操作と概要を実装します (推奨)
  • MySQLデータベースとテーブルシャーディングの概要
  • MySQLデータベースシャーディングとテーブルシャーディングが完全に崩壊

<<:  Ubuntu 20.04は静的IPアドレスを設定します(異なるバージョンを含む)

>>:  MySQL DML言語操作例

推薦する

コードレイン効果を実現するjQueryプラグイン

この記事では、コードレイン特殊効果を実現するためのjQueryプラグインの具体的なコードを参考までに...

Dockerはredis 5.0.7をインストールし、外部構成とデータの問題をマウントします

Redis は、ANSI C で記述されたオープンソースの NoSQL データベースであり、ネットワ...

Vue プロジェクトで mock を使用する方法をご存知ですか?

目次最初のステップ: 2 番目のステップは、request.js で関連する構成を行うことです。re...

MySQL 8.0.12 のインストールと設定方法のグラフィックチュートリアル (Windows 版)

1. はじめにプロジェクトではMySQLを使用しています。インターネット上の例を参考にインストール...

7つの便利なTypeScriptの新機能

目次1. オプションの連鎖2. NULL値の結合3. 再帰型エイリアス4. アサーション署名5. P...

CSS で平均レイアウトを実現するために負のマージンを使用する例

均等に分散されたレイアウトの場合、通常はネガティブ マージン方式を使用します。次の図は平均的なレイア...

Linux で 1 回限りのスケジュールされたタスクを実行するための at コマンドの使用に関する詳細な説明

目次序文1. 一度限りの計画タスクの紹介2. コマンド3. 1回限りのスケジュールタスクを作成する4...

JavaScript イベント委任 (プロキシ) の使用例の詳細

目次導入例: イベントの委任記述方法1: イベント委譲書き方2: 各子要素がイベントをバインドする例...

MySQLで数千万のテストデータを素早く作成する方法

述べる:この記事で扱うデータ量は 100 万です。数千万のデータが必要な場合は、量を増やすだけで済み...

Linux Samba サーバーの超詳細なインストールと構成 (問題解決付き)

目次Samba サーバーの紹介Samba サーバー コンポーネントSamba サーバー関連の設定ファ...

IDEAでVUEプロジェクトをデバッグするための詳細な手順

js コードをデバッグするには、コード内にデバッガーを記述するか、Chrome で毎回ブレークポイン...

MySQL のロングトランザクション例の詳細な説明

序文: 「MySQL 入門」シリーズの記事は終了しました。今後も引き続き MySQL に焦点を当て、...

LinuxとGNUシステムの関係の詳細な説明

目次私たちが毎日実行している Linux システムとは何でしょうか? LinuxカーネルとGNUシス...

IOSデータベースアップグレードデータ移行の詳細な例

IOSデータベースアップグレードデータ移行の詳細な例まとめ:昔、データベースのバージョン アップグレ...

JavaScriptで配列を作成する方法の詳細な説明

目次JavaScript で配列を作成する配列の使用配列を分割文字列に変換する配列に要素を追加する配...