分库分表的介绍(未完待续)

46 阅读5分钟

分库分表介绍

1、分库分表概述

分库分表本质上就是为了解决由于库表数据量过大而导致数据库性能降低的问题; 核心操作:

  • 将原来独立的数据库拆分成若干数据库组成;
  • 将原来的大表(存储近千万数据的表)拆分成若干个小表;

目的:使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的;

阿里开发手册: 单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表

image.png

2、分库分表场景示例

电商

分库分表方式

分库分表包括分库和分表两个部分,在生产中通常包括:垂直分库、水平分库、垂直分表、水平分表四种方式;

1、垂直分表

1.1垂直分表定义
  • 垂直分表就是在同一数据库内将一张表按照指定字段分成若干表,每张表仅存储其中一部分字段
  • 垂直分表拆解了原有的表结构,拆分的表之间一般是一对一的关系。
1.2垂直分表场景示例
1.2.1场景说明

image.png 说明:

  • 用户浏览商品列表时可能对于自己感兴趣的商品才会去查看商品的详细信息:商品详细描述信息被访问的频次较低,且该字段占用存储空间较大;
  • 商品表字段出现部分字段访问频次不一致的情况:商品名称、图片、价格、品牌等字段访问频次较高

考虑到访问频次的高低,我们可以考虑将商品信息表拆分如下,将访问频率高的字段放到一张表中,访问频率低的放到另外一张表中。

image.png

1.2.2 垂直分表优势
  • 充分提高了热点数据的操作效率,商品信息的操作的高效率不会被商品描述的低效率所拖累(冷热数据分离);
  • 避免了IO过度争抢并减少锁表的几率,查看商品详情的用户与商品信息浏览互不影响;
1.2.3 垂直分表原则
  • 把不常用的字段单独放在一张表;(因为数据库加载数据时,会将表整行信息加载)
  • 把text(大文本存储),blob(图片、视频类存储)等大字段拆分出来放在附表中;
  • 经常组合查询的列放在一张表中,避免多表联查,性能最高;

2、垂直分库

2.1 垂直分表存在的问题
  • 经过垂直分表后表的查询性能确实得到了一定程度上的提升,但数据始终限制在同一台机器内,因此每个表还是竞争同一个物理机的CPU、内存、网络IO、磁盘
  • 单台服务器的性能瓶颈(比如:CPU、内存、网络IO、磁盘等)通过垂直分表始终得不到突破;
2.2垂直分库定义

垂直分库是指按照业务将表进行归类,然后把不同类的表分布到不同的数据库上,而每个库又可以放在不同的服务器上,它的核心理念是-专库专用

2.3 示例场景

image.png

2.4 垂直分库优势

垂直分库带来的提升是:

  • 通过不同表的业务聚合(聚合为库),使得数据库维护更加清晰;
  • 能对不同业务的数据进行分级管理、维护、监控、扩展等;
  • 高并发场景下,垂直分库在一定程度上提高了磁盘IO和数据库连接数,并改善了单机硬件资源的瓶颈问题;

但是,垂直分库依然没有解决库中单表数据量过大的问题!

3、水平分表

3.1 水平分表定义
  • 水平分表就是在同一数据库内,把同一个表的数据按一定规则拆到多个表中,表的结构没有变化;
  • 水平分表解决单表数据量大的问题;
3.2 水平分表优势

水平分表是在同一个数据库内,把同一个表的数据按一定规则拆到多个表中,它带来的提升是:

  • 优化单一表数据量过大而产生的性能问题;
  • 避免IO争抢并减少锁表的几率;

整体看,水平分表仅仅解决了单表数据量过大的问题,但是没有单库数据量过大的问题;

4、水平分库

4.1 水平分库定义
  • 水平分库可以看做是水平分表的进一步拆分,是把同一个表的数据按一定规则拆到不同的数据库中,每个库又可以部署到不同的服务器上;
  • 水平分库解决了单库数据量大的问题,突破了服务器物理存储的瓶颈;
4.2 水平分库优势

水平分库带来的提升是:

  • 解决了单库大数据,高并发的性能瓶颈问题;
  • 提高了系统的稳定性及可用性;

总之,当一个应用难以再细粒度的垂直切分,或切分后数据量行数巨大,存在单库读写、存储性能瓶颈,这时候就需要进行水平分库了,经过水平切分的优化,往往能解决单库存储量及性能瓶颈。但由于同一个表被分配在不同的数据库,需要额外进行数据操作的路由工作,因此大大提升了系统复杂度。

5、 分库分表带来的问题

分库分表能有效的缓解了单机和单库带来的性能瓶颈和压力,突破网络IO、硬件资源、连接数的瓶颈,同时也带来了一些问题。

  • 分布式事务一致性问题
  • 跨节点关联查询
  • 跨节点分页、排序函数
  • 主键避重
  • 公共表(小数据量的表且经常使用,可能存在联查的情况) 显然如果我们自己去解决上述问题,开发工作量较大,所以我们就有必要学习一种支持分库分表特性的技术;sharding-jdbc、mycat等;