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分库,同样的道理实现同时分库分表也很容易实现。
此插件具体实现方案已开源:
目录如下:
mysql分库分表,首先得找到瓶颈在哪里(IO or CPU),是分库还是分表,分多少?不能为了分库分表而拆分。
原则上是尽量先垂直拆分 后 水平拆分。
以上基于mybatis插件分库分表是一种实现思路,还有很多不完善的地方,
例如:
一句query来实现,不可能
一次执行一个的语句是
RENAME TABLE tb_name TO new_name;
老子教你一招.
用程序输出一组语句然后在mysql执行
例: php
我倒想把程序代码都给你写上,可不知道你mysql的数据结构,154651166 park412@hotmail.com
你加我
如果心情好可以帮你解决
select s.num1,t.num2 from
(select count(*) num1 from student) s,
(select count(*) num2 from teacher) t;
分别用两个子查询查出两个标的记录,即临时表,然后列出来就可以。有问题再留言
根据业务逻辑,自己定一个规则去选择不同的库存储。比方如计算机类书籍存储A库中的书籍表。经济类的书籍存储B。最终构造一个KEY(书籍类型)- value(库标识)。查询时根据库标识取出对应的数据源进行查询。
我写了一下你看看吧
select t1.*,t2.*,t3.*(我不知道你要什么字段,所以就全部显示了,也可以根据你的需要添加字段)
from a1 t1
, a2 t2
, a3 t3
where t1.user_id = t2.user_id(主键或外键:根据实际表的字段连接)
and t2.user_id = t3.user_id(主键或外键:根据实际表的字段连接)
and t1.name = '张三'
;
上面我只是举个例子,如果你连表的字段信息都不知道,那我也没有办法,本人只会这些。