MySQL 分库分表设计

本文详细介绍了MySQL分库分表的场景、原因及各种拆分方法,包括垂直拆分和水平拆分,以及基于Hash、Range和List的常见方案。此外,还探讨了分库分表后的扩容缩容策略和业界优秀方案。

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


MySQL 分库分表场景

针对频繁写更新和读操作较少的数据特点,如日志,聊天信息等 可用 MySQL 5.7 的分区特性来处理这类数据。

1. 用户类的数据
  • 用户认证信息
  • 用户基本资料
  • 用户好友关系
2. 电商业务
  • 商品信息
  • 订单信息
  • 商品配送信息
3. 将功能拆分成更小的功能

商城内所有数据存储在一个DB/集群中, proxy之下挂载多个 DB,则可能出现某个节点挂掉从而影响全局,可将一些功能垂直拆分成更小的功能,例如可将订单表拆分成 买家订单表和卖家订单表,即将数据从不同角度冗余存储两份。

MySQL 为什么要分库分表

做分库分表前要考虑是否到了必须分的时刻了,使用 MySQL 5.7 的分区功能能不能解决此类问题

  • 单表行数太多出现性能捌点
    单表行数在1 kw~1.5 kw左右进行拆分, 控制 btree 高度 <=3
  • 单表物理太大,不方便管理
  • 单实例超过1T,不方便管理
  • 单表并发太多,锁争用明显
  • 实例并发太高,锁争用明显
MySQL 数据库拆分方法
垂直拆分

在考虑拆分数据库时,一般情况下,应先考虑垂直拆分。

垂直 含义:

拆分出来的库表结构之间是互相独立的,没有业务上的来呢西。

数据库垂直拆分依赖规则

  • 如果一个实例中存储着多个业务的数据,而每个业务直接关联性不大,则可将每个业务拆分为单独的实例/库/表
  • 如果在一个实例上有多个数据库,那么从分摊读写压力的角度来考虑,则可以将每个数据库拆分到单独的实例上。
  • 如果在一个库里面有多张表,则可将每张表拆分到不同的实例上
  • 如果有一张具有很多字段的表,每个字段都有不同的含义, 例如 user 表里有姓名,生日,地址等个人信息,那么当该表行记录量太大时,就可以将每个字段独立出来拆分为一张新表。例如 user_birth 表,可以只有两个字段:user_id, user_birthday。
水平拆分
常见的分库分表方案
基于Hash

通过对 user_id 取模的方式,将一张表分成 M 份。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值