高い同時実行 - サブサブテーブルのデータベースライブラリ

なぜあなたとパーティションテーブルをしましたか?

単一のテーブルにあまりにも多くのデータに続いて成長を続ける当社のデータベースのデータ、。クエリチャンスは遅い読むには、ロック機構も動作しているため、表には、データベースのパフォーマンスのボトルネックの出現に深刻な影響を検索するアプリケーションを引き起こすことになります。

MySQLのデータの整合性を確保するために、テーブルロック機構及びロック行があります。あなたは、テーブルをロックすることはできません。このテーブルの上に動作を表すので、私は手術台の上に仕事を終える必要があります。行ロックは、あまりにも、他の私は、データ操作を待つ必要がSQLは、これらのデータを操作するために、この記事を終えました。これが起こるとき、我々はポイントテーブルまたはパーティションを考慮することができます。

1、サブテーブル

ポイントテーブルは何ですか?

サブテーブルは、特定の規則に従って独立したエンティティテーブル格納部を複数有する大きなテーブルに分割され、3つの文書に対応する各テーブル、MYDデータファイル、.MYIインデックスファイル、.FRMファイルテーブル構造。これらのテーブルは、同じディスク上の、または別のマシンに分散することができます。アプリケーションは、事前に定義されたルールに従って、対応する書き込みタイムテーブルを与え、それを操作します。

データテーブルを複数に分割し、ユーザがアクセスしたときに、単一のデータベーステーブルの分割、特定のアルゴリズムに従って(例えば、ハッシュ方式、また余り(剰余)方法を使用することができる)、ユーザは異なるアクセスすることを可能にしますテーブル、データアクセス圧力を単一のデータ・テーブルを低減する、データテーブルを複数に分散しているので。改善されたデータベースアクセスのパフォーマンス。この中にスコアシートの目的は、クエリ時間を短縮する、データベースの負担を軽減します。

 

MySQLのサブテーブルは、垂直および水平セグメント分割に分割されています

垂直セグメントは、テーブルの列がより複数のテーブルで分割する表形式データを、分割手段

通常、我々は以下の原則に従って、垂直分割しました

フィールドは、単一のテーブルの上には使用されません

テキスト、BLOB(バイナリラージオブジェクト、バイナリラージオブジェクト)および他の大型のフィールドは、スケジュール上で分割し

列は、多くの場合、テーブルの上にクエリを組み合わせました

垂直解像度のステップより多くの時間をして、その後、クエリ時、最初にデータテーブル設計で実行する必要があるまでjionキー。

 

水平分割分割データテーブルの行を参照し、データテーブルが格納する複数のテーブルに分割します。

スプリットレベルの原則

一般的に、我々は、使用し、テーブルを分割する、などのハッシュ、モジュラス

例えば、そこにあるのユーザー表400W ユーザーは、そのクエリの効率を向上させるために、我々は、に分け、4つのテーブルユーザー1、、users2、users3、users4

使用して、4つのデータテーブルに分散モジュロIDの方法のId%4 = [0,1,2,3]

その後、クエリ、更新、削除、クエリはモジュロによって方法であり、

ビジネスロジックの一部はまた、アーカイブ地域、年および他のフィールドによって解決することができます

表分割後、我々は、ユーザーのクエリの行動を制約します。例えば、我々はスプリットの年であり、ページのデザインで、この時間が制約されているユーザーは、最初の年を選択する必要があります検索する前に。

 

いくつかの方法でサブテーブル:

1)のMySQL Clusterの

これは、スコアシートが、ポイントテーブルではなく、同じ役割を果たしました。クラスタは、複数のデータベース間でタスクを共有することになり、操作の数のデータベースを共有することができます。クラスタは、減圧を、読み取り及び書き込み分離読み取りおよび書き込みすることができます。データベースのパフォーマンスを向上させるように。

2)事前に予測し、大量のデータを頻繁にアクセスされるテーブルを発生し、複数のテーブルに分割

特定のアルゴリズム(例えば、異なるユーザがテーブルにアクセスすることを可能にするハッシュ方法は、また余り(剰余)方法を使用することができます)。

テーブルの投稿内側例のフォーラムでは、この表には長い時間が数十万人は、何百万人がそうである、非常に大きくなければなりません。情報テーブル内のチャット、人々の数十夜、長い時間とのチャットは、このテーブルのデータは非常に大きくなければなりません。このような多くの例のように。したがって、このデータは、大規模の外に投影することができる、我々は分離進めることは、N個のテーブルをNは、実際の状況に応じて、数です。チャット情報テーブルでは、例えば:我々は構築しなければならなかった100のなどのテーブルを、message_00、message_01、message_02 .......... message_98、そのユーザーのmessage_99。その中にチャットのユーザーIDを、この情報を決定します内部テーブル、あなたが使用することができます取得するには、ハッシュ方法は、また、残りの道、多くの方法を取得するために使用することができます。

または各テーブルのデータ量に対応するように設計されてもよいN、次にデータ特定テーブルがフルであるかどうかを決定する方法は?場合、記録統計の数の挿入前には、第一の操作部の操作を行い、テーブルデータに追加する閾値が到達されたデータの<N個、直接挿入は、ブロック内の新たなデータベーステーブルを作成することができる(または以前に作成された)、その後、)操作を挿入します。

 

3)を用いてサブテーブルを達成するためにマージストレージエンジンを

既存の大規模なデータをより痛い分けたい場合は、最も痛みを伴うことは、内部にプログラムするので、コードを変更することで、SQL文が書かれていて、ポイントテーブルを達成するために、MERGEストレージエンジンこの方法がより適しています、。

サブテーブルをマージし、サブ分割メインテーブルとテーブルには、マスターテーブルは、論理サブテーブルをカプセル化するシェルに類似して、データが実際に子テーブルに格納されています。

私たちは、メインテーブルを挿入して、サブテーブルは明らかに直接、子テーブルを操作することができるルール場合は、データを照会することができます。

さんが使用する単純なを実装してみましょうサブテーブルのプレゼンテーションを達成するためにストレージエンジンをマージ:

会員情報ストレージ(テーブルという名前のすべての完全なリストを作成部材)

テストを存在する場合、MySQLの>データベースをドロップします。

MySQLの>テストを使用します。

(テーブル・メンバーを作成します

IDのBIGINTは、主キーをAUTO_INCREMENT

名前のVARCHAR(20)、

セックスTINYINT NOT NULLデフォルト '0'

)エンジン= MyISAMテーブルデフォルトのcharset = UTF8 AUTO_INCREMENT = 1。

ポイントデータを参加:

MySQLの>メンバー(名前、性別)の値( 'TOM1'、1)に挿入します。

MySQLの>メンバー(名前、性別)に挿入する名前を選択し、メンバーからのセックス。

2番目のステートメントは、データがたくさんあることを数回実行します

MySQLの>メンバーから*を選択します。

+ ---- + ------ + ----- +

| ID | 名前| セックス|

+ ---- + ------ + ----- +

| 1 | TOM1 | 1 |

| 2 | TOM1 | 1 |

| 3 | TOM1 | 1 |

| 4 | TOM1 | 1 |

| 5 | TOM1 | 1 |

| 6 | TOM1 | 1 |

| 7 | TOM1 | 1 |

| 8 | TOM1 | 1 |

| 9 | TOM1 | 1 |

| 10 | TOM1 | 1 |

| 11 | TOM1 | 1 |

| 12 | TOM1 | 1 |

| 13 | TOM1 | 1 |

| 14 | TOM1 | 1 |

| 15 | TOM1 | 1 |

| 16 | TOM1 | 1 |

+ ---- + ------ + ----- +

我々は置くテーブル、分割してみましょう2つの表にメンバーをtb_member1、tb_member2を

MySQLの>テストを使用します。

tb_member1を存在する場合、テーブルをドロップします。

(テーブルtb_member1を作成します

    ID BIGINT主キー、

    名前のVARCHAR(20)、

    セックスTINYINT NOT NULLデフォルト '0'

)ENGINE = MyISAMテーブルのデフォルトの文字セット= UTF8。

tb_member2を存在する場合、テーブルをドロップします。

(テーブルtb_member2を作成します

    ID BIGINT主キー、

    名前のVARCHAR(20)、

    セックスTINYINT NOT NULLデフォルト '0'

)ENGINE = MyISAMテーブルのデフォルトの文字セット= UTF8。

//作成もして、次のステートメントを使用することができますtb_member2   tb_member1のようなテーブルtb_member2を作成します。

マスター表の作成tb_memberを

tb_memberを存在する場合、テーブルをドロップします。
テーブルtb_member作成(
ID BIGINT主キー、
名前のVARCHAR(20)、
セックスTINYINT NOT NULLデフォルトは'0'
)ENGINE = MERGEのUNION =(tb_member1、tb_member2)INSERT_METHODは= LAST CHARSET = utf8のを。

注意:INSERT_METHODは、このパラメータINSERT_METHOD = NOはテーブルのみクエリとして使用されるすべての書き込みを行うことができないことを示し、INSERT_METHODは=テーブル内に挿入最後にLAST表します。INSERT_METHOD =最初内部を示す第1のテーブルに挿入されます。

見て構造tb_memberテーブル

MySQLの> DESC tb_member。

MySQLの> DESC tb_member。

+ ------- + ------------- + ------ + ----- + --------- + ---- ------------------------------------- +

| フィールド| タイプ| ヌル| キー| デフォルト| エクストラ|

+ ------- + ------------- + ------ + ----- + --------- + ---- ------------------------------------- +

| ID | BIGINT(20)| NO | PRI | NULL | AUTO_INCREMENT |

| 名前| VARCHAR(20)| YES | | NULL | |

| セックス| TINYINT(4)| NO | | 0 | |

+ ------- + ------------- + ------ + ----- + --------- + ---- -------------------------------------- +

セット内の3行(0.00秒)

注:子テーブルとメインテーブルのフィールド定義が矛盾しないように確認してください

次に、私達は行くために、2つのテーブルにデータを分割します:

MySQLの>インサートtb_member1(ID、名前、性別)を選択し、ID、名前、会員から性別にここID%2 = 0。

MySQLの>インサートtb_member2(ID、名前、性別)を選択し、ID、名前、会員から性別にここID%2 = 1。

二つのサブテーブルからのデータを表示します:

MySQLの> tb_member1から選択*;

+ ---- + ------ + ----- +

| ID | 名前| セックス|

+ ---- + ------ + ----- +

| 16 | TOM1 | 1 |

| 14 | TOM1 | 1 |

| 12 | TOM1 | 1 |

| 10 | TOM1 | 1 |

| 8 | TOM1 | 1 |

| 6 | TOM1 | 1 |

| 4 | TOM1 | 1 |

| 2 | TOM1 | 1 |

+ ---- + ------ + ----- +

セット内の8行(0.00秒)

 

MySQLの> tb_member2から選択*;

+ ---- + ------ + ----- +

| ID | 名前| セックス|

+ ---- + ------ + ----- +

| 3 | TOM1 | 1 |

| 1 | TOM1 | 1 |

| 5 | TOM1 | 1 |

| 7 | TOM1 | 1 |

| 9 | TOM1 | 1 |

| 11 | TOM1 | 1 |

| 13 | TOM1 | 1 |

| 15 | TOM1 | 1 |

+ ---- + ------ + ----- +

セット内の8行(0.00秒)

メインテーブル内のデータを見てください:

MySQLの> tb_memberから選択*;

+ ---- + ------ + ----- +

| ID | 名前| セックス|

+ ---- + ------ + ----- +

| 16 | TOM1 | 1 |

| 14 | TOM1 | 1 |

| 12 | TOM1 | 1 |

| 10 | TOM1 | 1 |

| 8 | TOM1 | 1 |

| 6 | TOM1 | 1 |

| 4 | TOM1 | 1 |

| 2 | TOM1 | 1 |

| 15 | TOM1 | 1 |

| 13 | TOM1 | 1 |

| 11 | TOM1 | 1 |

| 9 | TOM1 | 1 |

| 7 | TOM1 | 1 |

| 5 | TOM1 | 1 |

| 3 | TOM1 | 1 |

| 1 | TOM1 | 1 |

+ ---- + ------ + ----- +

セット内の16行(0.00秒)

 

MySQLの> ID = 3 tb_member SELECT * FROM。

+ ---- + ------ + ----- +

| ID | 名前| セックス|

+ ---- + ------ + ----- +

| 3 | TOM1 | 1 |

+ ---- + ------ + ----- +

セット内の1行(0.00秒)

注:合計テーブルはサブテーブルの代わりに、データにアクセスし、ハウジングです。

注意:メインテーブルが唯一のシェルである一方、各テーブルには、独自の個別のサブテーブル関連書類を持っており、関連文書のない完全なリストはありません

[ルート@ localhostの〜]#LSは-lを/ usr / local / mysqlの/データ/テスト/ tb_member *

-rw-R -----。1 mysqlのmysqlの8614 9月15日21時49 /usr/local/mysql/data/test/tb_member1.frm

-rw-R -----。1 MySQLのMySQLの320 9月16日午前0時02分/usr/local/mysql/data/test/tb_member1.MYD

-rw-R -----。1 mysqlのmysqlの2048年9月16日夜12時43分/usr/local/mysql/data/test/tb_member1.MYI

-rw-R -----。1 mysqlのmysqlの8614 9月15日21時50 /usr/local/mysql/data/test/tb_member2.frm

-rw-R -----。1 MySQLのMySQLの180 09月16日00:02 /usr/local/mysql/data/test/tb_member2.MYD

-rw-R -----。1 mysqlのmysqlの2048年9月16日夜12時43分/usr/local/mysql/data/test/tb_member2.MYI

-rw-R -----。1 mysqlのmysqlの8614 9月16日21時12 /usr/local/mysql/data/test/tb_member3.frm

-rw-R -----。1 mysqlのmysqlの0 9月16日午前21時12分/usr/local/mysql/data/test/tb_member3.MYD

-rw-R -----。1 mysqlのmysqlの1024年9月16日21時12 /usr/local/mysql/data/test/tb_member3.MYI

-rw-R -----。1 mysqlのmysqlの8614 9月16日21時14 /usr/local/mysql/data/test/tb_member.frm

-rw-R -----。1つのMySQLのmysqlの53 9月16日午後九時14 /usr/local/mysql/data/test/tb_member.MRG

 

サブテーブルとパーティション(すなわち、サブライブラリーとの差)

1、実装

A)   MySQLのサブサブテーブルは、すべての小さなテーブルがテーブル完了した後、実際のテーブルでは、テーブルは多くのテーブルに分かれて、ある三つのファイル、1つのに対応.MYDデータファイル、.MYIインデックスファイル。 FRMファイルのテーブル構造。

b)のパーティションが大きなテーブルのパーティションの後、彼は表だった、同じではありませんが、テーブルは2になっていませんが、彼のブロック格納されたデータは、より多くなり、

2、データ処理

A)サブテーブルの後に、データポイントは、サマリテーブルは、一部のテーブルの代わりに、データにアクセスし、単にハウジング、テーブルに格納されています。

b)は、それを分割し、そこにパーティションテーブル、パーティションの概念はありませんが、ファイルは、データがパーティションテーブルの後、多くの小さな部分に分割されて保存されている、またはそれ自体によって行わテーブル、またはデータ処理です​​。

3、パフォーマンスを向上させます

A)サブテーブル後、テーブルの同時実行は、単一のディスク向上I / O性能が向上します。高い並行性が現れる場合には、短縮を検索するために時間がかかるため、なぜ並行性は、異なるクエリ、内部の異なる小さなテーブルへの同時の圧力に応じて、全テーブルをそれを改善します。

b)はMySQLは主にディスクを突破しようとすると、パーティションの概念を提案したI / Oのボトルネックは、増加する識字ディスクを改善したいMySQLのパフォーマンスを。
この時点で、異なる点テーブルのパーティションテーブルと測定点の焦点は、どのように改善するか、データにアクセスするに焦点を当て向上させるために、ディスクの読み書きスキルを破る方法、およびそれを分割; mysqlの同時能力を汎用MySQLのパフォーマンスを。

4、実装の容易さの程度

a)は、テーブルの多くの方法がとありますが、サブテーブルにマージ、それが最も簡単な方法です。このように、プログラムコードに似て、それが透明に行うことができるパーティションと難易度。あなたは、スコアゾーン他のサブテーブルウェイトラブルを使用している場合。

b)は、パーティショニングの実装では、ルートは、通常のテーブルには違いはありません構築し、コードが透明でオフ終了、パーティションテーブルの確立、比較的簡単です。

MySQLのスコアシート、および分割接続とは何ですか?

1。向上させることができ、高mysqlの、高同時パフォーマンスで良好な状態があります。

2。サブパーティションテーブルではなく、矛盾、訪問の大きな数、およびより多くのテーブルデータテーブルのために互いに協力することができ、我々はサブパーティションテーブルと小さなトラフィックの組み合わせの形態が、表データテーブルの多くを取ることができ、我々それはとても上のパーティションの形をとるとことがあります。

3.技術的なサブテーブルがあまりにも面倒で、手動で子テーブルを作成する必要があり、アプリケーションサーバは、読んで、あなたが子テーブルの名前を計算する必要があるときに書き込みます。使用して、より良いマージするだけでなく、設定するには、子テーブルと子テーブルの間に作成組合関係を。
4.パーティションテーブルに対して、便利な操作、サブテーブルを作成する必要のあるサブテーブルを。

 

MySQLの特性を覚えておいてください:、テーブルロックを引き起こす同時パフォーマンスに影響します非プライマリキーの更新の同時使用のパフォーマンスを向上させるために、他のデータには影響しません、更新行ロックを主キーの更新をされ使用して、テーブルと行ロックがあります。

おすすめ

転載: www.cnblogs.com/emmetyang/p/11204166.html