单库分表--用月份分片

2018-10-30  本文已影响63人  南风nanfeng

笔者有张大表,超过4亿数据,数据按时间递增,表中有个非空的时间字段,因此采用按照年月作为片键分表。

1. 配置schema.xml

<schema name="report_schema" checkSQLschema="false" sqlMaxLimit="100">
                <table name="tbl_report" primaryKey="rec_id" dataNode="report_node" subTables="tbl_report_201409,tbl_report_20141$0-2,tbl_report_20150$1-9,tbl_report_20151$0-2,tbl_report_20160$1-9,tbl_report_20161$0-2,tbl_report_20170$1-9,tbl_report_20171$0-2,tbl_report_20180$1-9,tbl_report_20181$0-2" rule="sharding-by-date-report" />
        </schema>
        <dataNode name="report_node" dataHost="host180" database="report_his" />
        <dataHost name="host180" maxCon="1000" minCon="10" balance="0"  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="hostM1" url="localhost:3306" user="root"  password="pass2017"></writeHost>
        </dataHost>
</schema>

注意,时间从2014-09开始至今(2018-10),有50个分表,subTables的写法请注意。亲测可用。笔者也曾经考虑按天分表,考虑的分表过多,subTables的写法复杂。

2. 配置server.xml

 <user name="root">
    <property name="password">123456</property>
    <property name="schemas">report_schema</property>
 </user>

注意,schemas对应schema.xml里的就可以了。

3.配置rule.xml

<function name="sharding-by-month-201409" class="io.mycat.route.function.PartitionByMonth">
    <property name="dateFormat">yyyy-MM-dd</property>
    <property name="sBeginDate">2014-09-01</property>    <!--开始日期,这里注意一定写成源数据的最小日期,也可以定义结束时间,默认是当前时间,因为按月分片,从这个时间点开始计算片键索引-->
</function>

<tableRule name="sharding-by-date-report">
    <rule>
        <columns>report_time</columns>
        <algorithm>sharding-by-month-201409</algorithm>
    </rule>
</tableRule>

上一篇下一篇

猜你喜欢

热点阅读