Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >mysql单表存储量

mysql单表存储量

原创
作者头像
二锅头一桶天下
发布于 2023-09-03 08:06:46
发布于 2023-09-03 08:06:46
3800
举报

网上常说mysql单表2kw就需要考虑分表了,但生产中我们也用过2亿的表,而且毫无压力。

所以记录一下为什么2kw就要分表是依据什么原理,生产大概要注意什么。

1 存储原理

这里只关注B+树的存储

B+存储结构
B+存储结构

在MySQL中,为了保存内存地址,通常使用6字节来存储指针。如果使用BigInt作为PK的话,那一个BigInt就是8byte,所以在非叶子结点,一个数据就占用6+8 byte。

Linux中,数据都是一页一页存储的,一页16k。不考虑有其他东西,一页可以存储16k/14byte=1170个页的地址。同理,第二层就可以存储1170^2=1368900个页的地址。

到了第三层是叶子结点比较特殊。这里分析聚簇索引,包括一整条数据,假设一条数据1k,那么一个页就是16/1=16条数据。

所以第三层的数据有1368900*16=21902400,2千多万条。

如果到了第四层,则可以有1170^3*16=256亿。

但是一般mysql到了第三层就差不多了,只需要通过3次IO,就可以读取到数据所在的叶子结点的页。至于提取需要的记录,则需要在内存中进行一次条件匹配。

2 扩展

这里2kw的原理就是这样的假设前提的。

所以,如果不用BigInt做PK,而改用int的话,则非叶子结点一个数据占(6+4)byte,一页16k/10byte=1638,则第三层可以存储1638^2*16=4.29亿。

如果是个小表,一条数据不够1k,如0.1k,则第三层为2kw*2=2亿,3次IO也是问题。

如果就是1k,256亿条以内的记录,也就是4次IO,真的有想象中的那么不堪吗?不一定!要结合线上的表现来决定要(不要)拆分(256亿有点夸张了,2亿还是很有可能的)。

3 非聚簇索引

叶子结点一条记录只有8byte,和聚簇索引不是一个量级的,所以不需要考虑。

所以针对IO的分析,一般都是分析聚簇索引。

4、为什么6 byte存储地址

这是因为MySQL在32位系统上使用4字节来存储指针,而在64位系统上使用8byte来存储指针。为了在不同系统上保持兼容性,MySQL选择了6byte作为指针的存储长度。

用8byte来保存地址,实属有点浪费,因为6字节可以存储的地址为:32T。如果真的需要这么大的存储空间,估计早就分机器了。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【C++】const关键字
实际上和const修饰结构体一样,当需要打印数据时,并且当数据量太大,不想复制一份数据到内存空间时,就传一个地址或者引用,此时形参改变,实参也会跟着改变,所以此时需要防止实参被修改!
后端码匠
2023/02/27
5010
【C++】const关键字
AboutCPlusPlus之const关键字
const 是 constant 的缩写,本意是不变的,不易改变的意思。在 C++ 中用来修饰内置类型变量、自定义对象、成员函数、返回值、函数参数。
王强
2021/04/29
5780
【专业技术第二讲】c语言中const的使用
这里对const的使用做一个大致的总结。 C语言的const关键字与指针搭配使用,const是C语言中保留的一个关键字,它用来限定一个变量是只读的,即不可变的。程序中使用const可以在一定程度上提高
程序员互动联盟
2018/03/14
7970
【专业技术第二讲】c语言中const的使用
【C 语言】const 关键字用法 ( 常量指针 - const 在 * 左边 - 修饰数据类型 - 内存不变 | 指针常量 - const 在 * 右边 - 修饰变量 - 指针不变 )
const 关键字 在 C 和 C++ 中的表现不同 , 本篇博客主要介绍 C 语言中的 const 用法 ;
韩曙亮
2023/03/29
3.3K0
C++基础语法重点总结
函数重载指的是在同一个作用域中,声明了具有相同函数名的函数,它们的参数列表不同,也就是说参数类型不同,参数个数不同,参数顺序不同,返回值同不同都可以。
二肥是只大懒蓝猫
2023/10/13
2430
c++中的const和volatile知识自我总结
1、const限制一个变量不能修改其内容,如果强行修改的话,如下面代码这样子,编译就会报错,“表达式必须是可修改的左值”。
chenjx85
2019/05/06
6270
C语言中const关键字的妙用总结
学习了多年的C语言,你对const关键字的使用全都掌握了吗?在编程实践中你对const的使用是否有困惑呢?今天就给大家一起来探讨总结,期望能够大家解惑并提供参考。
狼啸风云
2021/03/23
1.4K0
C++ const详解
常量在C++中经常用到,用关键字const表示,它是常数变量,也就是说,它仍然是变量,而不是常数。什么区别呢?编译器会为变量在内存中分配地址空间,而常数是编译器在编译过程中记录在内存表里一个实体。
猫叔Rex
2020/06/29
6620
初识C++
最近颓废了很多,不想深入去学习,直接开始摆烂,但是好在瘦了10斤,还是不错的,也不是所有的事情下降了都是坏事。
是小张啊喂
2022/08/18
1770
define与const关键字的多种用法
这将创建一个名为 SQUARE 的宏,它接受一个参数 x,并返回 x * x 的结果。比如可以在代码中使用 SQUARE(5) 来得到 5 的平方。
SarPro
2024/02/20
1530
C++ 面试必备:常见 C++ 面试题汇总及详细解析
C++是C的超集,也就是说,C++包括了C的所有基础特性,并且还增加了一些新的特性。下面列举一些C和C++之间的主要区别:
小万哥
2023/03/31
2.3K0
C++ 面试必备:常见 C++ 面试题汇总及详细解析
C++必知必会之基础知识-常用关键字(1)
Hello,大家好!我是木荣。温故而知新,可以为师矣。作为一名攻城狮,扎实的基本功是解决问题及完成工作中任务的重要前提。没有良好的基本功作为铺垫,一味的追求知识的宽度是毫无意义,知其然更要知其所以然。因此,在平时和小伙伴们聊天时,在谈到学习技术方面的问题,我会告诉他们注重基本功。所以,最近文章会总结一些日常编程工作中常用的重要基本知识点,根据平时工作中常用的也是重要的知识点逐步展开。
Linux兵工厂
2023/09/15
2310
C++必知必会之基础知识-常用关键字(1)
指针(二) - (const)指针与常量
const使用 声明一个常量 关键字const用来告诉编译器一个一旦被初始化过的变量就不能被修改 int a; const int n; 一 常量指针 指针指向一个常量 修饰指针指向 #include int main() { //常量指针 const int num = 10; // num = 100; int* p1 = # *p1 = 100; printf("%d\n", num); // 可以通过p1修改num (c语言可以c++不可以) // 不可以通过p2,p3修
木杉乀
2021/04/02
4280
【C++】类型转换 ⑤ ( 常量和非常量之间的类型转换 - 常量类型转换 const_cast | const 左数右指原则 | 代码示例 )
在之前写过一篇 C++ 类型转换的博客 【C++ 语言】类型转换 ( 转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast | 字符串转换 ) , 简单介绍了 C++ 类型转换 ;
韩曙亮
2023/11/29
5360
【C++】类型转换 ⑤ ( 常量和非常量之间的类型转换 - 常量类型转换 const_cast | const 左数右指原则 | 代码示例 )
【C语言】const 关键字详解
const关键字在C语言中用于定义常量,提供只读的变量。这意味着一旦初始化,const变量的值不能再被修改。下面详细介绍const关键字的用法、作用以及其在不同上下文中的应用。
LuckiBit
2024/12/07
3280
【C语言】const 关键字详解
【C++】C++ 类中的 this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )
在 C++ 类中 , 普通的非静态成员函数 , 可以使用 const 进行修饰 ,
韩曙亮
2023/10/15
4010
【C++】C++ 类中的 this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )
C++中Const常量机制分析
const为C/C++常用的修饰符,表示该变量是一个常量,不可被修改等含义。那么在实际使用中会存在如下疑问:
洛杉矶
2018/06/08
2.5K0
C/C++关键字详解-----`const`的使用
作为一个关键词,你可以将 const 视为对数据的权限控制机制之一,它主要用于限制数据的可变性,从而提高代码的安全性和可靠性。通过使用 const,可以缩小对数据的修改权限,确保数据在某些情况下不被意外修改。
薄荷冰
2024/03/11
2220
C++:18---const关键字(附常量指针、指针常量、常量指针常量)
一、const变量的一些基本特点 ①const修饰的变量不能被修改 const int a=10;a=20;//错误 ②因为const修饰的变量不能被修改,所以必须被初始化 int a=10;const int b=a; //正确const int c=10; //正确 ③const修饰的变量可以赋值给其他值 const int a=10;int b=a;//正确 ④可以有常量引用 int a=10;const int &b=a; 二、在其他文件中使用const常量(extern) const常量默
用户3479834
2021/02/03
1.4K0
C++ 中 const 和 constexpr关键字解析:常量、函数和指针
这是最基本的一种用法,顾名思义,就是将该变量修饰为常量,从而不可以修改。很多的全局变量都是通过常量来进行修饰,需要注意的是,使用const关键字修饰的变量需要立刻初始化
小万哥
2023/02/24
1.1K0
C++ 中 const 和 constexpr关键字解析:常量、函数和指针
推荐阅读
相关推荐
【C++】const关键字
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档