分库分表
1.两种方式:
(1)Sharding-Jdbc:
(2)MyCat:
区别:
Sharding-jdbc:
优点:
1.可适用于任何基于java的ORM框架,如:JPA、Hibernate、Mybatis、Spring JDBC Template,或直接使用JDBC
2.可基于任何第三方的数据库连接池,如:DBCP、C3P0、Durid等
3.分片策略灵活,可支持等号、between、in等多维度分片,也可支持多分片键。
4.SQL解析功能完善,支持聚合、分组、排序、limit、or等查询,并支持Binding Table以及笛卡尔积表查询。
5.性能高,单库查询QPS为原生JDBC的99.8%,双库查询QPS比单库增加94%。
缺点:
1.理论上可支持任意实现JDBC规范的数据库。目前仅支持mysql
2.维护会比较麻烦,需要逐个项目的修改配置。不能进行跨库连接,代码需要进行改造。
3.在扩展数据库服务器时需要考虑一致性哈希问题,或者采用分片键局部取模方式,也难免要进行部分的数据迁移。
MyCat:
优点:
1.支持Mysql集群,可以作为Proxy使用
2.支持JDBC连接ORACLE、DB2、SQL Server,将其模拟为MySQL Server使用
3.自动故障切换,高可用性
4.支持读写分离,支持Mysql双主多从,以及一主多从的模式 ,支持全局表,数据自动分片到多个节点,用于高效表关联查询
5.支持独有的基于E-R 关系的分片策略,实现了高效的表关联查询
6.多平台支持,部署和实施简单
缺点:
1.mycat不支持二维路由,仅支持单库多表或多库单表 由于自定义连接池,这样就会存在mycat自身维护一个连接池,MySQL也有一个连接池,任何一个连接池上限都会成为性能的瓶。
1.2 MyCat的工作原理:
Mycat的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
1.3 MyCat的读写分离:

2.sharding-jdbc是什么:
1.开源的分布式数据库中间件,它无需额外部署和依赖,旧代码迁移成本几乎为零。
2.面向开发的微服务与云原生的基础类库。
3.完整的实现了分库分表,读写分离和分布式主键功能
3. sharding-jdbc拆分规则:
(1) 垂直拆分:按着业务去拆分
订单表,用户表在一个数据库,数据量非常大,对数据库的压力非常大,分别分到订单库,和用户库中,分担压力,其实如果用户一直在快速增长,订单无限的情况下,还是解决不了这个问题的。
(2)水平拆分:按着算法规则去拆分
hash规则:根据用户表的id的hash值进行取模,id=1的进入第一个库,id=2的进入第二个库,以此类推
范围规则:按着1,1001,2001,这样的范围去拆解开放入不同的库中
标签分片:针对地区字段,北京在一块,上海在一块,中国在一块,美国在一块。
时间分片:交易记录,按着每年分片,或者是每月分片
复合分库:
4. 几个概念
逻辑表:对于水平拆分的数据库(表)的同一类表的总称:t_high_bill,
真实表:在分片的数据库中真实存在的物理表,t_high_bill_1
数据节点:数据库名称+数据表名称组成。是数据分片的最小单元。
绑定表:分片规则一致的主表和子表,例如:t_order表和t_order_item表,都按着订单id进行分片,两张表互为绑定表关系。查询效率大大提升。
5. 项目中的使用情况
将账单表根据车牌号分为八个完全一样的表,在xml文件中操作时的逻辑表名称为t_high_bill,真实表名称为:t_high_bill_1,八个表分别加_1.
DatabaseShardingStrategy设置为2偶数,不进行分库操作。
可以结合springboot和Sharding-JDBC实现读写分离功能。(一主多从)