数据库拆分
通过某种特定的条件,按照某个唯独,将我们存放在用一个数据库中的数据分散存放到多个数据库(主机)上达到分散单库(主机)负载的效果
以mysql为例讲述下水平拆分和垂直拆分,mysql能容忍的数量级在百万静态数据可以到千万
垂直拆分
按照业务将表进行分类,把不同的表拆到不同的数据库中
优点:
- 拆分之后业务清晰,拆分规则明确
- 系统之间整合和扩展容易
- 数据维护简单
缺点
- 部分业务表无法jion只能用过接口方式解决,提高了系统复杂度
- 受每种业务不同的限制存在单库性能瓶颈,不易数据扩展和性能提高
- 事务处理复杂
水平拆分
垂直拆分后遇到单机瓶颈,可以使用水平拆分。按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据,水平拆分是把同一个表拆到不同的数据库中
优点
- 不存在单库大数据,高并发的性能瓶颈。
- 对应用透明,应用端改造较少
- 按照合理拆分规则拆分,join操作基本避免跨库
- 提高了系统的稳定性跟负载能力
缺点
- 拆分规则难以抽象
- 分片事务一致性难以解决
- 数据多次扩展难度跟维护量极大
- 跨库join性能较差
两张方式共同缺点
- 引入分布式事务的问题。
- 跨节点Join 的问题。
- 跨节点合并排序分页问题。
拆分原则
- 尽量不拆分,架构是进化而来,不是一蹴而就。(SOA)
- 最大可能的找到最合适的切分维度。
- 由于数据库中间件对数据Join 实现的优劣难以把握,而且实现高性能难度极大,业务读取 尽量少使用多表Join -尽量通过数据冗余,分组避免数据垮库多表join。
- 尽量避免分布式事务。
- 单表拆分到数据1000万以内。