ホームページ >データベース >mysql チュートリアル >MySQLサブデータベースとサブテーブルの分析例

MySQLサブデータベースとサブテーブルの分析例

PHPz
PHPz転載
2023-06-03 18:34:301168ブラウズ

    1. データベースをテーブルに分割する必要があるのはなぜですか? サーバーのトラフィックがますます増大し、より多くのリクエストに直面しているため、データベースを分割しました。読み取りと書き込み、読み取りを担当する複数のスレーブ データベース コピー (スレーブ) の使用、書き込みを担当するマスター データベース (マスター) の使用 (マスターとスレーブ) データの一貫性を維持するためのマスター/スレーブ レプリケーションによって同期データ更新が実現されます。 。スレーブ データベースは水平方向に拡張できるため、読み取りリクエストが増えても問題ありません

    しかし、ユーザー レベルが上がり、書き込みリクエストがますます増えた場合、データベースの負荷を十分に確保するにはどうすればよいでしょうか?マスターを追加しても問題は解決できません。データの一貫性が必要であり、書き込み操作には 2 つのマスター間の同期が必要であり、これは複製に相当し、アーキテクチャ設計がより複雑になります。

    現時点では、サブデータベースのパーティショニング テーブル (シャーディング) を使用し、ライブラリとテーブルを異なる MySQL サーバーに保存する必要があり、各サーバーは書き込みリクエストの数のバランスを取ることができます

    2. 大きすぎるライブラリ テーブルによって引き起こされる問題

    単一データベースは大きすぎます: 単一データベースでは処理能力が限られており、サーバー上のディスク領域が不十分で、IO ボトルネックが発生しています。単一データベースをより多くの小さなデータベースに分割する必要があります

    • 単一テーブルが大きすぎます: CURD 効率が非常に低いです。

      データ量が多すぎるため、インデックス ファイルが大きくなりすぎ、ディスク IO のロードに時間がかかります。インデックスが削除され、クエリ タイムアウトが発生します。したがって、インデックスを使用するだけでは十分ではなく、単一のテーブルをより小さなデータ セットを含む複数のテーブルに分割する必要があります。 MyCat が提供するテーブル分割アルゴリズムはすべて Rule.xml に含まれており、時間に基づく分割、コンシステント ハッシュ、主キーを直接使用して分割テーブルの数を剰余するなど、さまざまなテーブル分割アルゴリズムに従って分割できます。
    • 分割戦略

    単一データベースは大きすぎます。まず、テーブルが多すぎるか、データが多すぎるかを検討してください。

    If テーブルが多すぎるためにデータが多すぎる場合は、垂直分割を使用します。つまり、ビジネスに応じてデータを異なるライブラリに分割します。 1 つのテーブル内のデータ量が大きすぎる場合は、水平分割を使用します。 分割、つまり、特定のルールに従ってテーブル データを複数のテーブルに分割します (テーブル分割アルゴリズムはルールで定義されています。最初に垂直分割を検討し、次に水平分割を検討します

      3. 垂直分割
    • #サブデータベース、サブテーブル、読み書き分離は一緒に実行できます

      ##1 . 垂直サブライブラリ
    • server.xml

      <user name="root">
      <property name="password">123456</property>
      <property name="schemas">USERDB1,USERDB2</property>
      </user>

      は 2 つの論理ライブラリ USERDB1 および USERDB2 で構成されています
    schema.xml

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    	<!-- 逻辑数据库 -->
    	<schema name="USERDB1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1" /> <!-- 两个逻辑库对应两个不同的数据节点 -->
    	<schema name="USERDB2" checkSQLschema="false" sqlMaxLimit="100"dataNode="dn2" />
    	<!-- 存储节点 -->
    	<dataNode name="dn1" dataHost="node1" database="mytest1" />  <!-- 两个数据节点对应两个不同的物理机器 -->
    	<dataNode name="dn2" dataHost="node2" database="mytest2" />  <!-- USERDB1对应mytest1,USERDB2对应mytest2 -->
    	<!-- 数据库主机 -->
    	<dataHost name="node1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
    		<heartbeat>select user()</heartbeat>
    		<writeHost host="192.168.131.129" url="192.168.131.129:3306" user="root" password="123456" />
    	</dataHost>
    	
    	<dataHost name="node2" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native">
    		<heartbeat>select user()</heartbeat>
    		<writeHost host="192.168.0.6" url="192.168.0.6:3306" user="root" password="123456" />
    	</dataHost>
    </mycat:schema>
    2 つの異なるデータ ノードに対応し、2 つのデータ ノードは以下に対応します。 2 つの異なる物理マシン

    mytest1 と mytest2 は、異なるマシン上の異なるライブラリに分割されており、それぞれにパーツが含まれています 元々は 1 つのマシンに統合されていたテーブルが、現在は垂直に分割されています。

    クライアントは異なる論理ライブラリに接続する必要があります。業務運用に応じて異なる論理ライブラリが使用されます。

    次に、2 つの書き込みライブラリが構成され、2 台のマシンが使用されます。ライブラリを保存します。均等に分割され、元の単一マシンの圧力を共有します。データベース シャーディングにはテーブル シャーディングが伴い、テーブルはビジネスの観点から分割されます

    2.垂直テーブル シャーディング

    垂直テーブル シャーディングは列フィールドに基づいています。通常、クエリ中に大量のデータが原因で発生する「クロスページ」問題を回避するために、数百の列を持つ大きなテーブルに使用されます。

    一般に、テーブルには多くのフィールドがあり、一般的に使用されない、データが大きい、長いフィールド (テキスト タイプ フィールドなど) は拡張テーブルに分割されます。アクセス頻度の高いフィールドは別のテーブルに配置されますMySQLサブデータベースとサブテーブルの分析例

    4. 水平サブデータベースとテーブル


    膨大な量のデータを含む単一のテーブル (注文テーブルなど) の場合、特定のルール (RANGE、HASH 係数など) に従って複数のテーブルに分割されます。テーブルがまだ同じデータベース内にあるため、データベース全体に対する操作を実行する際に IO ボトルネックが発生する可能性があるため、推奨されません。

    単一テーブルのデータを複数のサーバーに分散し、各サーバーがテーブルの一部を所有します。とライブラリですが、テーブル内のデータ収集が異なります。サブデータベースとサブテーブルのテクノロジーを適用すると、単一マシンと単一データベースのパフォーマンスのボトルネックとプレッシャーを効果的に軽減でき、IO、接続数、ハードウェア リソースなどに関連する制限も突破できます。MySQLサブデータベースとサブテーブルの分析例

    サブデータベーステーブルのシャーディングはマスター/スレーブレプリケーションと同時に実行できますが、マスター/スレーブレプリケーションに基づいていません。読み取り/書き込みの分離はマスター/スレーブレプリケーションに基づいています

    server.xml

    <user name="root">
    	<property name="password">123456</property>
    	<property name="schemas">USERDB</property>
    </user>

    schema.xml

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    	<!-- 逻辑数据库 -->
    	<schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100">
    		<table name="user" dataNode="dn1" /> <!-- 这里的user和student都是实际存在的物理表名 -->
    		<table name="student" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2" rule="mod-long"/>
    	</schema>
    	<!-- 存储节点 -->
    	<dataNode name="dn1" dataHost="node1" database="mytest1" />
    	<dataNode name="dn2" dataHost="node2" database="mytest2" />
    	<!-- 数据库主机 -->
    	<dataHost name="node1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
    		<heartbeat>select user()</heartbeat>
    		<writeHost host="192.168.131.129" url="192.168.131.129:3306" user="root" password="123456" />
    	</dataHost>
    	<dataHost name="node2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
    		<heartbeat>select user()</heartbeat>
    		<writeHost host="192.168.0.6" url="192.168.0.6:3306" user="root" password="123456" />
    	</dataHost>
    </mycat:schema>

    user は通常のテーブルを表し、データ ノード dn1 に直接配置され、マシンです。このテーブルは分割する必要はありません。

    student テーブル PrimaryKey は ID です。ID に従って分割され、dn1 と dn2 に配置されます。最終的に、このテーブルは 2 つに分割されますこれらのマシンは物理的には分離されていますが、論理的には依然として 1 つです。どのテーブルに追加する必要がありますか? 2 で、各マシンでこれらの操作をクエリおよびマージする方法は、mycat によって完了します。

    分割ルールは、モジュロ (mod - long) であり、各挿入では ID モジュロ (2) に存在するマシンの数が使用されますさらに、rule.xml

    で次の分割アルゴリズムを構成する必要があります。

    アルゴリズム mod-long を見つけます。論理テーブル Student を 2 つのホストに個別にマッピングするため、変更されたデータ ノードの数は 2

    MySQLサブデータベースとサブテーブルの分析例

    2 です。テスト レベル Sub -table

    Linux ホスト

    MySQLサブデータベースとサブテーブルの分析例

    ##Windows ホスト

    MySQLサブデータベースとサブテーブルの分析例##mycat の 8066 ポートにログインします

    MySQLサブデータベースとサブテーブルの分析例MyCat を使用してユーザー テーブルに 2 つのデータを挿入します

    MySQLサブデータベースとサブテーブルの分析例schema.xml 構成ファイルでは、論理テーブル ユーザーは Linux ホストの mytest1 ライブラリにのみ存在します mycat によって操作される論理テーブル ユーザーは、Linux ホスト上の物理テーブルに影響しますが、Windows ホスト上のテーブルには影響しません。 Linux ホストと Windows ホストのユーザー テーブルをそれぞれ表示します。

    MySQLサブデータベースとサブテーブルの分析例

    MySQLサブデータベースとサブテーブルの分析例次に、MyCat を通じて Student テーブルに 2 つのデータを挿入します。

    MySQLサブデータベースとサブテーブルの分析例schema.xml 構成ファイルでは、論理テーブル Student が 2 つのホスト上の 2 つのライブラリ mytest1 および mytest2 内の 2 つのテーブルに対応していることがわかっています。論理テーブルに挿入されたデータは、実際には 2 つの物理テーブルに影響します (どの物理テーブルに挿入するかを決定するには、

    id%マシン番号

    を使用します)。 Linux ホストと Windows ホストの Student テーブルをそれぞれ確認してみましょう:

    MySQLサブデータベースとサブテーブルの分析例 次に、MyCat を介して id=3 と id=4 のデータを挿入します。これらは別の物理テーブルに挿入される必要があります。

    MySQLサブデータベースとサブテーブルの分析例

    MySQLサブデータベースとサブテーブルの分析例これは、student テーブルを水平方向に分割するのと同じです。

    MyCat を通じてクエリを実行する場合、通常 入力するだけです。テーブルを分割してこれら 2 つのデータ ノードに配置するように設定しました。MyCat は、設定に従って 2 つのデータベース上のデータをクエリおよびマージします。

    以上がMySQLサブデータベースとサブテーブルの分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。