シャーディングはデータベースへの負荷を分散する良い方法です。
テーブル パーティショニングの最も単純な意味は、テーブル構造を複数のテーブルに分割し、それらを同じライブラリまたは異なるライブラリに配置できることです。
もちろん、どのような状況でテーブルを分割する必要があるかを最初に知る必要があります。個人的には、1つのテーブルのレコード数が数百万から数千万に達すると、サブテーブルの使用が必要になると考えています。
1. サブテーブルの分類
1> 垂直サブテーブル
は、同じテーブル内にある可能性のあるコンテンツを人為的に複数のテーブルに分割します。 (いわゆるオリジナルとは、リレーショナル データベースの第 3 パラダイムの要件に従って、それらが同じテーブル内に存在する必要があることを意味します。)
テーブルを分割する理由: データのアクティビティに応じて分割します (異なるアクティブなデータは異なるため)
ケース:
ブログ システムの場合、記事のタイトル、作成者、カテゴリ、作成時間などは変更頻度が低く、クエリ数が多く、良好なリアルタイム データを持つことが最適です。私たちはそれをコールドデータと呼びます。ブログの閲覧数、返信数、同様の統計情報など、頻繁に変化するデータをアクティブデータと呼びます。したがって、データベースの構造を設計するときは、まずテーブルのパーティション分割を考慮する必要があります。
テーブルを次のように垂直に分割した後:
まず、コールド データに対してストレージ エンジンを別の方法で使用して、データをより適切にクエリできます。アクティブなデータの場合は、更新速度が向上する Innodb を使用できます。
次に、コールド データ用にさらに多くのスレーブ データベースを構成します。これは、より多くの操作がクエリされるため、クエリ速度が向上します。ホット データの場合、メイン データベースで比較的多くの水平サブテーブル処理が行われる可能性があります。
実際、一部の特別なアクティブ データについては、memcache や redis などのキャッシュの使用を検討し、その量が一定の量に達したときにデータベースを更新することもできます。または mongodb などの nosql データベース これは単なる例なので、最初は説明しません。
2>水平テーブル分割
文字通りの意味からわかるように、大きなテーブル構造を、ユーザー情報テーブル、user_1、user_2 など、同じ構造を持つ異なるテーブルに水平に分割することです。テーブル構造はまったく同じですが、テーブルはユーザー ID に基づくモジュール分割など、いくつかの特定のルールに従って分割されています。
テーブルを分割する理由: 1つのテーブルの容量が大きくなりすぎないよう、データ量に応じて分割することで、1つのテーブルのクエリなどの処理能力を確保します。
ケース: 上記の例と同じ、ブログ システム。ブログの量が大量に達した場合は、水平セグメンテーションを採用して、各単一テーブルの負荷を軽減し、パフォーマンスを向上させる必要があります。たとえば、ブログのコールドデータテーブルが 100 個のテーブルに分割されている場合、100 万人のユーザーが同時に閲覧している場合、単一のテーブルであれば 100 万回のリクエストが行われます。しかし、テーブルが分割された後は、テーブルごとに 10,000 件のデータ リクエストを行うと、負荷が大幅に軽減されます (絶対平均を取得することは不可能なので、単なる仮定です)。
データベースをコピーすることでアクセスの問題は解決できますが、大規模な同時書き込みの問題は解決できません。この問題を解決するには、MySQL データのセグメント化を考慮する必要があります
データのセグメント化は、その名前が示すように、データを分散することです。 1 つのホスト上でデータを複数のマシンに分散して、単一ホストの負荷を軽減します。 1 つは、ビジネス モジュールごとにデータベースを複数のデータベースに分割する方法です。もう 1 つは、テーブルの分割です。これは、特定のビジネス ルールまたはロジックに従ってデータを異なるホストに分割することを意味します。これは、Oracle のテーブル パーティショニングと似ています。
サブライブラリは垂直パーティショニングとも呼ばれます。この方法は実装が比較的簡単です。サブライブラリを作成する場合、各モジュールのビジネス モジュール間の相互作用を明確に考慮する必要があります。将来、クロスデータベース操作を作成する際に多くの問題が発生します。
サブテーブルは水平パーティショニングとも呼ばれます。この方法は垂直パーティショニングよりも実装が複雑ですが、垂直パーティショニングでは解決できない問題、つまり単一のテーブルへのアクセスと書き込みが非常に頻繁であるという問題を解決できます。今回は、特定のビジネス ルール (追記: インターネット BBS フォーラムのメンバーシップ レベルの概念など: テーブルはメンバーシップ レベルに応じて分割されます) を使用してテーブルを分割することができます。これにより、単一のテーブルへの負担が軽減され、問題を解決できます。さまざまなモジュール間の頻繁な相互作用の問題。
サブデータベースの利点は、実装が簡単であること、ライブラリ間の境界が明確であること、およびメンテナンスが容易であることです。欠点は、データベース間の操作が頻繁に行われないことと、単一テーブル内の大量のデータの問題を解決できないことです。解決しました。
シャーディングの利点は、シャーディングの欠点を解決できることですが、欠点はまさにシャーディングの利点です。シャーディングの実装、特にテーブルシャーディングルールの分割、プログラムの記述などがより複雑になります。データベースの部分的な移植とメンテナンス。
実際のアプリケーションでは、インターネット企業の一般的な方法は、まずデータベースを分割し、次にテーブルを分割して、互いの長所を学ぶために組み合わせて使用することです。これにより、mysql 拡張機能の最大の利点が最大限に発揮されます。欠点は、アーキテクチャが大規模で複雑であり、アプリケーションの作成もより複雑であることです。
以上がMySQL - サブデータベースおよびテーブルサブデータベースに関するヒントの共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。