分库分表初见

曾经为了面试,熟读并背诵了那么多骚操作,对于数据库这方面,常会背到的就是sql优化,分库分表了。

当分表来临时

昨天一个戴眼镜的老哥告诉我

有一个表未来数据量会比较大,我准备给他切了,可能会影响你那边。

我去?飞来横祸?我这CRUD过的很开心,分什么表啊。为此赶紧调动我面试时背诵的各种知识点,跟老哥进行一场battle,渴望不分表,继续单表开开心心。可惜败下阵来,还是太年轻了。没办法,开始coding吧!

最开始想是直接引入sharding-jdbc,第一次操作,不得不说sharding-jdbc的文档真不怎么样,搞了半天总是报错,各种错,反正是没跑起来。于是乎,一个骚操作涌上心头。我这边对这个表的操作很简单,就是select,实在不行,直接改sql吧。我要是直接把

select * from table

改成

 select * from table0
 union 
 select * from table1 
 union....

那未来承接这个项目的同学可能会把我骂死,不过这个问题也好解决,三下五除二,把代码上的created by署名删除了,嗯!完美!
冷静三秒之后,觉得还是不要这么搞了,毕竟我是一个专业的软件工程师,担负着拯救人类的重任。算了,再想想招儿吧。
ORM用的是mybatis,于是乎一个想法涌上心头,mybatis不是有插件嘛,我直接来个统一处理完事了呗,不得不佩服自己的机智,很快搞了起来。

demo(地址附在文末)

talk is cheap,show me the code -----大师如此说道

mybatis插件其实就是***,我们可以用申明签名的方式,指定我们要拦截的方法,从中获取我们需要的信息,加入自定义的逻辑操作。也就是说,它可以帮我们拦截sql,在sql提交给jdbc执行前的那一刻,将他拦截下来,判断他的分表策略和操作类型(demo中以注解的形式申明),然后进行sql处理(demo中使用的是druid的sql解析模块),整合出我们最终需要的sql。

当然了,这么典型的需求,肯定已经有人做好轮子等着我们去用了,就如上面对话中所提及的几个,比如其中的sharding-jdbc,做的就是帮我们拦截sql,解析sql,路由执行,结果聚合。这一切对于我们用户是透明的,我们无需改任何代码,只要加入sharding-jdbc的配置参数就可以开心的分库分表了,但考虑到各种原因,有些复杂sql是不支持的,这个可以参考官方文档。

这个demo记录了从单表操作到自定义分表插件到使用sharding-jdbc进行分表操作的全历程。demo只能演示select * from table这样简单语句的全套操作历程,但也足以体现整个思路。自定义插件完成分表对应的是demo中的version2分支。sharding-jdbc完成分表对应的是demo中的version3分支。

地址:https://github.com/naget/sharding

参考资料

  1. https://github.com/alibaba/druid/wiki/SQL-Parser
  2. https://mp.baomidou.com/guide/quick-start.html#%E6%B7%BB%E5%8A%A0%E4%BE%9D%E8%B5%96
  3. https://github.com/apache/incubator-shardingsphere/issues/1900
  4. https://mybatis.org/mybatis-3/zh/configuration.html#plugins