Mycat 注解说明
我们知道MySQL 数据库有自己的SQL注解(hint),比如 use index、force index、ignore index 等都是会经常用到的,Mycat 作为一个数据库中间件,最重要的是 SQL 路由,所以 Mycat 中的注解基本上都是和路由功能相关。
主从路由注解
该注解用于解决MySQL 数据库的主从同步延迟的问题,由于对于数据库读写分离架构的系统,其 slave 可能会存在一定的复制延迟,在一些业务上不能接受任何延迟的 select 语句就可以使用该注解,强制其在 master 执行,主从路由注解的基本原理是根据注解的值是 master 还是 slave,分别获取对应的 writeHost 或 readHost 的数据库连接,来执行 SQL 语句,示例代码如下:
mysql> /*!mycat:db_type=slave*/select * from tb_sharding_murmur where id= 199
通过查询日志可以发现,其 hintSQLValue 值为 slave,getRunOnSlave() 为 true,表示路由到了 salve 数据库,日志如下:
2018-02-14 00:10:32.077 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.route.handler.HintMasterDBHandler.route(HintMasterDBHandler.java:45)) - schema.rrs(): select * from tb_sharding_murmur where id= 199, route={
1 -> vmDB2-tempdb{select * from tb_sharding_murmur where id= 199}
}
2018-02-14 00:10:32.077 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.route.handler.HintMasterDBHandler.route(HintMasterDBHandler.java:48)) - hintSQLValue:::::::::slave
2018-02-14 00:10:32.078 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.route.handler.HintMasterDBHandler.route(HintMasterDBHandler.java:85)) - rrs.getRunOnSlave():true
修改查询语句,指定从 master 查询,示例代码如下:
mysql> /*!mycat:db_type=master*/select * from tb_sharding_murmur where id= 199
通过查询日志可以发现,其 hintSQLValue 值为 master,getRunOnSlave() 为 false,表示路由到了 salve 数据库,日志如下:
2018-02-14 00:10:36.538 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.route.handler.HintMasterDBHandler.route(HintMasterDBHandler.java:45)) - schema.rrs(): select * from tb_sharding_murmur where id= 199, route={
1 -> vmDB2-tempdb{select * from tb_sharding_murmur where id= 199}
}
2018-02-14 00:10:36.538 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.route.handler.HintMasterDBHandler.route(HintMasterDBHandler.java:48)) - hintSQLValue:::::::::master
2018-02-14 00:10:36.538 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.route.handler.HintMasterDBHandler.route(HintMasterDBHandler.java:85)) - rrs.getRunOnSlave():false
2018-02-14 00:10:36.538 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.server.NonBlockingSession.execute(NonBlockingSession.java:110)) - ServerConnection [id=1, schema=TEMPDB, host=192.168.2.109, user=mycat,txIsolation=3, autocommit=true, schema=TEMPDB]select * from tb_sharding_murmur where id= 199, route={
1 -> vmDB2-tempdb{select * from tb_sharding_murmur where id= 199}
} rrs
2018-02-14 00:10:36.538 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.backend.mysql.nio.handler.SingleNodeHandler.execute(SingleNodeHandler.java:166)) - rrs.getRunOnSlave() false
SQL 注解
SQL 注解部分是一条SQL语句,称其为注解SQL;被注解的部分也是一条SQL语句,称为原始SQL。其原理就是用解析注解SQL的路由结果,来执行被注解的SQL语句。其处理过程是先对注解中的SQL语句进行解析,得到路由结果,然后将被注解的SQL语句在该路由结果表示的数据库分片上执行,因为注解SQL仅仅用于获取路由结果,因此一般尽量使其为一条简单的select 语句,使用分片键所在字段即可。而原始的SQL语句可以是 select、delete、update、insert、call 等
- 在指定dataNode中创建存储过程示例
- 查询指定的SQL分配到的 dataNode,通过在 SQL 语句前增加 explain 关键字,示例如下:
mysql> EXPLAIN select id from tb_sharding_murmur where id = 199;
查询结果如下:

可以看到其 dataNode 为 vmDB2-tempdb
 - 我们通过SQL注解在 vmDB2-tempdb 来创建一个存储过程,示例如下:
mysql> set autocommit=0; /* 此处必须的,SQL注解的缺陷*/
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter //
mysql> /*!mycat:sql=select id from tb_sharding_murmur where id = 199*/
-> create procedure test_sql_hint_proc()
-> begin
-> select 1;
-> end;
-> //
Query OK, 0 rows affected (0.20 sec)
mysql> set autocommit=1;
Query OK, 0 rows affected (0.00 sec)d
 - 我们直连 vmDB2-tempdb 的 MySQL,查询该数据库中是否有该存储过程,示例如下:
mysql> select name from mysql.proc where db='tempdb' and type='PROCEDURE';
查询结果如下:

 
 - 使用 SQL 注解调用指定 dataNode 上的存储过程
mysql> /*!mycat:sql=select id from tb_sharding_murmur where id = 199*/call test_sql_hint_proc();
执行结果如下:

 - 使用SQL注解来支持 insert select 语句
Mycat 是不支持 insert select 语句的,原因是该语句需要在所以分片上执行,显然对事物不好控制,例如,一个分片执行成功,而另一个分片执行失败,那么该如何处理,通过SQL注解就可以实现某一个分片的 insert select 语句,示例如下:
- 创建相同表结构的表
mysql> create table tb_sharding_murmur_cp like tb_sharding_murmur;
 - 在 mycat 中的 schema.xml 中,增加 tb_sharding_murmur_cp 的表配置,并重新加载配置
<table name="tb_sharding_murmur_cp" dataNode="vmDB1-tempdb,vmDB2-tempdb" primaryKey="id" rule="sharding-by-murmur"/>
 - 连接 mycat 执行下面的命令
mysql> set autocommit=0;
Query OK, 0 rows affected (0.02 sec)
mysql> /*!mycat:sql=select id from tb_sharding_murmur where id=199*/insert into tb_sharding_murmur_cp select * from tb_sharding_murmur;
Query OK, 3276 rows affected (0.57 sec)
Records: 3276 Duplicates: 0 Warnings: 0
mysql> set autocommit=1;
Query OK, 0 rows affected (0.00 sec)
 
 
Mycat 注解说明的更多相关文章
- Mysql系列八:Mycat和Sharding-jdbc的区别、Mycat分片join、Mycat分页中的坑、Mycat注解、Catlet使用
		
一.Mycat和Sharding-jdbc的区别 1)mycat是一个中间件的第三方应用,sharding-jdbc是一个jar包 2)使用mycat时不需要改代码,而使用sharding-jdbc时 ...
 - mycat 分页慢原理解析、mycat跨事务解惑、mycat注解调用存储过程分析
		
1结合Mycat日志,分析select * from travelrecord order by id limit100000,100 的运行过程,解释下当limit M,N中的M非常大的情况下.为什 ...
 - mycat
		
mycat系列: mycat系列-概述 Cobar的十个秘密之一 Cobar的十个秘密之二 Cobar的十个秘密之三 Cobar的十个秘密之四 Cobar的十个秘密之五 Cobar的十个秘密之六 Co ...
 - Mycat节点扩缩容及高可用集群方案
		
数据迁移与扩容实践: 工具目前从 mycat1.6,准备工作:1.mycat 所在环境安装 mysql 客户端程序. 2.mycat 的 lib 目录下添加 mysql 的 jdbc 驱动包. 3.对 ...
 - 分布式数据库中间件Mycat百亿级数据存储(转)
		
此文转自: https://www.jianshu.com/p/9f1347ef75dd 2013年阿里的Cobar在社区使用过程中发现存在一些比较严重的问题,如高并发下的假死,心跳连接的故障,只实现 ...
 - 数据库中间件MyCat学习总结(1)——MyCat入门简介
		
为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代.如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷. MyCat的目标就是:低成本 ...
 - 探讨EFCore如何优雅的实现读写分离
		
前言 我们都知道当单库系统遇到性能瓶颈时,读写分离是首要优化手段之一.因为绝大多数系统读的比例远高于写的比例,并且大量耗时的读操作容易引起锁表导致无发写入数据,这时读写分离就更加重要了. ...
 - 两种实现方式mycat多租户,枚举分片,注解拦截
		
第一种: 优点:支持进一步分片 缺点:schema配置繁琐 注解式 /*!mycat:schema=[schemaName] */ 注意:这在navicat 里面是会报错的,请用命令行登陆myc ...
 - mycat 概述
		
从开始接触mycat,到现在为止也有三个多月的时间了,目前在测试环境中已经初步应用!大概可以总结一下了 mycat是一个数据库中间件,也可以理解为是数据库代理.在架构体系中是位于数据库和应用层之间的一 ...
 
随机推荐
- spider RPC更新至2.0.0-RELEASE
			
spider使用java语言开发,使用Spring作为IoC容器,采用TCP/IP协议,在此基础上,结合SaaS金融交易系统的特性进行针对性和重点设计,以更加灵活和高效的满足金融交易系统多租户.高可用 ...
 - CSS盒模型的深度思考及BFC
			
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 题目:谈一谈你对CSS盒模型的认识 专业的面试,一定会问 CSS 盒模型 ...
 - UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 52: invalid continuation byte
			
代码: df_w = pd.read_table( r'C:\Users\lab\Desktop\web_list_n.txt', sep=',', header=None) 当我用pandas的re ...
 - R语言︱画图
			
笔者寄语:不论画啥,你先plot准没错. plot 二维坐标绘图 dotchart 点图 barplot 条形图 hist 直方图 pie 饼图 points 添加点 lines 添加线 text 添 ...
 - R语言︱数据集分组、筛选(plit – apply – combine模式、dplyr、data.table)
			
R语言︱数据集分组 大型数据集通常是高度结构化的,结构使得我们可以按不同的方式分组,有时候我们需要关注单个组的数据片断,有时需要聚合不同组内的信息,并相互比较. 一.日期分组 1.关于时间的包都有很多 ...
 - Caused by: org.xml.sax.SAXParseException; lineNumber: 28; columnNumber: 81;
			
1.错误描述 严重: Exception sending context initialized event to listener instance of class org.springframe ...
 - 美团CodeM复赛 02,03
			
02 城市网络 比赛时候写的是单调栈,真的是让人见笑了,基本思路就是dfs时候动态处理单调栈(带回溯),然后离线处理答案.题解是用了倍增的,效率高很多 #include <cstdio> ...
 - Halcon算子--区域特征
			
当我们想要提取Region时,图像处理后,往往存在几个类似的Region,此时,需要根据Region的一些特殊特征,来选择指定的Region. 求Region指定特征值:region_features ...
 - WPF基础篇之系统中141种颜色
			
WPF最大的特点就是酷炫的外观,在学习过程中经常看见各种渐变窗体.作为几乎没做过美工的程序员,我对各种颜色的argb值不熟,颜色的英文单词也只认识部分.为了不至于每次都用Colors点出颜色再随机挑选 ...
 - C# 高效字符串连接 StringBuilder介绍
			
在介绍StringBuilder之前,必须要先了解string的特性. string在.NET中属于基本数据类型,也是基本数据类型中唯一的引用类型.字符串可以声明为常量,但它却放在了堆中. 一:不可改 ...