1 实现方式
之前在对数据表进行水平拆分时,已经使用了取模运算。
是根据数据表中的某一个字段,有些地方说必须整型,其实除整型类型的字段外,这里可适用于所有字段,对其进行十进制的求模运算,将运算结果作为mycat的路由结果。
缺点:可以分散数据库的写压力; 不足:如果查询语句中加入了范围,那么就需要mycat对查询到的结果进行合并。当数据量非常大时,这种跨库查询且需要合并查询结果的操作,将消耗更多的资源和更多的查询时间,尤其是出现了 order by 子句时,这种情况将变得更加糟糕。
2 设置
在 rule.xml 配置文件中,使用 tableRule 标签设置。
- name 规则名称,这里的规则名称应与 schema.xml 配置文件中,对表进行分片设置的 table 节点的 rule 属性值一致,这样就将分片的规则和要分片的数据表,关联起来了。
- columns 设置根据哪个字段,来计算分片规则,一般应该是整型数据类型。
- algorithm 对字段分片时,采用的计算方法名称,这个名称应在同一配置文件中的 function 节点中定义。
- name 计算分片规则的算法名称,与 tableRule 标签下 algorithm 标签内容进行关联。
- class 实现路由算法具体的类,这里都是该类的绝对路径。
- property 算法需要使用到的参数
- count 表示进行取模的最大数,该值与 schema.xml 配置文件中,对表进行分片设置的 table 节点的 dataNode 属性中设置的节点数一致,可以确保所有分片数据,均匀的分布于所有节点中。
3 查看源码
进入到mycat源码仓库,找到用来做取模运算的类
其中核心算法在这里
首先对字段的数据进行哈希运算,
然后将结果转换为长整型,
为避免出现负数,又进行了绝对值运算;
最后对数据再根据传入的节点数,进行取模运算。
因此,可以看出,在取模运算前,其实是先进行了哈希计算,所以可适用于所有类型的字段。
不过,最好不要使用TEXT,CLOB,BLOB 这样的字段,因为哈希计算也耗时间啊。