在实际工作中,会遇到业务比较集中的情况,随着时间推延,这部分业务关联的mysql表就会越来越大,十分臃肿。尽管在项目架构上做了读写分离,也会导致查询的时候出现比较慢的情
在实际工作中,会遇到业务比较集中的情况,随着时间推延,这部分业务关联的mysql表就会越来越大,十分臃肿。尽管在项目架构上做了读写分离,也会导致查询的时候出现比较慢的情况,导致线上慢查询的出现。 这种情况下导致的慢查询,单纯从sql优化的角度是无法解决的,此时我们就会用到分库分表。由于我们目前的问题是部分mysql表比较大,采用分表的方式即可解决,本文主要讨论分表的情况。 1、分表的方式
简单理解:把同一个表中的数据按列拆分到不同的表中。 所谓的垂直分表指的是将表结构按照功能模块、关系密切程度划分出来,部署到不同的库或者不同的表中。
简单理解:把同一个表中的数据按行拆分到不同的表中。 所谓的水平分表,即将数据按照某种规则存储到不同的表中。例如日志表,可以使用按月或者按天分表,即每个月的日志数据单独存储在一张表中。这些表同时属于一张主表,拥有相同的表结构,但查询时可以大大减轻主表查询的负担。 二、代码实现主要使用mybatis-plus提供的功能来实现功能。 1、pom文件依赖
2、配置文件
3、MybatisPlusConfig实现MybatisPlusConfig配置类实现:
Tables类实现:
4、优雅的使用在使用的时候,只需要在mysql表对应的entity里添加一个字段month即可。 如果month不为空就会按照month的日期所在的月份对数据库表明进行动态拼接。如果month为空则不进行拼接,直接访问总表。 entity类实现:
mapper类实现:
5、mysql表名拆分需要手动把当年需要的数据库手动创建出来,命名规则对应MybatisPlusConfig类中的拼接规则。 三、遇到的问题由于我一直用的是mybatis组件,需要升级为mybatis-plus,在升级的过程中出现如下的问题。 1、Invalid bound statement (not found)问题原因: pom文件依赖的是mybatis-plus,配置文件中使用的是mybatis的配置,导致mybatis加载失败。 解决方法:把配置文件的mybatis配置改为mybatis-plus配置 2、resultType=“java.util.Map”,返回字段名被包装问题原因: 在未升级成mybatis-plus之前,可以直接放回数据库中的字段命名。 升级之后,mybatis-plus将放回字段自动映射为entity中的字段命名。 解决方案: 梳理受到影响的代码逻辑,更新使用的字段命名。 |
2021-06-05
2021-05-27
2021-05-26
2021-06-05
2021-05-16