如何应对MySQL单表数据量过大:垂直分表与水平分表策略解析

话接上回,单表最大数据建议两千万,那如果开发一个项目,预计注册量达到一个亿怎么办。

单表内放这么多数据,MYSQL底层B+树的层级结构就可能会变得很高,磁盘io次数变多,性能会大幅度降低。所以考虑数据库分表。

这里的分表分为垂直分表和水平分表两种。

垂直分表:

原理比较简单,一般就是把某几列拆成一个新表,这样原来的表就小了,拆几列出去,那数据表里的每行数据就会变少,单个16K数据页就能放入越多的行数,这样发生查询时需要的数据页就会越少,那磁盘IO也会越少,所以性能就会越快。

水平分表:

水平分表有好几种做法,但不管是哪种,本质上都是将原来的user表变成USER0到user_n这样的N张小,每一张小表里只保存了一部分数据,一般是500万到2000万。

第一种:根据ID取模分表

假设我们一共分了两张表,分别是user_0和user_1,此时模等于2,我们将输入的ID与模进行求余数操,如ID=2,4,6的时候,会被写到user_0这张表。ID=1,3,5和2取模得到1,于是就能知道应该写到user_1这张表里。

优点:

        比较简单

        读写数据都可以很均匀的分摊到每个分表上

缺点:如果想要扩展表的个数,比如从两张表变成3张表,那同样还是ID=3的数据,以前3和2取模得到1,所以ID=3的数据会放在USER1表里,现在3和3取模得到0,那就要放在USER0这张表里,跟原来的USER1就对不上了,这就需要考虑数据迁移

第二种:根据ID范围分表

假设我们每张分表都能存放500万条数据,那user_0就存放ID为1~500万的数,user_1就存放ID在500万到1000万之间的数据。假设现在有条数据,ID=3000万要读写条数据,就需要将3000万除以500万得到6,那就可以知道这条数据属于user_6一表,于是就去读写user_6表就行了。

优点:根据ID范围去分表就能很好的解决ID取模时数据表的扩展问题。

缺点:假设新注册玩家的ID是不断加一的,那么在某段时间内,ID会集中在某个分片范围内,比如在4000万到6000万的范围,数据会不断写入这个特定的分表中,并没有起到分摊数据读写压力的效果,这就是所谓的读写热点问题。解决读写热点问题最简单的方案就是让ID变得随机,这样ID就能随机分散到所有表上,分摊读写压力。

 推荐一位优秀的up主:小白debug的个人空间-小白debug个人主页-哔哩哔哩视频 (bilibili.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/817893.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解析CopyOnWrite机制 以java的CopyOnWriteArrayList为例

什么是CopyOnWrite 写时复制(Copy-on-write,简称COW)是读写分离的一种实现方式,因为读和写在不同的容器中。 核心思想:线程在修改数据的时,会将原数据复制一份,然后在副本上修改,最…

Macbook M3新机器安装cocoapods失败

这个问题昨天困扰了一个下午 中午拿到的全新的m3 2024 MacBook air,操作系统是Sonoma 14.3 安装Android studio与Flutter一切顺利 在安装cocoapods的时候, sudo gem install cocoapods 一直失败,开始是提示timeout,后来想办法…

一文读懂工作流原理及其在多元应用场景下的实践

一文读懂工作流原理及其在多元应用场景下的实践 引言工作流原理概述应用场景示例及详细描述1. 人力资源招聘流程2. 项目管理流程3. 财务报销审批流程4. 合同审核签署流程 总结 引言 工作流(Workflow),简单来说,就是对业务流程进行…

imx.7交叉编译libX11

背景: 还是之前提到的触摸屏无响应问题,通过GDB调试,发现APP并非人为代码卡死,而是卡在官方的libc.so.6中,这个库出现了一些错误。排除自己代码问题,就剩官方版本问题,移植X11库,或…

提高APP安全性的必备加固手段——深度解析代码混淆技术

​ APP 加固方式 iOSAPP 加固是优化 APK 安全性的一种方法,常见的加固方式有混淆代码、加壳、数据加密、动态加载等。下面介绍一下 iOSAPP 加固的具体实现方式。 混淆代码: 使用 ProGuard 工具可以对代码进行混淆,使得反编译出来的代码很难…

前端本地搭建gninx环境

nginx下载地址: https://nginx.org/en/download.html nginx下载后,解压即用,注意解压目录不要含中文 nginx常用命令 查看版本 nginx -v 开启nginx服务 start nginx 重启服务 nginx -s reload 关闭服务 nginx -s stopnginx目录简析

three.js能够实现的3D动画效果大阅兵,有图有真相。

three.js能够实现许多不同类型的3D交互动画,包括但不限于以下几种: 旋转和缩放:可以通过鼠标或触摸手势来旋转和缩放3D模型或场景。 序列动画:可以创建复杂的动画序列,包括移动、旋转、缩放、颜色变化等。 粒子效果&…

使用Flask部署ppocr模型_3

PaddleOCR环境搭建、模型训练、推理、部署全流程(Ubuntu系统)_1_paddle 多进程推理-CSDN博客 PP-Structure 文档分析-CSDN博客 接前两篇继续完成Flask部署 一、使用Flask部署ppocr模型 GET方法用于从服务器获取资源,即客户端向服务器请求数据…

单链表讲解

一.链表的概念以及结构 链表是一种物理结构上不连续,逻辑结构上连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表的结构与火车是类似的,一节一节的,数据就像乘客一样在车厢中一样。 与顺序表不同的…

线程池中核心线程数与最大线程数与缓冲任务队列的关系?

在Java中的线程池(如ThreadPoolExecutor)中,核心线程数(corePoolSize)、最大线程数(maximumPoolSize)以及缓冲队列(workQueue)之间存在着密切的关系,它们共同…

如何使用pytorch进行图像分类

如何使用pytorch进行图像分类https://featurize.cn/notebooks/5a36fa40-490e-4664-bf98-aa5ad7b2fc2f

【软考】UML中的图之用例图

目录 1. 说明2. 建模2.1 说明2.2 语境建模2.3 需求建模 3. 图示4. 组成部分 1. 说明 1.用例图(Use Case Diagram)。2.展现了一组用例、参与者(Actor)以及它们之间的关系。3.用例图通常包括以下的内容:用例、参与者、用…

配置IP地址并验证连通性

1.实验环境 主机 A和主机 B通过一根网线相连,如图6.13所示。 图6.13 实验案例一示意图 2.需求描述 为两台主机配置!P地址,验证P地址是否生效;验证同一网段的两台主机可以互通,不同网段的主机不能直接互通。 3.推荐步骤 为两台…

uni原生导航栏相关设置

动态设置某一项内容 使用场景:不同角色显示不同导航栏或设置不同名称,不同图标 API: uni.setTabBarItem(OBJECT) 属性类型默认值必填说明indexnumber无是tabBar的哪一项,从左边算起(从0开始)textString无否tab上的按…

【Linux】封装一下简单库 理解文件系统

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、封装一下简单库 二、理解一下stdin(0)、stdout(1)、stderr(3) 2.1、为什么要有0、1、2呢? 2.2、特点 2.3、如果我想让2也和1重定向到一个文件…

uni-app 微信小程序设置全局转发给朋友、分享到朋友圈

小程序右上角原生菜单自带的分享按钮,默认不可用 1.创建一个mixin share.js export default {created() {//#ifdef MP-WEIXINwx.showShareMenu({withShareTicket: true,menus: [shareAppMessage, shareTimeline]});//#endif}, }export default {created() {//#ifde…

Linux学习 - 常用和不太常用的实用awk命令

Linux学习 - 常用和不太常用的实用awk命令 Linux学习系列文章是生信宝典最开始主推的一块,力图从一个新额视角帮助初学者快速入门Linux系统,熟悉Linux下的文件和目录,文件操作, 文件内容操作。而且教程摒弃了完美操作&#xff0c…

immutable variables, constants的区别(rust)

let immutable_variable 1590865; //不可变变量 const constant_variable 0096; //常量常量、不可变变量一样,都无法更改变量的值,但是常量和不可变变量之间存在以下区别: 不可变变量默认不可变,编译器会进行检查。常量不仅在默…

vs2022断点调试怎么看堆栈帧,找异常位置

打一个断点以后,会出现如图报错 我们要怎么找到报错的语句?鼠标点击->堆栈帧->上一行运行的位置->直到找到错误出错如图所示: 跳转到,我们手写的代码,执行出错的位置

意大利西班牙罗马尼亚葡萄牙网红达人:探索广告媒介公司的资源与合作机会

【本篇由言同数字科技有限公司原创】在当今数字化时代,品牌营销已经不再局限于传统媒体,而是转向了社交媒体平台,其中包括北美地区的TikTok和YouTube。这两个平台为品牌提供了直播带货的绝佳机会,而北美网红则成为了品牌推广和产品…