https://crossoverjie.top/JCSprout/#/db/DB-split
首选分表分库的:最好是在千万级别数据开始实现分表分库。
数据库的拆分主要体现在两个方面:垂直拆分和水平拆分
- 垂直拆分:根据业务的维度,将原本的一个表拆分成多个表,每个表与原有的结构不同(优先采用冷热分离拆分)。
- 水平拆分:根据分片(sharding)算法,将一个表拆分为多个表,每个表依旧保留原有的结构。
两种拆分方法可能会同时存在,在互联网应用中的开发过程中,通常先进行垂直拆分,使单体应用形成多个微服务结构,在微服务中再进行水平表拆分。
为了分散数据库的压力,采用分库分表的方案,将一个表结构分为多个表,或者将一个表的数据分片后放入多个表,这些表可以放在同一个库里,也可以放到不同的库里,甚至可以放在不同的数据库上。
分库方式:
分库:根据业务实现分库 订单数据库、会员数据库、支付数据库等。
会员数据库又可分成多个不用的数据库
Member_db1 --- 会员数据库
Member_db2 --- 会员数据库
分表方式:
计算hash 最常见的 根据唯一id取余数 存在表的扩容问题。按照时间划分(按照月、年)。
macat和Sharding-jdbc实现分库分表:
mycat实现分片:好处隐藏数据库db真实的连接地址 类似于nginx反向代理。
问题:mycat分表分库后查询所有的数据效率是否会很低?
不会特别低 因为采用多线程查询数据,
Shardingjdbc的实现原理:本地采用aop拦截jdbc语句,在sql发送之前改写sql语句,效率比mycat要高。
Sharding-jdbc与MyCat区别:
MyCAT是基于服务器虚拟数据库的方式实现分表分库代理sharding-jdbc基于本地AOP,拦截jdbc改写sql语句,效率更加好。我们对数据库的使用通常经历一下三个阶段
1. 单库单表
2. 单库多表:对表进行水平拆分,产生多个结构完全一样的表,例如User0、User1、User2等等,这些表的数据加起来刚好是一份完整的全 量数据。
3. 多库多表:对数据库进行水平拆分,将切分的数据库和表水平的分散到不同的数据库实例上。
客户端分片:不需要中间件
代理分片:需要中间件(mycat等)
分布式数据库:
,
3. 通过ORM框架实现
就是通过取模算法,有多少分表就通过用户id或其他字段来进行取模(用户id%分表数量)
1、MyISAM:不是事务安全的,而且不支持外键,如果执行大量的select,insert MyISAM比较适合。
2、InnoDB:支持事务安全的引擎,支持外键、行锁、事务是他的最大特点。如果有大量的update和insert,建议使用InnoDB,特别是针对多个并发和QPS较高的情况。