”tbxxx" dataNode="transDN0" ruleRequired=”false”/
rule.xml
分库分表规则配置,其中columns,dbRuleList,tbRuleList里面的列名要保持大写
首先先上一个整体配置 "rule1">
TRANS_ID
#set($end=$TRANS_ID.length() - 1)##
$stringUtil.substring($TRANS_ID,$start,$end)]]>
$stringUtil.substring($TRANS_ID,$start)]]>
def map = [:];
for (int i=0; i<10; i++) {
def list = [];
for (int j=0; j<10; j++) {
list.add(i+""+j);
}
map.put(i,list);
};
return map;
]]>
其中dbRuleList 为分库规则
#set($end=$TRANS_ID.length() - 1)##
$stringUtil.substring($TRANS_ID,$start,$end)]]>
分库规则dbRuleList可以有多个dbRule,当第一个不满足时,可以用第二个,当然这个效率不好,如果有规则区分,尽量再写一个rule,
dbRule 最后的结果是表的前缀
比如分库分表 库名为db0-db9,那么这个dbRule渲染时
取到TRANS_ID 这个为后,在脚本里计算出取倒数第2位为库后缀
比如上图的分库为
分表规则配置 $stringUtil.substring($TRANS_ID,$start)]]>
这个和上面分库一样了,以倒数1,2位为库的后缀
如下图:
有个潜规则就是
需要保证全局的表名不能重复
比如db0有个trans_tb00,db1就不能有叫trans_tb00的表
表初始化 def map = [:];
for (int i=0; i<10; i++) {
def list = [];
for (int j=0; j<10; j++) {
list.add(i+""+j);
}
map.put(i,list);
};
return map;
]]>
需要初始化个表,其中key为db的下标索引,比如db0 的下标为0,
list为每个库里的表后缀名
目录是为了初始化定义这些库表
如何使用呢?
通过命令行
这里就不用讲了,wms_shard就是在server.xml里面配置的逻辑分库分表的数据源schema,应用只要访问这个就好了
show tables;也可以看到自己的一些表信息
ok.
mysql> select * from t_user_id_map;
+-----------+---------------------------+-----------+------------+---------------------+---------------------+
| F_uid | F_uname | F_enabled | F_user_id | F_create_time | F_modify_time |
+-----------+---------------------------+-----------+------------+---------------------+---------------------+
| 105001050 | @8230762802717b6a723fe9cd | 1 | 1287824017 | 2014-03-10 15:38:44 | 2014-03-10 15:38:44 |
| 62000 | | 1 | 533885000 | 2014-03-26 23:02:31 | 2014-03-26 23:02:31 |
| 86000 | | 1 | 237406000 | 2014-03-27 01:04:23 | 2014-03-27 01:04:23 |
| 96000 | | 1 | 767684000 | 2014-03-27 00:30:32 | 2014-03-27 00:30:32 |
| 130000 | | 1 | 506552000 | 2014-03-27 15:57:31 | 2014-03-27 15:57:31 |
| 149000 | | 1 | 868483000 | 2014-03-27 15:50:09 | 2014-03-27 15:50:09 |
| 179000 | | 1 | 245626000 | 2014-03-26 21:33:46 | 2014-03-26 21:33:46 |
当没有指定分库分表规则时,是进行的全表扫描,当然我们可以通过学习
mysql> explain select * from t_user_id_map;
+-----------+-----------------------------------
| DATA_NODE | SQL
+-----------+-----------------------------------
| wmsDN[0] | select * from t_user_id_map_00_0
| wmsDN[0] | select * from t_user_id_map_00_1
| wmsDN[0] | select * from t_user_id_map_00_2
| wmsDN[0] | select * from t_user_id_map_00_3
| wmsDN[0] | select * from t_user_id_map_00_4
| wmsDN[0] | select * from t_user_id_map_00_5
| wmsDN[0] | select * from t_user_id_map_00_6
| wmsDN[0] | select * from t_user_id_map_00_7
| wmsDN[0] | select * from t_user_id_map_00_8
| wmsDN[0] | select * from t_user_id_map_00_9
| wmsDN[1] | select * from t_user_id_map_01_0
| wmsDN[1] | select * from t_user_id_map_01_1
| wmsDN[1] | select * from t_user_id_map_01_2
| wmsDN[1] | select * from t_user_id_map_01_3
| wmsDN[1] | select * from t_user_id_map_01_4
| wmsDN[1] | select * from t_user_id_map_01_5
| wmsDN[1] | select * from t_user_id_map_01_6
| wmsDN[1] | select * from t_user_id_map_01_7
| wmsDN[1] | select * from t_user_id_map_01_8
| wmsDN[1] | select * from t_user_id_map_01_9
| wmsDN[2] | select * from t_user_id_map_02_0
....
这边表很多,其中dataNode是我们里面对应的结点
mysql> select * from t_user_id_map where f_uid=196606999;
+-----------+---------+-----------+-----------+---------------------+---------------------+
| F_uid | F_uname | F_enabled | F_user_id | F_create_time | F_modify_time |
+-----------+---------+-----------+-----------+---------------------+---------------------+
| 196606999 | | 1 | 749331999 | 2014-04-04 14:46:58 | 2014-04-04 14:46:58 |
+-----------+---------+-----------+-----------+---------------------+---------------------+
吐了个 "CAO" !
吐个槽吧,看都看了
PHP1.CN | 中国最专业的PHP中文社区 | json解析格式化 | PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved PHP1.CN 第一PHP社区 版权所有 京ICP备19059560号-4