1. テーブルとパーティションを分割する必要があるのはなぜですか? 日常の開発では、大きなテーブルに遭遇することがよくあります。いわゆる大きなテーブルとは、数百万、数千万のレコードを格納するテーブルを指します。このようなテーブルは大きすぎるため、データベースのクエリと挿入に時間がかかり、パフォーマンスが低下します。結合クエリが関係する場合、パフォーマンスはさらに悪くなります。テーブル シャーディングとテーブル パーティショニングの目的は、データベースの負荷を軽減し、データベースの効率を向上させることです。一般的に言えば、テーブルの追加、削除、変更、チェックの効率を向上させることです。 2. テーブル シャーディングとパーティショニングとは何ですか? 2.1 サブテーブル テーブル シャーディングとは、特定のルールに従って、大きなテーブルを独立したストレージ スペースを持つ複数のエンティティ テーブルに分解することです。これらはサブテーブルと呼ぶことができます。各テーブルは、MYD データ ファイル、.MYI インデックス ファイル、および .frm テーブル構造ファイルの 3 つのファイルに対応します。これらのサブテーブルは、同じディスクまたは異なるマシンに分散できます。アプリは読み取りおよび書き込み時に、事前に定義されたルールに従って対応するサブテーブル名を取得し、それを操作します。 2.2 パーティション分割 パーティショニングはテーブル シャーディングに似ており、どちらもルールに従ってテーブルを分解します。違いは、テーブル シャーディングでは大きなテーブルを複数の独立した物理テーブルに分割するのに対し、パーティショニングではデータをセグメントに分割して複数の場所 (同じディスクまたは異なるマシン) に保存することです。パーティション分割後も表面上はテーブルのままですが、データは複数の場所にハッシュされます。アプリが読み取りおよび書き込みを行う場合、大きなテーブル名に対して操作が行われ、DB はパーティション化されたデータを自動的に整理します。 2.3 MySQL テーブルのシャーディングとパーティショニングの関係は何ですか? 1) どちらも MySQL のパフォーマンスを向上させ、高同時実行条件下でも優れたパフォーマンスを発揮します。 3. テーブルを分割するいくつかの方法 3.1 MySQL クラスタ サブテーブルではありませんが、サブテーブルと同じ役割を果たします。クラスターはデータベース操作の数を共有し、タスクを複数のデータベースに分散できます。クラスターは読み取りと書き込みを分離して、読み取りと書き込みの負荷を軽減できます。これにより、データベースのパフォーマンスが向上します。 3.2 カスタムルールテーブル 大きなテーブルは、ビジネス ルールに従って複数のサブテーブルに分解できます。通常は以下の種類がありますが、独自のルールを定義することもできます。 範囲 –このモードでは、データをさまざまな範囲に分割できます。たとえば、テーブルを年ごとに複数のパーティションに分割できます。 テーブル分割ルールはパーティション分割ルールと同じであり、パーティション分割モジュールで詳細に説明されています。 以下では、Range を使用してテーブルを(年ごとに)分割する方法を簡単に紹介します。 テーブル構造に、自動増分 ID、名前、入金額、入金額の 4 つのフィールドがあるとします。入金額をルールとして使用してテーブルを分割し、複数のテーブルを個別に作成します。 var getTableName = 関数() { varデータ = { 名前: 'トム', お金: 2800.00, 日付: '201410013059' }; var テーブル名 = 'account_'; var year = parseInt(data.date.substring(0, 4)); (年 < 2012) { テーブル名 += 2011; // account_2011 } そうでない場合 (年 < 2013) { テーブル名 += 2012; // account_2012 } そうでない場合 (年 < 2014) { テーブル名 += 2013; // account_2013 } そうでない場合 (年 < 2015) { テーブル名 += 2014; // account_2014 } それ以外 { テーブル名 += 2015; // account_2015 } テーブル名を返します。 } 3.3 マージストレージエンジンを使用してテーブルシャーディングを実装する マージ テーブルは、メイン テーブルとサブ テーブルに分かれています。メイン テーブルは、サブ テーブルを論理的にカプセル化するシェルのようなものです。実際、すべてのデータはサブ テーブルに格納されます。 メインテーブルを通じてデータを挿入したりクエリを実行したりできます。サブテーブルのルールがわかっていれば、サブテーブルを直接操作することもできます。 サブテーブル 2011 テーブル「account_2011」を作成します( `id` int(11) NOT NULL AUTO_INCREMENT , `name` varchar(50) 文字セット utf8 COLLATE utf8_general_ci NULL デフォルト NULL , `money` float NOT NULL , `tradeDate` 日時 NOT NULL 主キー (`id`) ) エンジン=MyISAM デフォルト文字セット=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=2 チェックサム=0 ROW_FORMAT=動的 遅延キー書き込み=0 ; サブテーブル 2012 テーブル「account_2012」を作成します( `id` int(11) NOT NULL AUTO_INCREMENT , `name` varchar(50) 文字セット utf8 COLLATE utf8_general_ci NULL デフォルト NULL , `money` float NOT NULL , `tradeDate` 日時 NOT NULL 主キー (`id`) ) エンジン=MyISAM デフォルト文字セット=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=2 チェックサム=0 ROW_FORMAT=動的 遅延キー書き込み=0 ; メインテーブル、全年 テーブル `account_all` を作成します ( `id` int(11) NOT NULL AUTO_INCREMENT , `name` varchar(50) 文字セット utf8 COLLATE utf8_general_ci NULL デフォルト NULL , `money` float NOT NULL , `tradeDate` 日時 NOT NULL 主キー (`id`) ) エンジン=MRG_MYISAM デフォルト文字セット=utf8 COLLATE=utf8_general_ci UNION = (`account_2011`,`account_2012`) INSERT_METHOD=LAST ROW_FORMAT=動的 ; メイン テーブルを作成するときに、挿入方法を指定する INSERT_METHOD があります。値は次のとおりです: 0: 挿入を許可しない、FIRST: UNION の最初のテーブルに挿入する、LAST: UNION の最後のテーブルに挿入する。 メイン テーブルをクエリする場合、すべてのサブ テーブルをまとめてクエリすることと同じです。これはサブテーブルの利点を反映していません。サブテーブルをクエリすることをお勧めします。 4. 分割のいくつかの方法 4.1 範囲 テーブル範囲を作成( id int(11)、 お金 int(11) unsigned not null、 日付 日時 )範囲(年(日付))でパーティション分割( パーティションp2007の値は(2008)より小さい、 パーティションp2008の値は(2009)より小さい、 パーティションp2009の値が(2010)より小さい パーティションp2010の値がmaxvalueより小さい ); 4.2 リスト テーブルリストを作成( 整数(11)、 b 整数(11) )(リストによる分割(b) パーティションp0の値を(1,3,5,7,9)に分割し、 パーティションp1の値は(2,4,6,8,0) ); 4.3 ハッシュ テーブルハッシュを作成する( 整数(11)、 b 日時 )ハッシュによるパーティション(YEAR(b) パーティション4; 4.4 キー テーブルt_keyを作成します( 整数(11)、 b 日時) キーによるパーティション(b) パーティション4; 4.5 パーティション管理 4.5.1 新しいパーティションの追加 テーブルsale_dataを変更する パーティションを追加します (パーティション p201010 の値は (201011) より小さい)。 4.5.2 パーティションの削除 パーティションを削除すると、パーティション内のすべてのデータも削除されます。 テーブル sale_data を変更し、パーティション p201010 を削除します。 4.5.3 パーティションの結合 次のSQLはp201001 - p201009を3つのパーティションp2010Q1 - p2010Q3にマージします。 テーブルsale_dataを変更する パーティション p201001、p201002、p201003 を再編成します。 p201004、p201005、p201006、 p201007、p201008、p201009 に ( パーティション p2010Q1 の値は (201004) より小さいです。 パーティション p2010Q2 の値は (201007) より小さいです。 パーティション p2010Q3 の値が (201010) より小さい ); 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
>>: Windows Server 2008 R2 リモート デスクトップのポート 3389 を変更する方法
<br />以下は開発中に遭遇した問題と、そこから得た経験です。デバッグに時間がかかりま...
前に書いた内容: ビジネス ロジックの判断を行うために、最新のトランザクション ID を表示する必要...
目次序文1. MySQL メインストレージエンジン: 2. さまざまなストレージエンジンがテーブルを...
概要: HBase には、ユーザーに管理、分析、修復、デバッグ機能を提供するための多くの操作および保...
1. 事件の背景:仕事上、Ubuntu への vscode リモート接続を使用する必要があります。 ...
この記事では、VMware 環境下で Ubuntu と Windows 間でファイルを共有する方法を...
1. jsonオブジェクトをjson文字列に変換し、文字列が「{}」であるかどうかを判断します。 v...
mysql のような php switch case ステートメント。 xxフィールドを選択、ケース...
目次Docker Compose の使用シナリオ基本的なデモ基本的な操作とメンテナンスdocker-...
vueプロジェクトでは、アップロードした画像に透かしを追加して参照できるようにするアップグレード版...
Docker バージョン 1.13.1問題プロセス特定の環境のMySQLコンテナを停止、強制終了、ま...
エラー 1290 (HY000) : MySQL サーバーは –secure-file-priv オ...
webpack をパッケージ化する前に、次の作業が完了していることを確認する必要があります。 1) ...
1. Web標準の意味を理解する - なぜWeb標準を採用するのか***** コンテンツとスタイル...
コンテナの自動起動Docker は、コンテナが終了したとき、または Docker が再起動されたとき...