分库分表使用场景&如何实现

What?
分库
由单个数据库实例拆分为多个数据库实例
分表
由单张表拆分为多张表

Why?
业务数据量和网站QPS的日益增高,单机版数据库在存储和并发上会出现瓶颈
1、NoSQL,减少对事务的支持和复杂语句的查询来提高性能
2、分库分表,分散单台设备负载

How?
拆分方式(垂直、水平)
垂直分库
基于表,根据业务逻辑拆分或集成公共模块拆分
–用户表和订单表,单点登录,鉴权模块
特点
1、每个库的表、数据都不一样,没有交集
2、每个库相对独立,模块化
使用场景
1、可以抽象出单独的业务模块
垂直分表
将一个表,按照字段拆分,根据字段的活跃性、字段长度拆分到不同的表中
特点
1、每个表的结构和数据都不一样
2、有一个关联字段(主键或外键)用来关联其它兄弟表
3、所有表的并集是全量数据
使用场景
1、热点字段单独切到一张表中
(innodb行锁)
2、有大字段,比如text单独切到一张表(可以降低磁盘IO消耗,innodb的数据和索引在同一个文件中)
3、有明显的业务区分,有利于业务扩展
垂直分没有解决单表数据量大的问题
水平分库
按行数据,拆分到不同的数据库中
特点
1、每个库有这张表的部分数据
使用场景
1、分表无法满足数据量过大的存储,并且没有明显的业务归属来垂直分库
2、主库磁盘接近饱和
水平分表
按行数据进行切分,拆分成几个结构相同的表,解决单表数据量过大的问题
特点
1、每个表的结构一样但数据不一样,没有交集
2、所有表的并集是全量数据
使用场景
单表的数据量过大或增长速度很快,严重影响SQL查询效率,增加CPU负担
综上,如有需要在系统设计阶段完成垂直分库分表,数据量不断增加持续增长,(先考虑缓存、读写分离、SQL优化)再考虑水平分库分表

水平拆分常用方案
根据特定字段进行拆分,把路由的key按照指定算法进行路由存放
1、hash取模
将指定的路由key对 分表总数 进行取模
假定id为整型,预估数据总量4000万,分表数4
id=1,1%4=1,存放到A1中
id=4,4%4=0,存放到A0中

非整型就取key的哈希值
优点
数据均匀存放,不会有热点问题
缺点
数据迁移和扩容,难度较大
上述例子,总表数4,扩容为8,那取模的基数由4变为8,此时再去查询id=4的数据,就查不到。

id=4,4%8=4,存放到表A4中
//按原算法是存到表A0中的
2、range范围
假定id为整型,设定单表数据量为1000。
id=2,存到表A0中
id=1200,存到表A1中
优点
数据量持续增长即使扩容也不需要做数据迁移
缺点
短时间内单表过热,所有的数据都集中在一张表上
综上
hash取模,没有热点问题,但扩容时需要迁移
range方案,不需要数据迁移,但有热点问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值