mycat水平拆分——按用户ID分表

  • Post author:
  • Post category:其他




为什么要分表

当订单表的订单数达到上千万时,查询效率就会变慢,于是就需要分表。



为什么按照用户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>



版权声明:本文为zhuyacheneagle原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。