分库分表
影响系统效率主要是两方面:磁盘IO,网络IO。
关系型数据库的数据都要持久化。
分库分表:本质在于分,数据离散。
分库,分表:垂直/水平
垂直分库:一个库中有多种表数据将不同类型的数据进行分组。商品库/订单库 ,全部数据按照类别分为三类。(电商平台,将数据分为商品库/用户库/订单库)
垂直分表:一个表中有多个字段,将常用字段和不常用字段拆开分为两张表。在查询数据时,网络携带数据少,网络IO速度就快。(用户表,将账号密码常用的分为一张表,性别爱好分为一张表)
垂直:
特性:
1.每个库(表)中的数据都不一样。
2.每个库(表)中的数据至少有一列一样
3.每个库(表)的并集是全量数据。
优点:
1.拆分和业务逻辑清晰(专库专表按照业务拆分)
2.实现动静分离,冷热数据分离设计体现。(手机话费充值,近一个月的在一张表,一个月前的在另一张表,定时同步,热数据,经常查询,冷数据:不经常查询)
3.数据维护简单,不同业务部署到不同机器上
缺点:
1.单表数据量大,读写压力大。???
2.受某种业务来决定,或者被限制,一个业务往往会影响到数据库的瓶颈(性能问题)TPS,一个库并发很高,会影响到其余库的性能。
3.部分数据不能联表join,只能通过java程序接口去调用,提供开发复杂度(商品信息/订单信息/会员信息)
水平:
特性:
1.每个库(表)的数据结构都一样。
2.每个库(表)的数据都不一样。
3.每个库(表)并集是全量数据。
优点:
1.单库(表)的数据维持在一定量,有助于性能提高(数据少了,性能自然上来了)
2.提高了系统的文稳定性和负载能力。
3.拆分的表结构相同,减少代码维护(表的实体类字段相同,不要做修改,垂直分库,表:表字段不一致,需要将实体类拆分维护)
缺点:
1.数据的扩容很有难度,维护量大。(水平分库,表,根据一定规则进行分,当数据量上来,需要添加库和表时需要维护)
2.拆分规则很难抽象出来。
3.分片事务一致问题,部分业务无法联表jion,只能通过java程序进行。
分库分表:设计考虑前端,后端,业务复杂程度。
前端:性能要求高,吞吐量大,业务简单。
后端:性能要求不高,业务复杂。
分库分表的:
缺点:
1.分布式事务。
2.分布式ID。
3.分页,排序问题。
4.联表join问题,增加了程序的复杂度。
如何解决分布式问题。
分布式中间件:TDDL(淘宝),ShardingSphere(sharding-JDBC),MyCat
应用层
jdbc:读写分离,会自动判断,性能高,不支持跨语言,支持跨数据库语言,是一个实现了JDBC协议应用
代理层
proxy: 由于要经过mycat所以性能低,支持跨语言,不支持跨数据库语言 ,是一个实现了MySQL协议的服务器
事务一致性问题
跨节点关联查询 join 问题
跨节点分页、排序、函数问题
全局主键避重问题
常用的分库分表工具如下:
Sharding-JDBC(当当)
TSharding(蘑菇街)
Cobar(阿里巴巴)
MyCAT(基于 Cobar)