Mycat2 分片算法简介
简介
Mycat2支持常用的(自动)HASH型分片算法也兼容1.6的内置的(cobar)分片算法.
HASH型分片算法默认要求集群名字以c为前缀,数字为后缀,c0就是分片表第一个节点,c1就是第二个节点.该命名规则允许用户手动改变.
区别
Mycat2 Hash型分片算法多数基于MOD_HASH(MOD对应JAVA的%运算,实际上是取余运算,而且abs(n)/count等价于abs(n/count)
Mycat2 Hash型分片算法对于值的处理,总是把分片值转换到列属性的数据类型再运算,而1.x系列的分片算法统一转换到字符串类型再运算且只能根据一个分片字段计算出存储节点下标。
Mycat2 Hash型分片算法适用于等价条件查询,而1.x系列由于含有用户经验的路由规则。
| 分片算法 | 描述 | 分库 | 分表 | 数值类型 |
|---|---|---|---|---|
| MOD_HASH | 取模哈希 | 是 | 是 | 数值,字符串 |
| UNI_HASH | 取模哈希 | 是 | 是 | 数值,字符串 |
| RIGHT_SHIFT | 右移哈希 | 是 | 是 | 数值 |
| RANGE_HASH | 两字段其一取模 | 是 | 是 | 数值,字符串 |
| YYYYMM | 按年月哈希 | 是 | 是 | DATE,DATETIME |
| YYYYDD | 按年月哈希 | 是 | 是 | DATE,DATETIME |
| YYYYWEEK | 按年周哈希 | 是 | 是 | DATE,DATETIME |
| HASH | 取模哈希 | 是 | 是 | 数值,字符串,如果不是,则转换成字符串 |
| MM | 按月哈希 | 否 | 是 | DATE,DATETIME |
| DD | 按日期哈希 | 否 | 是 | DATE,DATETIME |
| MMDD | 按月日哈希 | 是 | 是 | DATE,DATETIME |
| WEEK | 按周哈希 | 否 | 是 | DATE,DATETIME |
| STR_HASH | 字符串哈希 | 是 | 是 | 字符串 |
所有分片算法都可以用于分表,但是涉及单独按周、月的HASH算法不能用于分库
/*+ mycat:createTable{
"schemaName":"db1",
"shadingTable":{
"createTableSQL":"create table travelrecord(id int)",
"function":{
"properties":{
"dbNum":2,
"mappingFormat":"c${targetIndex}/db1_${dbIndex}/travelrecord_${tableIndex}",
"tableNum":2,
"tableMethod":"mod_hash(id)",
"storeNum":2,
"dbMethod":"mod_hash(id)"
}
}
},
"tableName":"travelrecord"
} */;
mappingFormat使用样例(文件配置)
"shardingTables":{
"log":{
"createTableSQL":"CREATE TABLE cloud.log (\n\t`id` BIGINT(20) DEFAULT NULL,\n\t`user_id` BIGINT(20) DEFAULT NULL,\n\t`service_id` INT(11) DEFAULT NULL,\n\t`submit_time` DATETIME DEFAULT NULL\n) ENGINE = INNODB CHARSET = utf8\nDBPARTITION BY YYYYDD(submit_time) DBPARTITIONS 2\nTBPARTITION BY MOD_HASH(id) TBPARTITIONS 8",
"function":{
"properties":{
"dbNum":"2",
"mappingFormat":"c${targetIndex}/cloud_${java.time.LocalDate.now().plus(dbIndex.toInteger()).toString().replace(\"-\",\"\")}/log_${tableIndex}",
"tableNum":"8",
"tableMethod":"MOD_HASH(id)",
"storeNum":2,
"dbMethod":"YYYYDD(submit_time)"
}
}
}
}

targetIndex是目标下标tableIndex是物理分表下标dbIndex是物理分库下标index是总物理分表下标