Mycat之——枚举分片
来源:互联网 发布:丸子是个好女孩知乎 编辑:程序博客网 时间:2024/06/05 20:15
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/77096144
一、简单描述
今天,我们就一起来看下Mycat中的枚举分片,所谓的枚举分片,就是通过在配置文件中配置可能的枚举id,自己配置分片,本规则适用于特定的场景,比如有些业务需要按照省份或区县来做保存,而全国省份区县固定的,具体使用场景可根据自己具体的业务场景确定。
二、实现枚举分片
1、配置rule.xml
在rule.xml添加如下配置:
<!-- mapFile标识配置文件名称 type默认值为0(0表示Integer,非零表示String) 默认节点的作用:枚举分片时,如果碰到不识别的枚举值,就让它路由到默认节点 --> <function name="hash-int-customer" class="org.opencloudb.route.function.PartitionByFileMap"> <property name="mapFile">partition-hash-int.txt</property> <property name="defaultNode">0</property> <property name="type">0</property></function><tableRule name="tr-hash-int-customer"> <rule> <columns>province</columns> <algorithm>hash-int-customer</algorithm> </rule></tableRule>
2、创建partition-hash-int.txt文件
内容如下:
10000=0 10010=1
3、配置schema.xml
<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://org.opencloudb/" ><schema name="lyzdb" checkSQLschema="false" sqlMaxLimit="100"><!-- global table is auto cloned to all defined data nodes ,so can join with any table whose sharding node is in the same data node --><table name="t_order" primaryKey="id" dataNode="dn1,dn2" rule="tr-hash-int-customer"/></schema><!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743" /> --><dataNode name="dn1" dataHost="localhost1" database="db1" /><dataNode name="dn2" dataHost="localhost1" database="db2" /><!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" /> <dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" /> <dataNodename="jdbc_dn2" dataHost="jdbchost" database="db2" /> <dataNode name="jdbc_dn3" dataHost="jdbchost" database="db3" /> --><dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat><!-- can have multi write hosts --><writeHost host="hostM1" url="192.168.209.137:3306" user="root" password="root"></writeHost><!--<writeHost host="hostS1" url="localhost:3316" user="root"--><!--password="123456" />--><!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> --></dataHost></mycat:schema>至此,Mycat的配置工作就完成了,下面我们就一起来测试下Mycat的枚举分片功能。
三、测试
1、建表并且录入数据
mysql> explain CREATE TABLE t_order (ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,PROVINCE INT,SN VARCHAR(64),CREATE_TIME DATETIME);+-----------+--------------------------------------------------------------------------------------------------------------------+| DATA_NODE | SQL |+-----------+--------------------------------------------------------------------------------------------------------------------+| dn1 | CREATE TABLE t_order (ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,PROVINCE INT,SN VARCHAR(64),CREATE_TIME DATETIME) || dn2 | CREATE TABLE t_order (ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,PROVINCE INT,SN VARCHAR(64),CREATE_TIME DATETIME) |+-----------+--------------------------------------------------------------------------------------------------------------------+2 rows in set (0.09 sec)mysql>mysql> CREATE TABLE t_order (ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,PROVINCE INT,SN VARCHAR(64),CREATE_TIME DATETIME);Query OK, 0 rows affected (0.19 sec)mysql> explain INSERT INTO t_order (ID,PROVINCE,SN,CREATE_TIME) VALUES(1,10000,'beijing_10001_10000',NOW());+-----------+----------------------------------------------------------------------------------------------+| DATA_NODE | SQL |+-----------+----------------------------------------------------------------------------------------------+| dn1 | INSERT INTO t_order (ID,PROVINCE,SN,CREATE_TIME) VALUES(1,10000,'beijing_10001_10000',NOW()) |+-----------+----------------------------------------------------------------------------------------------+1 row in set (0.07 sec)mysql> INSERT INTO t_order (ID,PROVINCE,SN,CREATE_TIME) VALUES(1,10000,'beijing_10001_10000',NOW());Query OK, 1 row affected (0.11 sec)mysql> explain INSERT INTO t_order (ID,PROVINCE,SN,CREATE_TIME) VALUES(2,10010,'tianjin_10010',NOW());+-----------+----------------------------------------------------------------------------------------+| DATA_NODE | SQL |+-----------+----------------------------------------------------------------------------------------+| dn2 | INSERT INTO t_order (ID,PROVINCE,SN,CREATE_TIME) VALUES(2,10010,'tianjin_10010',NOW()) |+-----------+----------------------------------------------------------------------------------------+1 row in set (0.00 sec)mysql> INSERT INTO t_order (ID,PROVINCE,SN,CREATE_TIME) VALUES(2,10010,'tianjin_10010',NOW());Query OK, 1 row affected (0.04 sec)Mycat日志如下:
NCREMENT PRIMARY KEY,PROVINCE INT,SN VARCHAR(64),CREATE_TIME DATETIME), route={ 1 -> dn1{CREATE TABLE t_order (ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,PROVINCE INT,SN VARCHAR(64),CREATE_TIME DATETIME)} 2 -> dn2{CREATE TABLE t_order (ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,PROVINCE INT,SN VARCHAR(64),CREATE_TIME DATETIME)}} rrs 08/10 13:38:09.330 DEBUG [$_NIOREACTOR-0-RW] (NonBlockingSession.java:113) -ServerConnection [id=1, schema=lyzdb, host=192.168.209.1, user=lyz,txIsolation=3, autocommit=true, schema=lyzdb]INSERT INTO t_order (ID,PROVINCE,SN,CREATE_TIME) VALUES(1,10000,'beijing_10001_10000',NOW()), route={ 1 -> dn1{INSERT INTO t_order (ID,PROVINCE,SN,CREATE_TIME) VALUES(1,10000,'beijing_10001_10000',NOW())}} rrs 08/10 13:39:45.878 DEBUG [$_NIOREACTOR-0-RW] (NonBlockingSession.java:113) -ServerConnection [id=1, schema=lyzdb, host=192.168.209.1, user=lyz,txIsolation=3, autocommit=true, schema=lyzdb]INSERT INTO t_order (ID,PROVINCE,SN,CREATE_TIME) VALUES(2,10010,'tianjin_10010',NOW()), route={ 1 -> dn2{INSERT INTO t_order (ID,PROVINCE,SN,CREATE_TIME) VALUES(2,10010,'tianjin_10010',NOW())}} rrs由此可见,创建表的时候,Mycat是将SQL路由到所有的数据节点;录入数据的时候,是根据分片字段将数据路由到指定的数据分片节点;
2、按照分片字段查询
mysql> explain select * from t_order where PROVINCE=10000;+-----------+--------------------------------------------------------+| DATA_NODE | SQL |+-----------+--------------------------------------------------------+| dn1 | SELECT * FROM t_order WHERE PROVINCE = 10000 LIMIT 100 |+-----------+--------------------------------------------------------+1 row in set (0.40 sec)Mycat日志如下:
08/10 13:42:02.586 DEBUG [$_NIOREACTOR-0-RW] (EnchachePool.java:76) -SQLRouteCache miss cache ,key:lyzdb select * from t_order where PROVINCE=1000008/10 13:42:02.987 DEBUG [$_NIOREACTOR-0-RW] (EnchachePool.java:59) -SQLRouteCache add cache ,key:lyzdb select * from t_order where PROVINCE=10000 value:select * from t_order where PROVINCE=10000, route={ 1 -> dn1{SELECT *FROM t_orderWHERE PROVINCE = 10000LIMIT 100}}由此可见,执行简单的查询,如果指定分片字段ID字段,则走分片查询单个分片节点
3、按照分片字段范围查询
mysql> explain select * from t_order where PROVINCE >= 10000;+-----------+---------------------------------------------------------+| DATA_NODE | SQL |+-----------+---------------------------------------------------------+| dn1 | SELECT * FROM t_order WHERE PROVINCE >= 10000 LIMIT 100 || dn2 | SELECT * FROM t_order WHERE PROVINCE >= 10000 LIMIT 100 |+-----------+---------------------------------------------------------+2 rows in set (0.00 sec)Mycat日志如下:
08/10 13:43:07.238 DEBUG [$_NIOREACTOR-0-RW] (EnchachePool.java:59) -SQLRouteCache add cache ,key:lyzdb select * from t_order where PROVINCE >= 10000 value:select * from t_order where PROVINCE >= 10000, route={ 1 -> dn1{SELECT *FROM t_orderWHERE PROVINCE >= 10000LIMIT 100} 2 -> dn2{SELECT *FROM t_orderWHERE PROVINCE >= 10000LIMIT 100}}由此可见,如果分片字段范围的查询,则走所有节点去检索,哪怕只有一条数据在一个分片上,route路由也是走所有的分片进行检索查询
4、按照非分片字段查询
mysql> explain select * from t_order where sn = 'tianjin_10010';+-----------+------------------------------------------------------------+| DATA_NODE | SQL |+-----------+------------------------------------------------------------+| dn1 | SELECT * FROM t_order WHERE sn = 'tianjin_10010' LIMIT 100 || dn2 | SELECT * FROM t_order WHERE sn = 'tianjin_10010' LIMIT 100 |+-----------+------------------------------------------------------------+2 rows in set (0.00 sec)Mycat日志如下:
08/10 13:45:01.416 DEBUG [$_NIOREACTOR-0-RW] (EnchachePool.java:59) -SQLRouteCache add cache ,key:lyzdb select * from t_order where sn = 'tianjin_10010' value:select * from t_order where sn = 'tianjin_10010', route={ 1 -> dn1{SELECT *FROM t_orderWHERE sn = 'tianjin_10010'LIMIT 100} 2 -> dn2{SELECT *FROM t_orderWHERE sn = 'tianjin_10010'LIMIT 100}}由此可见,如果不走分片字段的查询,即使是单个数据,也要route路由所有的分片,走所有的分片进行查询
阅读全文
1 0
- Mycat之——枚举分片
- MyCAT常用分片规则之分片枚举
- MyCAT常用分片规则之分片枚举
- Mycat之——取模分片
- mycat 离散分片 -> 枚举分片
- mycat 离散分片(枚举分片)
- Mycat之——数据分片入门实战
- Mycat之——自定义数字范围分片
- Mycat之——按日期(天)分片
- Mycat之——程序指定分区分片
- Mycat系列—Mysql分片的配置
- Mycat系列—常用的分片规则
- mycat之按日期分片
- Mycat之——读写分离+垂直切分+水平切分+er分片+全局表 测试
- mycat分片
- MySQL之Mycat月分片方法
- Mycat学习实战-Mycat分片
- mycat分片JOIN,分片规则
- 周志华《机器学习》笔记:第2章 模型估计与选择
- Java关键字之synchronized
- webviewJavascriptBridge奇葩错误记录
- 接口抽象类
- 第三方登录功能的实现
- Mycat之——枚举分片
- 基环外向树dp
- Windows hosts文件路径
- Android 底部导航栏(底部Tab)最佳实践
- uCOS-II源码下载及源码目录结构
- android drawable下自定义的xml文件各种形式汇总
- sqlserver 数据库写hql语句时,联合查询查的语句要用括号括起来!
- Codevs1169:传纸条——题解
- Atmega32最简单的按键程序