数据库水平切分(MyCat分片Join)

Mycat(proxy中间件层)mysql

Sharding-jdbc(TDDL为表明的应用层)sql

分片Join

1.全局表  工具

2.Share Join性能

mysql> /*!mycat:catlet=io.mycat.catlets.ShareJoin*/select * from employee a, employee_detail b where a.id = b.id;spa

目前只支持两张分片表的Join。3d

3.ER表code

<table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile">
      <childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id">
              <childTable name="order_items" joinKey="order_id"  parentKey="id" />
      </childTable>
      <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" />
 </table>

childTable标签用来声明子表:xml

joinKey:声明子表的那个字段和主表关联中间件

parentKey:声明主表的关联主键blog

primaryKey:主表自身的主键

Mycat分页

分页的大坑必定要注意:

    mysql> select *  from customer order by id limit 1000000,100;

    Mycat会分红:

       1 -> dn1{SELECT * FROM customer ORDER BY id LIMIT 0, 1000100}

       2 -> dn2{SELECT * FROM customer ORDER BY id LIMIT 0, 1000100}

开启使用非堆内存。减小内容消耗

<property name="useOffHeapForMerge">1</property>

 

Catlet使用

MyCat注解规范

  1. 注解SQL使用select语句,不容许使用delete/update/insert等语句;虽然delete/update/insert等语句也能用在注解中,但这些语句在Sql处理中有额外的逻辑判断,从性能考虑,请使用select语句。
  2. 注解SQL禁用表关联语句。
  3. 注解SQL尽可能用最简单的SQL语句,如select id from tab_a where id=’10000’(若是必要,最好能在注解中指定分片)
  4. 不管是原始SQL 仍是注解SQL,禁止DDL语句
  5. 能不用注解的尽可能不用

建立存储过程:

/*!mycat:sql=select 1 from customer*/create producer ‘test_proc()’ BEGIN END;

调用存储过程:

/*!mycat:sql=select 1 from customer*/call ‘test_proc()’;

 

Mycat管理端使用

Zookeeper工具:ZooInspector

相关文章
相关标签/搜索