一、Mycat和Sharding-jdbc的区别
1)mycat是一个中间件的第三方应用,sharding-jdbc是一个jar包
2)使用mycat时不需要改代码,而使用sharding-jdbc时需要修改代码
Mycat(proxy
Sharding-jdbc(TDDL
二、Mycat分片join
在前面的文章MysqL系列四:数据库分库分表基础理论中,已经说过分库分表需要应对的技术难题有如下几个:
1.)分布式全局唯一id
2.)分片规则和策略
3.)跨分片技术问题
4.)跨分片事物问题
下面我们来看一下Mycat是如何解决跨分片技术问题——分片join的
1. 使用全局表方式解决跨分片join问题
1.1 先在server.xml里面全局表一致性检测
1.2 在schema.xml里面配置全局表
全局表说明:
1)全局表的插入、更新操作会实时在所有节点上执行,保持各个分片数据的一致性
3)全局表可以跟任何一个表进行join操作
2. 使用Share Join方式解决跨分片join问题
Share Join是一个简单的跨分片join,基于HBT(Human Brain Tech)的方式实现。
sql语句,拆分成单表的sql语句执行,然后把各个节点的数据汇集。
示例:
说明:支持两张分片表的Join,如果要支持多张表需要自己改造程序代码或者改造Mycat的源代码
对应Mycat源码:
io.mycat.catlets.ShareJoin
io.mycat.catlets.Catlet public class ShareJoin implements Catlet
3. 使用ER Join方式解决跨分片join问题
ER表也叫父子表,子表存储在哪个分片上依赖于父表的存储位置,并且和父表存储同一个分片上,即子表的记录与所关联的父表记录存放在同一个数据分片上,从而解决跨库join的问题在schema.xml里面的配置
说明:
childTable:标签用来声明子表:
joinKey:声明子表的那个字段和父表关联
parentKey:声明父表的关联主键
primaryKey:父表自身的主键
三、Mycat分页中的坑
Mycat分页的大坑一定要注意:
在对应的分片上去查询分页数据的时候是从第一条记录开始扫描,然后再取出对应的分页数据,如
这个sql语句被Mycat转化后
优化:
1)先查出id
这个sql语句被mycat转化后
2) 拿到所有的id以后再取获取需要的数据
这个sql语句被mycat转化后
四、Mycat注解
1. Mycat不支持的sql语句:
1) 某些sql语法,如insert into......select.....
2) 跨库关联查询
3)存储过程创建
4)存储过程调用
所以Mycat提供Mycat注解来解决上面这些不支持的sql语句
解决办法:Mycat注解
语法:
/*mycat:sql=Mycat注解sql语句*/真正执行的sql
/*mycat:sql=Mycat注解sql语句*/真正执行的sql
/*mycat:sql=Mycat注解sql语句*/真正执行的sql
使用mycat不支持的sql替换mycat支持的sql,运行Mycat不支持的sql
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) 能不用注解的尽量不用
2. Mycat注解解决不支持insert into......select.....
3. Mycat注解创建表
4. Mycat注解创建存储过程
5. Mycat注解调用存储过程
6. Mycat注解读写分离数据源选择
五、Catlet使用
通过Catlet支持跨分片复杂sql实现以及存储过程支持等等
使用方式:通过mycat注解方式来执行
1. 跨分片联合查询注解支持
2. 批量插入与ID自增长结合的支持
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。