Mycat 中的 JOIN

性能建议:

尽量避免使用 Left join 或 Right join,而用 Inner join 在使用 Left join 或 Right join 时, ON 会优先执行, where 条件在最后执行,所以在使用过程中,条件尽可能的在 ON 语句中判断,减少 where 的执行。

少用子查询,而用 join。

Mycat 目前版本支持跨分片的 join,主要实现的方式有四种:全局表, ER 分片, catletT(人工智能)和 ShareJoin, ShareJoin 在开发版中支持,前面三种方式 1.3.0.1 支持 。

1. 全局表

一个真实的业务系统中,往往存在大量的类似字典表的表格,它们与业务表之间可能有关系,这种关系,可以理解为“标签” ,而不应理解为通常的“主从关系” ,这些表基本上很少变动。

考虑到字典表具有以下几个特性:
• 变动不频繁
• 数据量总体变化不大
• 数据规模不大,很少有超过数十万条记录。
鉴于此, MyCAT 定义了一种特殊的表,称之为“全局表” ,全局表具有以下特性:
• 全局表的插入、更新操作会实时在所有节点上执行,保持各个分片的数据一致性
• 全局表的查询操作,只从一个节点获取
• 全局表可以跟任何一个表进行 JOIN 操作

全局表的配置如下:

<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />

2. ER Join

MyCAT 借鉴了 NewSQL 领域的新秀 Foundation DB 的设计思路, Foundation DB 创新性的提出了 Table Group 的概念,其将子表的存储位置依赖于主表,并且物理上紧邻存放,因此彻底解决了 JION 的效率和性能问题,根据这一思路,提出了基于 E-R 关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上。

customer 采用 sharding-by-intfile 这个分片策略,分片在 dn1,dn2 上, orders 依赖父表进行分片,两个表的关联关系为 orders.customer_id=customer.id。于是数据分片和存储的示意图如下

配置示例:

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

3. Share join

ShareJoin 是一个简单的跨分片 Join,基于 HBT 的方式实现。
目前支持 2 个表的 join,原理就是解析 SQL 语句,拆分成单表的 SQL 语句执行,然后把各个节点的数据汇集

支持任意配置的两个表,如:

<table name="A" dataNode="dn1 " rule="auto-sharding-long" />
<table name="B" dataNode=" dn2,dn3" rule="auto-sharding-long" />

上面的配置是官方文档中的示例,但是我试的时候,连 mycat 都启动不起来。把这两个配置中的 rule 去掉,加上 primaryKey="id" autoIncrement="true" , mycat 可以启动,但是运行这两个表的 join 查询,会抛错。

4. catlet(人工智能)
   mycat 提供了一些接口,需要自己定逻辑怎么把不同分片的表 join 起来。

原文地址:https://www.cnblogs.com/langfanyun/p/12567355.html

时间: 2024-08-30 11:15:44

Mycat 中的 JOIN的相关文章

Mycat中的核心概念

Mycat中的核心概念 1.数据库中间件 Mycat 是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有 存储引擎,所以并不是完全意义的分布式数据库系统.Mycat 是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服务.有了数据库中间件,应用只需要集中与业务处理,大量的通用的数据聚合,事务,数据源切换都由中间件来处理,中间件的性能与处理能力将直接决定应用的读写性能,所以一款好的数据库中间件至关重要. 2.逻辑库(schema) 对实际应用来说

LINQ TO SQL 中的join(转帖)

http://www.cnblogs.com/ASPNET2008/archive/2008/12/21/1358152.html join对于喜欢写SQL的朋友来说还是比较实用,也比较容易接受的东西.在LINQ TO SQL中,写多表查询,同样可以写join,只是它有它自己的语法要求而已,语义都是一样的,下面我来讲下LINQ TO SQL中的join最基本的形式:都是最简单的,当然还有其它方面的内容,如:怎样加上过滤条件,如何分组,如何排序等等,为了单纯说join的用法,这里就简化下. Cod

30秒懂SQL中的join

30秒懂SQL中的join 注:本文仅仅是本人在网上看到的比较好的文章,为了以后复习方便,就文章 完全复制下来.原文地址如下:http://www.habadog.com/ 预先生成两张测试表,并插入一下测试数据: create table t1(id int, name char(10), primary key (id)); create table t2(id int, score int, primary key (id)); insert into t1 values(1, “lucy

thread.join函数,java多线程中的join函数解析

join函数的作用,是让当前线程等待,直到调用join()的 线程结束或者等到一段时间,我们来看以下代码 1 package mian; 2 3 4 public class simpleplela { 5 static void threadMessage(String message) { 6 String threadName = 7 Thread.currentThread().getName(); 8 9 System.out.println(threadName+" "+m

Python中的join和split

时间:2014.06.11 地点:基地 ------------------------------------------------------------------------ 一.问题 多次看到python中的join了,看着不爽了,今天研究个明白,顺便也将split也关注了下.也包括os.path.join和os.path.split ------------------------------------------------------------------------ 二.

jQuery中的join方法

和JS 中的JOIN 方法一样,将一数组按照JOIN的参数连接起来.比如: var arr = [ "a", "b", "c", "d", "e" ]; document.write(arr.join("-")); 结果:a-b-c-d-e. var members=["John","Steve","Ben","Dam

BCL中String.Join的实现

在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况.比如在SQL语句的in条件中,我们通常需要把List<int>这样的对象转换为“1,2,3”这样的字符串,然后作为in的语句传进去.所以自然而然,可以通过循环的方式来拼着个字符串,于是可以写一个下面这样的通用方法: private static string GetStringFromList<T>(char seperator, IEnumerable<T> values) {

Thread中的join使用

线程中的join方法就是用来等待一个线程完成它自己的全部任务之后才开启下一个进程,join(时间),则表示线程要执行完时间范围才开始下一个工作任务的执行!比如定义join(1500)必须在执行15s后才开启下一个进程的执行,进程执行是轮训调度算法!就是可以每个进程都由可运行到运行到终止状态,直到终止状态进程才不参与调度改掉!该方法的使用可以用于线程的执行顺序! 线程池的作用就是不用创建新线程,从而具有更好的性能,并且线程池一次可以创建多个线程来进行线程调度!

python中的join、set集合、深浅拷贝

一. join 1. str中的join方法. 把列表转换成字符串 2. 列表和字典在循环的时候不能直接删除. 需要把要删除的内容记录在新列表中. 然后循环新列表.删除字典或列表 3. fromkeys() 1. 返回新字典. 对原字典没有影响 2. 后面的value.是多个key共享一个value 二. set集合 特点:无序, 不重复, 元素必须可哈希(不可变) 作用:去重复 本身是可变的数据类型. 有增删改查操作. frozenset()冻结的集合. 不可变的. 可哈希的 三. 深浅拷贝(