Bootstrap

使用mycat实现mysql的分表功能

需求:项目中需要对用户的操作日志进行记录,现在数据库中日志量过大(超过1000W),导致数据查询速度过慢,根据客户需求将日志表进行拆分。

一、mycat安装及主从同步配置

参考博客: https://blog.csdn.net/qiaosaifei/article/details/121424494?spm=1001.2014.3001.5502

二、mycat实现单库分表

参考博客:https://blog.csdn.net/qq_38917476/article/details/143719753

mycat的映射关系主要体现在两个核心配置文件中:
schema.xml: 在schema.xml中,开发者可以定义逻辑库和逻辑表,并通过分片规则将逻辑表映射到具体的数据节点或物理表上。
server.xml: 在server.xml中配置物理数据库的连接信息,例如IP地址、端口、用户名和密码,并将这些数据库作为mycat的后端节点使用。
rule.xml: 定义分片规则,实现分库分表规则配置。

配置schema.xml

<schema name="iam" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn_iam">
	<!-- 配置一个逻辑表,并指定多个物理表,使用分表规则 -->
	<table name="analysis_app_log_tb" dataNode="dn_iam" primaryKey="opt_start_time" rule="mod-time" subTables="analysis_app_log_tb2024_$1-12,analysis_app_log_tb2025_$1-12"/>
</schema>
<dataNode name="dn_iam" dataHost="localhost" database="iam"/>
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
	<hearbeat>select user()</heartbeat>
	<writeHost host="hostM1" url="IP:PORT" user="root" password="000000">
	<readHost host="hostS2" url="IP:PORT" user="root" password="000000"/>
</writeHost>
</dataHost>

配置rule.xml , 实现按月份分表

<tableRule name="mod-time">
	<rule>
		<columns>opt_start_time</columns>
		<algorithm>partByTime</algorithm>
	</rule>
</tableRule>

<function name="partByTime" class="io.mycat.route.function.PartitionByMonth">
	<property name="dateFormat">yyyy-MM-dd</property>
	<property name="sBeginDate">2023-01-01</property>
</function>

三、历史数据迁移

使用insert into … select
示例:

insert into analysis_app_log_tb2024_1(id,user_id,opt_start_time)
select id,user_id,opt_start_time from analysis_app_log_tb where DATE_FORMAT(opt_start_time,'%Y-%m')='2024-01'

四、查询语句修改

查询时使用逻辑数据表名:analysis_app_log_tb。
测试时好多复杂的sql并不支持。
示例:

select * from analysis_app_log_tb
;