单库分表--用月份分片
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>