从零到一yudao-cloud系统日志表分表实战指南1. 为什么需要为系统日志表做分表系统日志表往往是业务系统中增长最快的数据表之一。以yudao-cloud框架中的system_login_log表为例随着用户量增加单表存储所有登录记录会导致查询性能下降、备份困难等问题。这时候分表技术就能派上用场。分表的核心思想是将一个大表拆分成多个物理表但应用层仍然像操作单个表一样简单。ShardingSphere-JDBC作为轻量级的Java框架可以在不侵入业务代码的情况下实现这一目标。相比传统的分库分表方案它具有以下优势零代码入侵业务代码无需任何修改灵活配置通过YAML文件定义分片规则多种分片策略支持取模、范围、时间等多种分片算法分布式主键内置雪花算法生成全局唯一ID2. 环境准备与依赖配置2.1 版本兼容性检查在开始前请确保你的环境满足以下要求组件版本备注yudao-cloud≥2.3.0框架基础版本ShardingSphere-JDBC5.4.1分表中间件MySQL8.0数据库服务Java1.8运行环境2.2 关键依赖引入在yudao-dependencies模块的pom.xml中添加以下依赖dependency groupIdorg.apache.shardingsphere/groupId artifactIdshardingsphere-jdbc-core-spring-boot-starter/artifactId version5.4.1/version /dependency dependency groupIdorg.yaml/groupId artifactIdsnakeyaml/artifactId version1.33/version /dependency提示依赖版本必须严格匹配否则可能导致兼容性问题3. 分表配置详解3.1 数据源定义首先在sharding-sphere-config.yaml中定义数据源dataSources: write: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/yudao-cloud username: root password: root3.2 分表规则配置针对system_login_log表的具体分表策略rules: - !SHARDING tables: system_login_log: actualDataNodes: write.system_login_log_$-{1..2} tableStrategy: standard: shardingColumn: id shardingAlgorithmName: InLineId keyGenerateStrategy: column: id keyGeneratorName: snowflake3.3 分片算法定义配置取模分片算法shardingAlgorithms: InLineId: type: INLINE props: algorithm-expression: system_login_log_$-{id % 2 1}这个表达式表示当id%20时数据存入system_login_log_1当id%21时数据存入system_login_log_24. 数据库表结构调整4.1 物理表创建在数据库中创建两个物理表CREATE TABLE system_login_log_1 ( id bigint NOT NULL, -- 其他字段与原表一致 PRIMARY KEY (id) ) ENGINEInnoDB; CREATE TABLE system_login_log_2 ( id bigint NOT NULL, -- 其他字段与原表一致 PRIMARY KEY (id) ) ENGINEInnoDB;注意id字段不再设置为自增因为我们将使用雪花算法生成ID4.2 历史数据迁移如果已有历史数据需要编写迁移脚本# 将原表数据均匀分配到两个分表 INSERT INTO system_login_log_1 SELECT * FROM system_login_log WHERE id % 2 0; INSERT INTO system_login_log_2 SELECT * FROM system_login_log WHERE id % 2 1;5. 测试与验证5.1 启动配置检查确保application-local.yml中正确指向ShardingSphere配置spring: datasource: primary: sharding sharding: url: jdbc:shardingsphere:classpath:sharding-sphere-config.yaml driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver5.2 分表效果验证通过以下方式验证分表是否生效插入测试数据检查数据是否均匀分布在两个物理表中执行查询验证路由是否正确// 插入数据示例 LoginLog log new LoginLog(); log.setUserId(1001L); log.setLoginIp(127.0.0.1); loginLogMapper.insert(log); // ID由雪花算法自动生成6. 性能优化建议索引优化在每个分表上建立合适的索引查询优化避免不带分片键的全表扫描监控配置开启ShardingSphere的SQL日志props: sql-show: true7. 常见问题排查问题1启动时报表不存在错误检查actualDataNodes配置的表名是否正确确认物理表已创建问题2数据分布不均匀验证分片算法是否正确检查雪花算法生成的ID是否均匀问题3跨分片查询性能差尽量避免不带分片键的查询考虑使用绑定表减少JOIN操作