数据库分为垂直切分和水平切分
垂直切分
把不同的表放在不同的数据库中,一般安装模块进行拆分如:用户系统,订单系统,支付系统
优点:拆分后业务清晰,拆分规则明确;
系统之间整合或扩展容易;
数据维护简单。
缺点:
部分业务表无法 join,只能通过接口方式解决,提高了系统复杂度;
受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高;
- 事务处理复杂。
由于垂直切分是按照业务的分类将表分散到不同的库,所以有些业务表会过于庞大,存在单库读写与存储瓶
颈,所以就需要水平拆分来做解决。
1.水平拆分
通过一定的规则把表的数据拆分到不同的数据库中,比如用户模块,可以根据用户id 一定的规则进行拆分如:
尽量做到模块表之间join在单库中执行
优点:
- 拆分规则抽象好,join 操作基本可以数据库做;
- 不存在单库大数据,高并发的性能瓶颈;
- 应用端改造较少;
- 提高了系统的稳定性跟负载能力。
缺点:
- 拆分规则难以抽象;
- 分片事务一致性难以解决;
- 数据多次扩展难度跟维护量极大;
- 跨库 join 性能较差。
前面讲了垂直切分跟水平切分的不同跟优缺点,会发现每种切分方式都有缺点,但共同的特点缺点有:
- 引入分布式事务的问题;
- 跨节点 Join 的问题;
- 跨节点合并排序分页问题;
- 多数据源管理问题。
由于数据切分后数据 Join 的难度在此也分享一下数据切分的经验:
- 第一原则:能不切分尽量不要切分。
- 第二原则:如果要切分一定要选择合适的切分规则,提前规划好。
- 第三原则:数据切分尽量通过数据冗余或表分组(Table Group)来降低跨库 Join 的可能。
- 第四原则:由于数据库中间件对数据 Join 实现的优劣难以把握,而且实现高性能难度极大,业务读取尽量 少使用多表 Join