目的
分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成 ,将数据大表拆分成若干数据表组成,使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的
方式:垂直分库、水平分库 、垂直分表、水平分表
详细介绍如下
垂直分库
按照业务将表进行分类,分布到不同的数据库上面,每个库可以放在不同的服务器上,它的核心理 念是专库专用。(商品库、门店库)
带来的提升
1. 解决业务层面的耦合,业务清晰
2. 能对不同业务的数据进行分级管理、维护、监控、扩展等
3. 高并发场景下,垂直分库一定程度的提升IO、数据库连接数、降低单机硬件资源的瓶颈
垂直分表
将一个表按照字段分成多表,每个表存储其中一部分字段
它带来的提升是:
1.为了避免IO争抢并减少锁表的几率,查看详情的用户与商品信息浏览互不影响
2.充分发挥热门数据的操作效率,商品信息的操作的高效率不会被商品描述的低效率所拖累
两者区别: 垂直分库是按业务进行分库
垂直分表是按(列)字段进行分表
水平分库
是把同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器上。
它带来的提升是:
- 解决了单库大数据,高并发的性能瓶颈。
- 提高了系统的稳定性及可用性。
水平分表
是在同一个数据库内,把同一个表的数据按一定规则拆到多个表中,在无法继续水平分库情况下, 为减少单表数据量所采用
它带来的提升是:
- 优化单一表数据量过大而产生的性能问题
- 避免IO争抢并减少锁表的几率
水平分库和水平分表区别:可理解为水平分表为水平分库的进一步优化
小结:
垂直分表:可以把一个宽表的字段按访问频次、是否是大字段的原则拆分为多个表,这样既能使业务清晰,还能提升部分性能。拆分后,尽量从业务角度避免联查,否则性能方面将得不偿失。
垂直分库:可以把多个表按业务耦合松紧归类,分别存放在不同的库,这些库可以分布在不同服务器,从而使访问压力被多服务器负载,大大提升性能,同时能提高整体架构的业务清晰度,不同的业务库可根据自身情况定制优化方案。但是它需要解决跨库带来的所有复杂问题。
水平分库:可以把一个表的数据(按数据行)分到多个不同的库,每个库只有这个表的部分数据,这些库可以分布在不同服务器,从而使访问压力被多服务器负载,大大提升性能。它不仅需要解决跨库带来的所有复杂问题,还要解决数据路由的问题(数据路由问题后边介绍)。
水平分表:可以把一个表的数据(按数据行)分到多个同一个数据库的多张表中,每个表只有这个表的部分数据,这样做能小幅提升性能,它仅仅作为水平分库的一个补充优化。
何时采用垂直或水平
一般来说,在系统设计阶段就应该根据业务耦合松紧来确定垂直分库,垂直分表方案,
比如表结构设计,库:核心业务库、报表库、日志库
在数据量及访问压力不是特别大的情况,首先考虑缓存、读写分离、索引技术等方案。若数据量极大,且持续增长,再考虑水平分库水平分表方案
优点
分库分表能有效的缓解了单机和单库带来的性能瓶颈和压力,突破网络IO、硬件资源、连接数的瓶颈
缺点
1.事务一致性
由于分库分表把数据分布在不同库甚至不同服务器,不可避免会带来分布式事务问题
2.跨节点关联查询
3.跨节点分页、排序函数