能否详细解说下分库分表。
不要简单的说垂直水平这我知道
首先
垂直(图) 按业务 表结构不一样 ,有一列一样,并集是全量数据
单库 和 多库
客户基本信息表,结算信息表,联系人信息表,附件信息表
客户库,结算库 。。。
优 业务清晰转库专用,数据维护简单不同业务不同机器;
缺点 单表数据量大,读写压力大的单个业务往往影响数据库的瓶颈(性能问题),部分业务关联麻烦,join只能通过java程序接口,复杂的提高
场景 :比如双十一, 商品访问增加,订单insert并发大 ,几百万直接宕机
水平(图)按数据 表结 构一样 数据不一样 并集是全量数据 id范围 或者 mod 2 保证均衡
单库 和 多库
渠道交易流水表 按时间维度 拆成三张 channel_tran channel_tran_month channel_tran_history
商户费用表 fee_detail_202001 fee_detail_202002 fee_detail_202003... 按月12张
跑批同步
垂直多库之后单表数据还大再拆 多个库
优点:单表/库数据减少 有助于性能提高 ,提高系统稳定性和负载能力(请求不同地),拆分的表结构相同程序改动较少(dto)
缺点:后期维护扩容、改造、迁移比较麻烦 ,拆分规则很难抽象出来,分片事务的一致性的问题部分业务无法关联,join只能通过java程
问题:多数据源问题 ,分页,事务,join ,分布式全局ID,
跨库关联查询(join) : 1冗余字段 ,2跨系统的数据同步(同步方式 canal ,MQ),
3,全局表(广播表:行名行号表,行政区划表 每个系统存相同的数据)
4,API,访问接口过滤组装
分布式事务(一致性)
本地事务acid特性,跨库预计能成功的情况下,尽量缩短提交的时间差。
举个例子:团建洗脚 微信群 马上出发,除非上一秒可以下一秒被抓了 ,有一个今天出不来,那就改日 。当然只要心里有兄弟是不是同时也无所谓,今天你1点去的他2点团建也算圆满完成。最终一致性
排序,分页,函数max min sum count计算
不同库中 在 同一页出现怎么办呢 ? 先从不同库过滤的并集 再排序分页
开源中间件帮忙实现
当然如果你还想了解更多 以文字已经很难继续比如MyCat Sharding-JDBC的落地可以关注我的直播