阅读(574) (11)

Mycat2 分片算法简介

2021-09-08 12:00:29 更新

简介

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 (nt`id` BIGINT(20) DEFAULT NULL,nt`user_id` BIGINT(20) DEFAULT NULL,nt`service_id` INT(11) DEFAULT NULL,nt`submit_time` DATETIME DEFAULT NULLn) ENGINE = INNODB CHARSET = utf8nDBPARTITION BY YYYYDD(submit_time) DBPARTITIONS 2nTBPARTITION 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是总物理分表下标