分库分表个人思路

2023-11-02

一、两种方案分库分表和自研方案

一般业界,对订单数据的分库分表,有两类思路:按照订单号来切分、按照用户id来切分。

方案一、按照订单号来做 hash分散订单数据

  把订单号看作是一个字符串,做 hash,分散到多个服务器去。

具体到哪个库、哪个表存储数据呢?订单号里面的数字来记录着。

如果要查询某用户的所有订单呢?

由于是根据订单号来分散数据的。他的订单分散在了多个库、多个表中。

总不能去所有的库,所有的表扫描吧。这样效率很低。

解决:维护uid和oid的关系表, 此表可以作为缓存,当数据量增大时此关系表也要进行分表。

一般使用方案二的比较多,一个用户的所有订单,都在一张表里面,那么做分页展示的时候,就容易。

方案二、按照用户 id 打散订单数据

以uid来切分数据,有两种思路:

第一种是,某个范围的uid订单到哪些库。0到2千万uid,对应的订单数据到a库、a表。2千万到4千万对应的订单到b库。

为什么这种方案用得比较少呢?

容易出现瓶颈吗。某个范围内的用户,下单量比较多,那么造成这个库的压力特别大。其他库却没什么压力。

第二种是,使用uid取模运算。第二种方案业界用得比较多。

一方面、处理简单,程序上做取模运算就好了。

另一方面、使用取模的方式,数据比较均匀分散到多个库去了。不容易出现单个库性能瓶颈。

但是不好处也有:即要扩容的时候,比较麻烦。就需要迁移数据了。

要扩容的时候,为了减少迁移的数据量,一般扩容是以倍数的形式增加。比如原来是8个库,扩容的时候,就要增加到16个库,再次扩容,就增加到32个库。这样迁移的数据量,就小很多了。这个问题不算很大问题,毕竟一次扩容,可以保证比较长的时间,而且使用倍数增加的方式,已经减少了数据迁移量。

下面分析一下按照用户id取模的方式分库分表。

按照用户id作为key来切分订单数据,具体如下:

1、 库名称定位:用户id末尾4位 Mod 32。

Mod表示除以一个数后,取余下的数。比如除以32后,余下8,余数就是8。

代码符号是用%表示:15%4=3。

2、表名称定位:(用户id末尾4位 Dev 32) Mod 32。

Dev表示除以一个数,取结果的整数。比如得到结果是25.6,取整就是25。

代码用/来表示:$get_int = floor(15/4)。15除以4,是一个小数3.75,向下取整就是3。一定是向下取整,向上取整就变成了4了。

按照上面的规则:总共可以表示多少张表呢?32个库*每个库32个表=1024张表。如果想表的数量小,就把32改小一些。

库ID = userId % 库数量4 表ID = userId / 库数量4 % 表数量8

或者 库ID = userId / 表数量4 % 库数量4 表ID = userId % 表数量8

上面是用计算机术语来表示, 下面用通俗的话描述。

1、库名称计算

用户id的后4位数,取32的模(取模就是除以这个数后,余多少)。余下的数,是0-31之间。

这样可以表示从0-31之间,总共32个数字。用这个32个数字代表着32个库名称:order_db_0、order_db_2.........................order_db_31

2、表名称计算

最后要存储定到哪个表名里面去呢?

用户id的最后4位数,除以32,取整数。将整数除以32,得到余数,能够表示从0-31之间32个数字,表示表名称。

表名称类似这样:order_tb_1、order_tb_2..........................order_tb_31。一个库里面,总共32个表名称。

比如用户id:19408064,用最后4位数字8064除以32,得到是251.9,取它的整数是251。

接着将251除以32,取余数,余数为27。

为了保持性能,每张表的数据量要控制。单表可以维持在一千万-5千万行的数据。1024*一千万。哇,可以表示很多数据了。

三、思考优点和缺点

优点

订单水平分库分表,为什么要按照用户id来切分呢?

好处:查询指定用户的所有订单,避免了跨库跨表查询。

因为,根据一个用户的id来计算节点,用户的id是规定不变的,那么计算出的值永远是固定的(x库的x表)

那么保存订单的时候,a用户的所有订单,都是在x库x表里面。需要查询a用户所有订单时,就不用进行跨库、跨表去查询了。

缺点

缺点在于:数据分散不均匀,某些表的数据量特别大,某些表的数据量很小。因为某些用户下单量多,打个比方,1000-2000这个范围内的用户,下单特别多,

而他们的id根据计算规则,都是分到了x库x表。造成这个表的数据量大,单表的数据量撑到极限后,咋办呢?

总结一下:每种分库分表方案也不是十全十美,都是有利有弊的。目前来说,这种使用用户id来切分订单数据的方案,还是被大部分公司给使用。实际效果还不错。程序员省事,至于数据量暴涨,以后再说呢。毕竟公司业务发展到什么程度,不知道的,项目存活期多久,未来不确定。先扛住再说。

思考一、b2b平台的订单分卖家和买家的时候,选择什么字段来分库分表呢?

上面讨论的情况是,b2c平台。订单的卖家就一个,就是平台自己。

b2b平台,上面支持开店,买家和卖家都要能够登陆看到自己的订单。

先来看看,分表使用买家id分库分表和根据卖家id分库分表,两种办法出现的问题

如果按买家id来分库分表。有卖家的商品,会有n个用户购买,他所有的订单,会分散到多个库多个表中去了,卖家查询自己的所有订单,跨库、跨表扫描,性能低下。

如果按卖家id分库分表。买家会在n个店铺下单。订单就会分散在多个库、多个表中。买家查询自己所有订单,同样要去所有的库、所有的表搜索,性能低下。

所以,无论是按照买家id切分订单表,还是按照卖家id切分订单表。两边都不讨好。

淘宝的做法是拆分买家库和卖家库,也就是两个库:买家库、卖家库。

买家库,按照用户的id来分库分表。卖家库,按照卖家的id来分库分表。

实际上是通过数据冗余解决的:一个订单,在买家库里面有,在卖家库里面也存储了一份。下订单的时候,要写两份数据。先把订单写入买家库里面去,然后通过消息中间件来同步订单数据到卖家库里面去。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分库分表个人思路 的相关文章

  • 数学-麦克劳林公式

    麦克劳林公式是泰勒公式 在 记 的一种特殊形式 在不需要余项的精确表达式时 n阶泰勒公式也可写成 由此得近似公式 误差估计式变为 在麦克劳林公式中 误差 R x 是当x 0时比x 高阶的无穷小 若函数f x 在开区间 a b 有直到n 1阶
  • DiffusionDet: Diffusion Model for Object Detection

    DiffusionDet Diffusion Model for Object Detection 论文概述 不同之处 整体流程 论文题目 DiffusionDet Diffusion Model for Object Detection
  • C#连接sql的两种方法

    数据库连接 方法1 using System using System Collections Generic using System Linq using System Text using System Threading Tasks
  • H - Nine Packs Kattis - ninepacks

    题目链接 题意就是在a数组中找出x个数 b数组中找出y个数 且x个数之和等于y个数之和 本想着用暴力的写法 但是出来之后不对 因为此题并不是连续的 还可以跳着取数 下面是WA的代码 include
  • 基于Web的网络在线考试系统

    基于Web的网络在线考试系统 一 系统简介 本系统是一种基于Web的网络在线考试系统 各个模块主要从JSP Servlet JDBC JavaBean四部分技术角度出发搭建框架 其中Servlet是运行在服务器端的程序 被Web服务器 To
  • YARN 状态机的原理和使用

    有了异步处理 为什么还需要状态机 可以保存对象当前的状态 当接收到一个事件后 可以根据不同的状态 可以方便的决定怎么处理 如接收到用户发送的KILL事件时 当Job的状态为正在初始化时 只要把启动的进程kill就可以 当Job的状态为正在运
  • 快手app sig3 42位、48位参数分析

    免责任声明 任何可操作性的内容与本文无关 文章内容仅供参考学习 如有侵权 损害贵公司利益 请联系作者 会立刻马上进行删除 在抓包的时候 会发现有几个非常重要的参数 sig 和 sig3 然后sig参数的计算逻辑大概就是对请求url 后面的参
  • 1:1病例对照匹配的Python实现步骤详解

    这周接到一个活 因为某个课题研究需要 须把脑卒中患者的名单和一份健康人 对照 名单按照 性别相同 乡镇地址相同 年龄相差3岁以内 作为匹配条件进行1 1的匹配 现将思考及实现的过程逐一记录并在此分享 希望能给大家有所借鉴与帮助 拿到这份数据
  • VM-基本功能

    VMware专题 介绍 VM 基本功能 一 VMware Tools基本特性 二 快照功能 三 Template技术介绍 1 用Template技术批量部署虚拟机 先创建自定义规范 2 部署虚拟机 四 创建虚拟机参数说明 五 虚拟机内存技术
  • [记录]GAN学习之路[持续更新]

    目录 一 原始GAN 二 WGAN GP 三 pix2pix 四 CycleGAN 一 原始GAN 通俗解释 GAN由生成器 Generator 和判别器 Discriminator 组成 生成器负责生成假的图片来骗过判别器 而判别器需要不
  • mesh 模拟加入噪音数据,并根据每个三角形集群的数量进行去噪处理(附open3d python 代码)

    本篇文章对三角网格模型进行分割和去噪处理 其中包括以下主要步骤 1 使用Open3D库中的 o3d io read triangle mesh 函数读取PLY格式的三角网格模型 2 生成小立方体作为噪声 并将其添加到原始的三角网格模型中 3
  • response.sendRedirect(url)中的url问题

    servlet实现跳转页面时 对于重定向response sendRedirect url 对于参数url 一直引用的是本地上的html而且使用的是绝对路径 但是这个不能实现重定向 后来了解到这个url应该是指向在任何服务器上的项目的url

随机推荐

  • 【Tensorflow2.0】7、全流程model.fit模型训练方法

    文章目录 第一种方法直接用keras的fit方法 以fashion mnist为例 配置超参数 选择指定显卡及自动调用显存 准备数据 使用tf data来准备训练集和测试集 准备模型定义 开始定义模型 用functional方法 打印模型结
  • SoapUI 5.2.1测试接口

    俗话说 好记性不如烂笔头 今天我们就来介绍下SopaUI如何测试接口 首先我们新建一个WebService public class WebService System Web Services WebService WebMethod p
  • 双指针实现链表反转

    题目 定义一个函数 输入一个链表的头节点 反转该链表并输出反转后链表的头节点 示例 输入 1 gt 2 gt 3 gt 4 gt 5 gt NULL 输出 5 gt 4 gt 3 gt 2 gt 1 gt NULL 代码实现 Definit
  • 华为OD机试 -查找两个字符串a,b中的最长公共子串(C++ & Java & JS & Python)

    描述 查找两个字符串a b中的最长公共子串 若有多个 输出在较短串中最先出现的那个 注 子串的定义 将一个字符串删去前缀和后缀 也可以不删 形成的字符串 请和 子序列 的概念分开 数据范围 字符串长度1 300 1 length 300 进
  • hadoop 2.6遇到的DataNode无法启动问题

    一 问题描述 当我们多次格式化文件系统 hadoop namenode format 时 会出现DataNode无法启动 多次启动中发现有NameNode节点 并没有DataNode节点 如图所示 二 查看问题 回头看启动过程 注意如下 l
  • php在远程获取图片生成文件为空文件

    之前遇到一个很坑爹的问题 就是去获取远程图片的文件流生成本地文件时 发现生成的是空白文件 说明只是创建了文件 没把文件流写进去 之前一直以为是网站设置了权限什么的东西 最后百度了下发现了原来是php ini的openssl没开启 解决方法就
  • 由于电脑出现msvcr110.dll提示错误的解决方法

    最近 我在尝试运行一款新的软件时 突然遇到了一个错误提示 提示说缺少msvcr110 dll文件 导致软件无法启动 在使用电脑过程中 我们常常会遇到一些系统文件丢失的问题 其中 msvcr110 dll是Windows操作系统中的一个重要的
  • 读书笔记-视觉综述翻译_数据集介绍

    4 数据集介绍 4 1 计算机视觉 4 1 1 目标识别 诸如ImageNet 160 PASCAL VOC和Microsoft COCO之类的大规模公开可用数据集的出现 推动了新颖的计算机视觉算法 特别是深度学习技术 的发展 用于对象等识
  • 解决c++错误:redefinition of class xxx

    错误类型 redefinition of class xxx 错误点 一般出现错误 redefinition of class xxx 同时也会有错误 previous definition of class xxx 解决方法 一般来说出错
  • 【机器学习实战】7、利用 AdaBoost 元算法提高分类性能

    文章目录 7 1 集成方法 7 1 1 bagging 自举汇聚法 7 1 2 随机森林 Random Forest RF 7 1 3 boosting 提升方法 7 1 4 Bagging Boosting二者之间的区别 7 1 5 总结
  • 基于STM32的机器学习(手势识别)

    第一次写博客 希望能给研究单片机AI的同仁一个好的启示 如有不当 多多指正 STM32自从2019年开始发布AI库以来 网络上关于怎么移植到单片机的资料少得可怜 能找到的也仅仅是新建工程的博客 对我有较大启示的是ST官方的几篇文章 我将对我
  • Compile error in arch/x86/kernel/entry_64.S

    编译kernel 2 6 38提示错误 Compile error in arch x86 kernel entry 64 S arch x86 kernel entry 64 S 1544 Error size expression fo
  • C++ primer plus 第六版课后作业和题——第二章第三题

    题目 编写一个C 程序 它要求使用3个自定义函数 包括main 函数 并生成下面的输出 Three blind mice Three blind mice See how they run See how they run 其中一个函数要调
  • 3. redis cluster集群运维与核心原理剖析

    分布式缓存技术Redis 1 Redis集群方案比较 2 Redis高可用集群搭建 3 Java操作redis集群 4 Redis集群原理分析 5 Reid高可用集群之水平扩展 本文是按照自己的理解进行笔记总结 如有不正确的地方 还望大佬多
  • Sublime Text 使用介绍、全套快捷键及插件推荐

    开篇 如果说Notepad 是一款不错Code神器 那么Sublime Text应当称得上是神器滴哥 Sublime Text最大的优点就是跨平台 Mac和Windows均可完美使用 其次是强大的插件支持 几乎无所不能 开始使用Sublim
  • stm32毕设 STM32的环境质量监测系统(源码+原理图+论文)

    文章目录 0 前言 1 设计架构 功能设计 2 原理图 3 软件设计 4 实现效果 5 相关代码 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟
  • 计算机视觉与机器学习之学习记录一(环境配置与安装+笔记分享)

    一 Pytorch及CUDA安装注意事项 依据参考资料 3 通过NVIDA控制面板查看计算机使用的GPU驱动程序版本 依据参考资料 2 及计算机GPU驱动程序版本 查阅显卡驱动对应的CUDA版本 依据参考资料 3 分别下载对应版本的CUDA
  • python中prompt的意思_python中的prompt是什么意思,怎么用

    查看 5468 回复 9 已解决 python中的prompt是什么意思 怎么用 当前离线UID日志 相册 贡献 荣誉 积分 电梯直达 发表于 2019 5 26 22 08 12
  • 高性能、高适配,SSD 孪生兄弟出场即 C 位

    内容导读 PyTorch 1 9 同步更新了一些库 包括 TorchVision 中新增的 SSD 和 SSDlite 模型 与 SSD 相比 SSDlite 更适用于移动端 APP 开发 SSD 全称 Single Shot MultiB
  • 分库分表个人思路

    一 两种方案分库分表和自研方案 一般业界 对订单数据的分库分表 有两类思路 按照订单号来切分 按照用户id来切分 方案一 按照订单号来做 hash分散订单数据 把订单号看作是一个字符串 做 hash 分散到多个服务器去 具体到哪个库 哪个表