/mysql-router-spring-starter

mybaits的分库分表策略

Primary LanguageJava

分库分表

思考一下?你的项目里为什么会需要这个东西.

  • 数据量太多导致一张表放不下? (因为增长过快,后期补救)
  • 业务场景需要。例如mysql存储一张表大概在3000W-5000W是最佳。单表不合适

可能带来的问题?

  • 事务问题

    单库利用mysql的innodb引擎的事务特性处理。分库后如何解决事务的问题?

  • 查询问题

    分库分表的路由问题? 如何实现?

  • 分布式ID的问题

    自增ID对于单表肯定是必须有的。但是分表的时候,选择一个合适的分表主键ID也是必须有的。该选择哪种方式呢?

开源/自研?

开源产品

Apache顶级产品项目ShardingSphere。解决上诉的一切问题,针对主从模式的mysql。也提供了自动切换库的策略实现方式。

自研

按需写。部分场景下你只需要一个馅饼,家庭作坊就能鼓捣出来。享受学习的快乐

正文开始

准备知识

  • SpringAop
  • SpringBoot-Starter
  • mybaits

切入点

  • 动态选择数据源
  • 分库分表策略
  • mybaits的侵入式修改(拦截完整SQL,修改表名)

动态数据源

Spring2.0版本后AbstractRoutingDataSource,根据路由策略选择

分库分表策略

HashMap的原理 数组+链表 对应 分库+分表。 使用hashMap的扰动函数,让其均匀放在在数组的位置上

mybaits 拦截器

正则匹配insert/update/select 的表名 并且进行体会