掌握MySQL分库分表(三)水平分库分表常见策略range、hash

文章探讨了两种数据库分库分表策略:基于Range的ID范围分表,常用于自增ID且按时间或空间范围划分;以及Hash取模策略,用于均匀分散数据,防止热点问题。Range策略在自增ID场景下易于扩展,但可能导致数据倾斜,而Hash策略虽扩容困难,但能较好地平衡数据分布。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

水平分库分表,根据什么规则进行划分?

range策略

自增id,根据ID范围进行分表(左闭右开)

规则案例:

  1. 1~1,000,000 是 table_1
  2. 1,000,000 ~2,000,000 是 table_2
  3. 2,000,000~3,000,000 是 table_3
    … …省略

优点

  1. id是自增长,可以无限增长
  2. 扩容不用迁移数据
  3. 容易理解和维护

缺点

  1. 大部分读和写都访会问新的数据,有IO瓶颈,整体资源利用率低
  2. 数据倾斜严重,热点数据过于集中,部分节点有瓶颈

Range策略延伸

范围角度思考
数字:
1.自增id范围

时间:
1.年、月、日范围
2.比如按照⽉份⽣成 库或表 pay_log_2022_01、pay_log_2022_02

空间:
1.地理位置:省份、区域(华东、华北、华南)
2.比如按照 省份生成库或表

基于Range范围分库分表业务场景

  1. 微博发送记录、微信消息记录、⽇志记录,id增长/时间分区 都行
    水平分表为主,水平分库则容易造成资源的浪费

  2. 网站签到等活动流水数据时间分区最好
    水平分表为主,水平分库则容易造成资源的浪费大区划分(⼀⼆线城市和五六线城市活跃度不⼀样,如果能避免热点问题,即可选择)

  3. saas业务水平分库(华东、华南、华北等)

hash取模

Hash分库分表是最普遍的方案

案例规则

用户ID是整数型的,要分2库,每个库表数量4表,⼀共8张表
用户ID取模后,值是0到7的要平均分配到每张表

库ID = userId % 库数量(2)
表ID = userId / 库数量(2) % 表数量(4)

优点:1.保证数据较均匀的分散落在不同的库、表中,可以有效的避免热点数据集中问题
缺点:1.扩容不是很方便,需要数据迁移

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆浆两块钱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值