如何应对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.hqwc.cn/news/620701.html

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

相关文章

光场相机建模与畸变校正改进方法

摘要:光场相机作为一种新型的成像系统,可以直接从一次曝光的图像中得到三维信息。为了能够更充分有效地利用光场数据包含的角度和位置信息,完成更加精准的场景深度计算,从而提升光场相机的三维重建的精度,需要实现精确…

大规模端云协同智能计算(大小模型端云协同联合学习)

原文作者:上海交通大学 吴帆 0 引言 目前,许多智能技术已经走入人们的日常生活,例如交互式商品推荐、人脸识别、语音识别、体征观测、疾病诊断、智能决策等,这些智能技术在为我们生活带来极大便利的同时,也深刻改变了…

解决VS2022创建项目只有解决方案看不到项目文件

问题:无法运行、看不到项目文件 解决: 检查环境变量是否正确

金属棒直线度测量仪:在线精准测量的关键工具

在现代工业生产中,金属棒的直线度是一个至关重要的参数。它的微小变化,直接关系到产品质量的优劣,因此准确测量金属棒的直线度成为了生产过程中的关键环节。 金属棒在线直线度测量仪应运而生,它是一种专门用于测量金属棒直线度的精…

秋招复习笔记——八股文部分:网络基础

TCP/IP 网络模型 应用层 最上层的,也是我们能直接接触到的就是应用层(Application Layer),我们电脑或手机使用的应用软件都是在应用层实现。那么,当两个不同设备的应用需要通信的时候,应用就把应用数据传…

软件测试面试题分享(含答案+文档)

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 准备找工作的小伙伴们,今天我给大家带来了一些自动化测试面试题,在这个公…

Vue 读取后台二进制文件流转为图片显示

Vue 读取后台二进制文件流转为图片显示 后台返回格式 <img :src"payImg" id"image" style"width: 150px;height: 150px;" alt"">axios写法 重点 responseType: ‘blob’ &#xff0c; 使用的是res中的data blob this.$axios.…

解读MongoDB官方文档获取mongo7.0版本的安装步骤与基本使用

mongo式一款NOSQL数据库&#xff0c;用于存储非结构化数据&#xff0c;mongo是一种用于存储json的数据数据&#xff0c;可以通过mongo提供的命令解析json获取想要的值。 数据模型 了解关系数据库会很熟悉database,table,row,column的概念&#xff0c;分别是数据库&#xff0c…

C语言 | 自定义类型:struct结构体(详解)

目录&#xff1a; --前言 1. 结构体类型的定义与基础结构 2. 结构体的使用 3. typedef相关 4. 结构体的自引用 5. 结构体内存对齐 6. 结构体传参 7. 结构体实现位段 --前言&#xff1a; c语言中内置类型&#xff0c;也有自定义的类型。 例如&#xff1a;内置类型 in…

代码随想录算法训练营第四十一天| LeetCode 343. 整数拆分、96.不同的二叉搜索树

一、LeetCode 343. 整数拆分 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0343.%E6%95%B4%E6%95%B0%E6%8B%86%E5%88%86.html 状态&#xff1a;已解决 1.思路 题目的要求是要我们拆除某个给定的整数&#xff0c;让其拆分后的数相乘结果最大。因此我们知…

笔记84:关于递归法的一些感悟

题目1&#xff1a;二叉树的前序遍历 链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(…