大家都知道like %suibin% 这种查询的效率极低,而MYSQL也建议不要这样模糊查询,常用的是把数据同步到CACHE里:
1、比如同步到ES里用ES模糊查询。或者同步数据到MongoDB实现模糊查询。这样需要写SQL还需要再写一套语法通过判断切换,还要写一个数据库同步表数据的逻辑。
2、其实我们可以把以上的架构设计进行改进,我就花了2周多做一个mybatis插件实现,那么在组件内部实现了同步数据和查询切换。这样开发人员不需要去关心实现上述代码。下面一个方案,当然该方案里spring-jdbc,spring-tx,mybatis三者底层代码修改,在TX对@Transactional的处理逻辑里进行拦截事务,对CURD中的CUD和R分为俩组处理,CUD进入队列和并发锁处理,采用生产消费者模式实现数据同步保证异构库表数据一致性;R的话从mongdb获取不存在时走MYSQL查询;当然关于俩种数据库的字段类型经过了映射处理,比如时区问题等。代码连接如下:
multdao.mybatis with mongodb cache 介绍
multdao.mybatis with mongodb cache 是后端扩展组件,是基于mybatis底层实现了CURD的分布式事务,不修改任何业务逻辑情况下,导入该组件即可实现数据的CURD实时同步到mysql和mongodb, 双库数据一致。它的作用在DAO层实现了mongodb作为数据cache,写的时候写双库,读的时候读mongodb。目前支持:mapper方式的sql。
- 不修改任何项目上的逻辑代码即可集成
- 添删改查同时操作mysql和mongodb
- 基于mybatis底层源码实现,也支持mybatis-plus
- 组件保证了分布式事务的问题,数据一致性
- 支持并发CURD,支持大数据量读写
- 实现了读写分离:读mongodb,写mysql
- 关系数据库支持:mysql,oracle.非关系数据库支持:mongodb
- 支持sql92规范的语法,支持复杂的join查询
- 支持事务注解@Transactional mysql innodb的事务。
- 支持like %dd% 的高性能查询,不用担心mysql负向查询效率问题。join和like的查询是走的是mongodb数据库。
- 不用加mysql索引提高效率问题。
https://gitee.com/firstime/community-src/tree/master/multdao.mybatis