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 を変更する方法
チーム開発のプロセスでは、プロジェクトの安定性、コードの効率性、管理の利便性のために、内部開発および...
この記事では、ネイティブ JS で実装された共有サイドバーを紹介します。効果は次のとおりです。 以下...
今日、クライアントが広告を掲載したいのですが、提供された素材は Flash です。私たちはあまり気に...
1. ワニスの概要1. ワニスの紹介Varnish は、新しいソフトウェア アーキテクチャを使用し、...
1.1 nginxインストールパッケージとインストールスクリプトをクライアントにコピーし、スクリプト...
バックエンド プログラマーとして、フロントエンドのものをいじらなければならないこともあります。そこで...
1. 背景私たちは時々社内研修を行っており、実験環境をよく利用しています。最初はdockerコンテナ...
目次1. 配列の分離割り当て1.1 配列分離割り当てとは何ですか? 1.2 配列分離割り当てに失敗し...
1) キャッシュメカニズムの紹介Linux システムでは、ファイルシステムのパフォーマンスを向上させ...
以前、動的フォームを記述しているときに落とし穴に遭遇しました。インデックスの添え字をキーとして使用す...
年末なので仕事も少なくなっています。私が何もせずにいるのを見ると、上司はきっと不快に思うでしょう。そ...
mysql 行から列へ、列から行へ難しい文章ではないので、詳しく説明はしません。文章を読むときは、一...
目次序文:システム要件:インストール環境:古いバージョンをアンインストールします: yum は具体的...
1. Dockerをインストールする yumでdockerをインストール #サービスを開始する sy...
その理由はモッカー プラットフォームを導入したかったので、友人の勧めで既成のプロジェクト api-m...