MyCatクロスライブラリクエリスキーム

32085 ワード

Mycatライブラリ間クエリーのソリューション
1.グローバル・テーブルの使用
1.1グローバル・テーブルを使用するビジネスの特徴:
  • データ変動が頻繁ではない
  • データ全体の変化は大きくない
  • データ規模は大きくなく、数十万件を超える記録は少ない
  • 1.2グローバルテーブルの特性:
  • グローバルテーブルの挿入、更新操作はリアルタイムですべてのノードで実行され、各スライスノードデータの一貫性を保つ
  • グローバルテーブルのクエリー操作は、1つのノードからのみ取得
  • グローバルテーブルはいずれのテーブルともJOIN操作を行うことができる
  • 注意:データの更新はmycatに接続することで行うべきです.そうしないと、各ノード間のデータが一致しません.
    1.3 schema.xml構成
    
    
    <mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="Test" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
     <table name="tenant" primaryKey="tenant_id" autoIncrement="true" dataNode="dn1,dn2" type="global"  />
    
    schema>
    
    <dataNode name="dn1" dataHost="host1" database="interface"/>
    <dataNode name="dn2" dataHost="host2" database="platform" />
    <dataNode name="hzero_mdm" dataHost="host2" database="hzero_mdm" />
    <dataHost balance="3" maxCon="1000" minCon="10" name="host1" writeType="0" switchType="1" dbType="mysql" dbDriver="native">
         <heartbeat>select user()heartbeat>
         <writeHost host="192.168.56.127" url="192.168.56.127:3306" password="123456" user="root"/>
    dataHost>
    
    <dataHost balance="3" maxCon="1000" minCon="10" name="host2" writeType="0" switchType="1" dbType="mysql" dbDriver="native">
         <heartbeat>select user()heartbeat>
         <writeHost host="192.168.56.127" url="192.168.56.127:3306" password="123456" user="root"/>
    dataHost>
    mycat:schema>
    

    1.4 dn 1とdn 2の両方でtenantテーブルのDDL文を実行する
    CREATE TABLE `tenant` (
      `tenant_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ' ID,  ,       ',
      `tenant_num` varchar(30) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '    '
    ) ENGINE=InnoDB AUTO_INCREMENT=180146 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='    ';
    

    1.5ライブラリ間クエリーsqlテスト
     SELECT
        sms.monitor_system_id,
        sms.tenant_id,
        hpht.tenant_name,
        sms.external_system_code,
        sms.enabled_flag,
        sms.object_version_number
    FROM
        monitor_system sms
    LEFT JOIN
        tenant hpht
    ON
        sms.tenant_id = hpht.tenant_id 
    

    2.ER Joinの使用
    2.1 ER Joinを使用したビジネスシーン
    MyCATはNewSQL分野の新秀Foundation DBの設計構想を参考にして、Foundation DBは革新的にTable Groupの概念を提出して、それはサブテーブルの記憶位置をメインテーブルに依存して、しかも物理的に隣接して保存するので、JIONの効率と性能の問題を徹底的に解決して、この構想に基づいて、E-R関係に基づくデータのスライス戦略を提出しました.サブテーブルのレコードは、関連する親テーブルのレコードと同じデータスライスに格納されます.
    2.2 ER JOinの特徴
    2つのテーブルの間には親子テーブル関係があり、プライマリテーブルデータとワードテーブルデータはいずれも1つのノードにあります.
    2.3 schema.xml構成
    <table name="customer" dataNode="dn1,dn2" rule="sharding-by-intfile">
        <childTable name="orders" joinKey="customer_id" parentKey="id"/>
    

    2.4ライブラリ間クエリーsqlテスト
    select c.*,o.* from customer join orders on c.id = o.customer_id
    

    3.Share Joinの使用
    3.1 Shar Joinを使用したビジネスシーン
    ジョインを必要とするテーブルのデータ量が多い
    グローバル・テーブルを使用すると、各ノードのデータが一致することは保証されません.
    3.2 schema.xml構成
    
    
    <mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="Test" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
    <table name="tenant" primaryKey="tenant_id" autoIncrement="true" dataNode="dn2"  />
    schema>
    
    <dataNode name="dn1" dataHost="host1" database="interface"/>
    <dataNode name="dn2" dataHost="host2" database="platform" />
    <dataNode name="hzero_mdm" dataHost="host2" database="hzero_mdm" />
    <dataHost balance="3" maxCon="1000" minCon="10" name="host1" writeType="0" switchType="1" dbType="mysql" dbDriver="native">
         <heartbeat>select user()heartbeat>
         <writeHost host="192.168.56.127" url="192.168.56.127:3306" password="123456" user="root"/>
    dataHost>
    
    <dataHost balance="3" maxCon="1000" minCon="10" name="host2" writeType="0" switchType="1" dbType="mysql" dbDriver="native">
         <heartbeat>select user()heartbeat>
         <writeHost host="192.168.56.127" url="192.168.56.127:3306" password="123456" user="root"/>
    dataHost>
    mycat:schema>
    
    

    3.3ライブラリ間クエリーsqlテスト
    
    /*!mycat:catlet=io.mycat.catlets.ShareJoin */ 
     SELECT
              sms.monitor_system_id,
              sms.tenant_id,
              hpht.tenant_name,
              sms.external_system_code,
              sms.enabled_flag,
              sms.object_version_number
            FROM
              monitor_system sms       
            LEFT JOIN
              tenant hpht
            ON
              sms.tenant_id = hpht.tenant_id 
    

    このスキームの特徴は,sqlにmycatの注釈を加える必要があることであるが,グローバルテーブルを用いることでデータ量が大きすぎたり,各ノードのデータが一致しなかったりすることを避けることができる.