08分库分表

155 阅读2分钟

1.基本概念

读写分离:依靠数据复制备份到从库,增加了抵抗大量并发读请求的能力,同时冗余备份保证了数据不丢失。

image.png

随着数据量的增加,诞生的问题:

  • 单表数据量超过千万,导致查询性能低
  • 单机数据量增大
  • 数据库怎么做到故障隔离
  • 数据库怎么应对更大的写请求

解决以上问题(性能+读写文图)的核心思路,将数据进行分片,分摊压力

坑:

查询时不使用分区键

大量连表查询

依照某种策略将数据尽量平均的分配到多个数据节点或者多个表中,每个节点保存部分数据,可以减少存储量,提升并发读写量

2.如何对数据库做垂直拆分

核心思想:专库专用,目的是为了实现故障隔离

按照业务类型进行拆分,将业务耦合度较高的表拆分到单独的库中

只能暂时环节存储容量的瓶颈

image.png

3.如何对数据库做水平拆分

核心思想:将单一数据表按照某种规则拆分到多个数据库和数据表中

拆分规则:按照某个字段hash后进行拆分+按照某一字段区间进行拆分

查询方式由直接查询 转换为 先确定存储位置,再查询

3.1hash拆分

实现:将某一个字段按照hash值进行计算,在对hash值进行取余

适用:适用于实体表(一对一查询,不会范围查询)

image.png

3.2区间拆分

实现:按照字段取消进行拆分(通常适用时间字段)

适用:适合按照拆分维度进行范围查询

image.png

4.解决分库分表的问题

问题:引入了分库分表键(分区键),分库分表依据的字段

每次查询必须带上分区键,否则需要遍历所有的库和表

解决思路:建立查询数据与分区键的映射关系

问题:连表查询变得困难

解决:通过业务代码进行处理(count可以记为缓存)

5.小计

虽然分库分表会引入新的问题,但是真正的突破的单机的限制

分库分表=纵向拆分+横向拆分

实现=查询带上分区键+总数单独存储

分库分表原则:

  • 没有性能瓶颈不做分库分表
  • 做就需要一步到位,避免多次扩容
  • 在特定场景下,通过NOSQL代替MySQL