浅谈mysql数据库分库分表那些事-亿级数据存储方案

浅谈mysql数据库分库分表那些事-亿级数据存储方案,第1张

mysql分库分表一般有如下场景

其中1,2相对较容易实现,本文重点讲讲水平拆表和水平拆库,以及基于mybatis插件方式实现水平拆分方案落地。

在 《聊一聊扩展字段设计》 一文中有讲解到基于KV水平存储扩展字段方案,这就是非常典型的可以水平分表的场景。主表和kv表是一对N关系,随着主表数据量增长,KV表最大N倍线性增长。

这里我们以分KV表水平拆分为场景

对于kv扩展字段查询,只会根据id + key 或者 id 为条件的方式查询,所以这里我们可以按照id 分片即可

分512张表(实际场景具体分多少表还得根据字段增加的频次而定)

分表后表名为kv_000 ~ kv_511

id % 512 = 1 .... 分到 kv_001,

id % 512 = 2 .... 分到 kv_002

依次类推!

水平分表相对比较容易,后面会讲到基于mybatis插件实现方案

场景:以下我们基于博客文章表分库场景来分析

目标:

表结构如下(节选部分字段):

按照user_id sharding

假如分1024个库,按照user_id % 1024 hash

user_id % 1024 = 1 分到db_001库

user_id % 1024 = 2 分到db_002库

依次类推

目前是2个节点,假如后期达到瓶颈,我们可以增加至4个节点

最多可以增加只1024个节点,性能线性增长

对于水平分表/分库后,非shardingKey查询首先得考虑到

基于mybatis分库分表,一般常用的一种是基于spring AOP方式, 另外一种基于mybatis插件。其实两种方式思路差不多。

为了比较直观解决这个问题,我分别在Executor 和StatementHandler阶段2个拦截器

实现动态数据源获取接口

测试结果如下

由此可知,我们需要在Executor阶段 切换数据源

对于分库:

原始sql:

目标sql:

其中定义了三个注解

@useMaster 是否强制读主

@shardingBy 分片标识

@DB 定义逻辑表名 库名以及分片策略

1)编写entity

Insert

select

以上顺利实现mysql分库,同样的道理实现同时分库分表也很容易实现。

此插件具体实现方案已开源: https://github.com/bytearch/mybatis-sharding

目录如下:

mysql分库分表,首先得找到瓶颈在哪里(IO or CPU),是分库还是分表,分多少?不能为了分库分表而拆分。

原则上是尽量先垂直拆分 后 水平拆分。

以上基于mybatis插件分库分表是一种实现思路,还有很多不完善的地方,

例如:

您好,MySQL分库分表后,Java读写的方式主要有以下几种:

1. 使用JDBC连接池:可以使用JDBC连接池来连接MySQL数据库,然后使用JDBC API进行数据 *** 作,这是最常见的读写方式。

2. 使用MyBatis:MyBatis是一个开源的持久层框架,可以帮助我们快速构建数据访问层,它可以自动映射数据库表和实体类,可以更加方便地实现MySQL的读写 *** 作。

3. 使用Hibernate:Hibernate是一个开源的对象关系映射框架,可以帮助我们实现MySQL的读写 *** 作,它可以自动映射数据库表和实体类,可以更加方便地实现MySQL的读写 *** 作。

4. 使用JPA:JPA是Java Persistence API的简称,是一个Java持久化规范,可以帮助我们实现MySQL的读写 *** 作,它可以自动映射数据库表和实体类,可以更加方便地实现MySQL的读写 *** 作。

总之,MySQL分库分表后,Java可以使用JDBC连接池、MyBatis、Hibernate和JPA等方式来实现读写 *** 作。

1.导包必须有的

2.修改数据源(applocation):2个

3.设置mapper配置文件:两个(主要)

另一份配置文件复制一份即可,不过有些参数需要改变,讲解:

@Primary 代表默认数据库,第二份需要去掉

@MapperScan @Bean 代表sql工程,dao层位置等,需要改掉不能和第一份一样吗,具体看你的applocation配置,最好方法名称也改掉。

@Value 配置的数据库信息,两份不同

4.创建文件:dao、mapper下都要配置两份,必须要和mapper配置文件中位置对应,否则无法生效。

中间碰到了一些问题大部分都可以考百度摆平,当然如果你严格然后我说的 *** 作,那就不会有问题,其中解决时间最长的是在配置文件中有一行代码,因为是复制别人的所有不是很明白为什么那么 *** 作,有知道可以在评论里说下,谢谢。

bug:数据库无法切换查询第二数据库时,debug中数据库值都已拿到,但是仍然查的是默认数据库,原因是在mapper配置文件中赋值了一个MybatisConfiguration,源代码如下:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6733805.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-27
下一篇 2023-03-27

发表评论

登录后才能评论

评论列表(0条)

保存