mycat单数据库按日分表
1.mycat单数据库分表配置
数据库有个表数据每天增加一百多万条,数据量太大了,查询时耗时大,需要进行分表操作,这里我是按天分表。
1.1下载
官网 http://www.mycat.org.cn/
下载地址 http://dl.mycat.org.cn/1.6.7.4/
1.2安装配置
安装就不写了,百度就有
下面是配置
server.xml文件主要配置
<!--配置连接mycat的用户-->
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<!--这个数据要和schema.xml文件中<schema name=""> 保持一致-->
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
rule.xml
<!--根据日期分表-->
<tableRule name="sharding-by-date">
<rule>
<columns>ctime</columns> <!-- 要分片的表的字段-->
<algorithm>sharding-by-date</algorithm> <!--分片函数-->
</rule>
</tableRule>
<function name="sharding-by-date" class="io.mycat.route.function.PartitionByDate">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2020-06-01</property> <!--开始时间-->
<property name="sPartionDay">1</property> <!-- 分表时间间隔-->
</function>
schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--server.xml文件中的数据库-->
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<!--<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /> -->
<!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
/> -->
<!-- 配置mycat数据库显示的表和分表规则 -->
<!--按天分表,需要在数据库中先把表建好,不然操作表的时候会报错-->
<table name="table" dataNode="dn1" subTables="table_2020_6_$01-30,table_2020_7_$01-31" rule="sharding-by-date" />
<!--按月分表-->
<!-- <table name="table" dataNode="dn1" subTables="table_2020_$01-12" rule="sharding-by-month" /> -->
<!--配置了表在mycat数据库里面才会显示,不然没有表数据-->
<table name="table" dataNode="dn1" />
<table name="table" dataNode="dn1" />
</schema>
<!--配置数据库节点,可以配置多个进行分库分表-->
<dataNode name="dn1" dataHost="localhost1" database="test" />
<!-- <dataNode name="dn2" dataHost="localhost1" database="db2" /> -->
<!-- <dataNode name="dn3" dataHost="localhost1" database="db3" /> -->
<!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" />
<dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />
<dataNode name="jdbc_dn2" dataHost="jdbchost" database="db2" />
<dataNode name="jdbc_dn3" dataHost="jdbchost" database="db3" /> -->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 配置mysql数据库连接 -->
<writeHost host="hostM1" url="127.0.0.1:3306" user="root"
password="123456">
</writeHost>
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
<!--
<dataHost name="sequoiadb1" maxCon="1000" minCon="1" balance="0" dbType="sequoiadb" dbDriver="jdbc">
<heartbeat> </heartbeat>
<writeHost host="hostM1" url="sequoiadb://1426587161.dbaas.sequoialab.net:11920/SAMPLE" user="jifeng" password="jifeng"></writeHost>
</dataHost>
<dataHost name="oracle1" maxCon="1000" minCon="1" balance="0" writeType="0" dbType="oracle" dbDriver="jdbc"> <heartbeat>select 1 from dual</heartbeat>
<connectionInitSql>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'</connectionInitSql>
<writeHost host="hostM1" url="jdbc:oracle:thin:@127.0.0.1:1521:nange" user="base" password="123456" > </writeHost> </dataHost>
<dataHost name="jdbchost" maxCon="1000" minCon="1" balance="0" writeType="0" dbType="mongodb" dbDriver="jdbc">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM" url="mongodb://192.168.0.99/test" user="admin" password="123456" ></writeHost> </dataHost>
<dataHost name="sparksql" maxCon="1000" minCon="1" balance="0" dbType="spark" dbDriver="jdbc">
<heartbeat> </heartbeat>
<writeHost host="hostM1" url="jdbc:hive2://feng01:10000" user="jifeng" password="jifeng"></writeHost> </dataHost> -->
<!-- <dataHost name="jdbchost" maxCon="1000" minCon="10" balance="0" dbType="mysql"
dbDriver="jdbc"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1"
url="jdbc:mysql://localhost:3306" user="root" password="123456"> </writeHost>
</dataHost> -->
</mycat:schema>
1.3配置主键id统一自增
我这里使用的是本地文件的方式,.
修改sequence_conf.properties文件
#TABLE是表名,必须大写
#CURID是指表的主键id已经使用到14547424了,下一条数据id就是14547425
TABLE.HISIDS=
TABLE.MINID=1
TABLE.MAXID=99999999999
TABLE.CURID=14547424
修改server.xml文件
<property name="sequnceHandlerType">0</property> <!--修改主键生成策略-->
修改schema.xml文件,添加 primaryKey=“id” autoIncrement=“true”
<table name="table" dataNode="dn1" primaryKey="id" autoIncrement="true" subTables="table_2020_5_$01-31,table_2020_6_$01-30" rule="sharding-by-date" />
1.4启动
启动mycat,修改springboot配置,连接mycat数据库,对表进行insert操作,测试是否分表成功.
配置和server里面配置的数据一致就行了
spring.datasource.url=jdbc:mysql://localhost:8066/TESTDB
spring.datasource.username=root
spring.datasource.password=123456