为什么要分表
当订单表的订单数达到上千万时,查询效率就会变慢,于是就需要分表。
为什么按照用户ID分表
订单表如果按照主键ID分表的话,那么同一个用户的订单可能分布在不同的机器节点上,查询起来效率不如同一个节点的。所以最好按照用户ID分表。
server.xml
主要用于定义用户以及系统相关变量,如端口等。这里为了与mysql作区分,name取用户名mycat,另外设置逻辑库名。
<user name="mycat">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
</user>
schema.xml
定义逻辑库、表、分片节点等内容。主要配置的是逻辑库名、分表的表名、分片节点名、规则名等
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 逻辑库名是TESTDB -->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<!-- 要分表的表名是orders,两个节点,规则是mod_rule -->
<table name="orders" dataNode="dn1,dn2" rule="mod_rule"></table>
</schema>
<dataNode name="dn1" dataHost="host1" database="testdb" />
<dataNode name="dn2" dataHost="host2" database="testdb" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.1.9:3306" user="root"
password="admin">
</writeHost>
</dataHost>
<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.1.8:3306" user="root"
password="123456">
</writeHost>
</dataHost>
</mycat:schema>
rule.xml
主要定义分片规则,这里的mod-long的算法就是按照用户ID对2取模(因为两个节点),这样奇数和偶数的用户ID会被插入到不同的节点所在的数据库。
<tableRule name="mod_rule">
<rule>
<columns>customer_id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">2</property>
</function>