分库分表理论篇——以MySQL为例

MySQL
337
0
0
2022-04-03

一、背景

当今互联网大爆炸的时代,业务越来越多和大,单库单表数据超出数据库支持容量,数据库I/O操作次数会越来越多和慢,数据库的整体性能就会急剧下降。

二、如何优化

这里我想到几种优化的方法

  • 减少数据库访问压力
  1. 使用缓存技术,对数据库的信息进行缓存,减少数据库访问压力
  2. 使用Nginx进行静态资源的获取,对一些高访问的网页,一次访问时可以先生成静态页面存到本地中,用户再次访问就会直接返回,这样减少与数据库的交互和渲染页面的操作,提高效率
  3. 读写分离

互联网业务一般读多写少,读写比例基本是10:1。比如订单业务,顾客购买商品生成一次订单后,就会多次查看订单情况。这时可以采用主从架构,主库负责DML(增删改)操作,从库负责DQL(查看操作),一个主库可以有多个从库,极大减轻读写压力

  • 提升数据库性能
  1. 可以从机器性能入手,内存不够加内存条,外存( 如硬盘 )不够加外存,这样即使数据量在大,也不会影响I/O读写速率,但是,数据量大会增加I/O的次数,数据库性能依旧会下降,不推荐,成本太高,没钱花,/(ㄒoㄒ)/~~
  2. 优化数据库索引,数据库语句,这个我将会写篇博客,具体介绍
  3. 分库分表

分库分表要按业务进行拆分,具体后面会说。主要是打破单库单表的情况,数据存在多库多表中。打个比方,100W条数据存在10个库中,10个库有10张相同的表,那么一张表存的数据就会1W条左右,这样减低数据库的容量,提升I/O操作速率,提高数据库的性能

三、什么是分库分表

分库分表,顾名思义就是拆分数据库和拆分数据表。问题就来了,要怎么拆分数据库和数据表呢?

这里用一张电商的数据库的ER图拆分

分库分表理论篇——以MySQL为例

  • 垂直拆分( 以电商ER图拆分 )
  1. 垂直拆库:按照业务拆分,业务耦合性低的数据表拆分到不同数据库中。比如电商数据库拆分成用户库、商品库、订单库…但是,不是什么表都可以分库的,例如:订单库有订单表和订单明细表,这两张表耦合性高,必须放在一起
  2. 垂直拆表:按照数据表的字段热点(就是使用频率高)和字段存储类型进行拆分。比如电商中商品不是有文字描述吗?可是我们一般看商品的标题,价格,图片,对于文字描述字段一般点进去才看(查看频率不如前者高),那么我们可以把商品表除文字描述这些大字段拆分出另一张表使用,提高查询性能

PS:拆分大字段还有另一个原因,因为大字段读取时间长,数据量大的话,影响I/O的读取效率

分库分表理论篇——以MySQL为例

  • 特点:
  1. 每个库(表)的结构都不一样
  2. 每个库(表)的数据都(至少有一列)一样
  3. 每个库(表)的并集是全量数据
  • 水平拆分( 以电商ER图拆分)
  1. 水平拆库:把单个数据库的数据拆分成多个相同结构数据库存储
  2. 水平拆表:把单表的数据量拆分成多个相同结构表存储

分库分表理论篇——以MySQL为例

  • 以上两者合并达到分库分表

分库分表理论篇——以MySQL为例

  • 特点:
  1. 每个库(表)的结构都不一样
  2. 每个库(表)的数据都(至少有一列)一样
  3. 每个库(表)的并集是全量数据

四、优势和弊端

  • 优点:
  1. 减少数据库的访问压力和单个存储容量
  • 弊端:
  1. 增加了我们维护成本,毕竟多个数据库和数据表维护
  2. 分布式事务(跨库事务),比如:处理一个业务需要执行多条插入语句,每条在不同机器的不同数据库中,出现问题,如何回滚
  3. 跨库join,因为在不同数据库中,就无法使用join命令获取信息