网站首页 > 教程文章 正文
前言:
我们知道数据库单表数据量达到一定数量之后,要考虑分库分表进行存储数据,为什么要考虑分库分表,达到多少量进行分库分表?下面我们从B+树的角度分析下。
多少数据分析
理论上来说,只要磁盘空间够,存多少都可以,但是随着数据量的增多,查询效率会下降的,根据实际经验来说,单表抗2000万数据量,通过索引查询问题不大,那么这个数字确实是一个经验值,但是他背后是不是有一定的计算逻辑呢?如何计算出这个数据的呢?
首先我们需要知道的事,单表能存数据不用考虑分库分表,这要看记录大小、存储引擎设置、硬件配置等多种因素。那么如果一定要做数据计算,我们可以从B+树存储的角度来分析一波。
B+树的高度限制
B+树是InnoDB存储引擎使用的索引结构,我们都知道,随着表中数据量的增加,B+树的高度会逐渐增加。如果B+树的高度过高,每次查询需要经过较多的层级,会导致查询性能下降。因此,B+树的高度限制是单表存储量的个瓶颈。对于B+树的高度限制,一般建议将B+树的高度控制在3到4层以内,以获得更快的查询性能。
数据页
我们都知道,Innodb中的数据页默认大小是16KB,并且B+树的每个节点都对应着一个数据页,包括根节点、非叶子节点和叶子节点。B+树的非叶子节点对应着数据页,其中存储着主键+指向子节点(即其他数据页)的指针。B+树的叶子节点包含实际的数据行,每个数据行存储在一个数据页中。
估算
有了以上的背景之后,我们就可以基于B+树的高度及结构,还有数据页的大小,来估算单表的数据量了。
我们都知道,B+树的叶子节点和非叶子节点存储的内容是不一样的。所以需要区分开来进行计算。
我们很容易知道以下公式:
能存多少条记录=叶子节点的数量*每个叶子节点中能存的数量。
叶子节点的数量=根节点之下的第一层非叶子节点的数量^(树高度-1)
最终我们只需要计算出非叶子节点的数量、叶子节点中能存的数量、树高度就行了。
非叶子节点数量
个根节点中,可以扩展出多少个子节点?
已知一个根节点的存储量是16KB,并且他作为非叶子节点,他只需要存储一个主键+一个指针就行了。假设是一个bigint类型的主键(8字节),和默认6字节的指针。那么可以存储:
16*1024/(8+6)≈1170
根节点可以扩展出1170个二层高度的子节点,而三层的B+树则会有两层非叶子节点。那么最终就能关联出 1170*1170=1,368,900个叶子节点。
叶子节点的存储行数
已知一个叶子节点有16KB,那么它能存储多少数据量就取决于单行数据的大小了。假设单行数据量1KB,那么他就能存储16条,假设单条数据量500B那么他就能存储32条。
估算结果
基于以上计算方式,假设单条数据的存储空间是1KB,那么3层高度的B+树最终的可存储数据量为:
1170*1170*16=21,902,400,即2000万。
总结
以上具体计算分析了单表数据量达到多少,我们要进行分库分表的操作,在这个数据量范围内我们可以不用分库分表,毕竟分库分表会增加系统的复杂性。
- 上一篇: B树、B+树索引算法原理
- 下一篇: 为什么MySQL对B+树“情有独钟”?
猜你喜欢
- 2025-03-07 深入解析MySQL索引高速查询的核心机制与原理
- 2025-03-07 每个人都需要了解的索引知识点
- 2025-03-07 C++ B-tree:探索数据结构之美
- 2025-03-07 Java面试核心技能全景解析:架构设计与编码能力的深度碰撞
- 2025-03-07 图文并茂 10分钟深度剖析数据库索引
- 2025-03-07 详细介绍一下MySQL中的复合索引?
- 2025-03-07 程序员必须掌握的8种数据结构: 1.数组: 数组
- 2025-03-07 PostgreSQL技术内幕25:时序数据库插件TimescaleDB
- 2025-03-07 为什么大厂不建议使用多表join?
- 2025-03-07 什么是算法?
- 最近发表
-
- 绝区零:公测必看!300菲林兑换码、萌新补给一览!切勿踩坑!
- 事半功倍 轻松制作可交互移动原型
- LOL英雄联盟美服注册教材 教你玩转美服
- 「正点原子Linux连载」第五十八章Linux INPUT子系统实验(一)
- 如何轻松薅Cursor羊毛:用免手机号邮箱快速注册
- C/C++基础语法复习(一):C++与C语言的区别,主要有这些
- 永久免费的高配容器Clawcloud,超爽体验!
- Spaceship低价注册域名 | 每年5元不到 | XYZ域名 | 托管cloudflare
- 云杉网络DeepFlow基于Free5GC的方案示例
- alma8飞速搭建zabbix6、微信报警、windows、linux、交换机监控
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)