上。
通过定义表的分片规则来实现分片,每个表格可以捆绑一个分片规则,每个分片规则指定一个分片
字段并绑定一个函数,来实现动态分片算法。以常用的基于整数映射的分片函数
org.MyCAT.route.func<on.Par<<onByFileMap 为例,此函数通过一个配置文件来确定映射关系,以下面的
sharding-by-in>ile 这个分片规则为例:
<tableRule name="sharding-by-intfile">
<rule>
<columns>sharding_id</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
<function name="hash-int" class="org.MyCAT.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
</function>
<function name="rang-long" class="org.MyCAT.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>\
</function>
par<<on-hash-int.txt 的文件如下:
10000=0
10010=1
表明当字段 + 取值为 10000 的时候,返回分片节点 ID 为 0,以此类推。
Schema.xml 中定义 % 表的分片规则为此规则:
<table name="customer" dataNode="dn1,dn2" rule="sharding-by-intfile" />
于是 % 按照字段 + 进行水平分片,分片存储在两个数据节点 dn1,dn2 上。
如何知道某个 SQL 在哪个分片上执行? 用 explain sql 语句:
explain select * from customer where sharding_id=10000