🗒️MySQL三层b树能存多少数据
2025-1-2
| 2025-1-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
创建时间
Jan 2, 2025 12:02 PM
我们可以通过 show GLOBAL STATUS like 'Innodb_page_size’ 来查询 Innodb 的页大小,默认 16 KB。
每一页的结构:
notion image
notion image
每个页面 16 KB 减去额外的开销(例如页头,页尾等,消耗约为 200 字节),有效数据空间约为:16*1024 - 200 = 16384 - 200 = 16184。现在,我们只需要知道表中每一行的数据占用多少字节的空间,就可以得到一页可以存储多少行数据了。
以一个学生信息管理为例:
计算每个字段的占用大小:
根据搜索结果中的信息,我们可以更准确地计算使用utf8mb4字符集的字段所占用的大小。utf8mb4字符集是一个变长字符集,每个字符可能占用 1 到 4 个字节。对于VARCHAR类型的字段,除了字符数据本身,还需要额外的空间来存储长度信息。
以下是针对utf8mb4字符集的字段大小计算:
  • ID BIGINT:占用 8 字节。
  • StudentNumber BIGINT:占用 8 字节。
  • Name VARCHAR(100):最大可能占用100 * 4 = 400字节。长度信息需要额外的 2 个字节(因为长度小于 65535),总共是400 + 2 = 402字节。
  • Gender CHAR(1):对于utf8mb4字符集,每个字符最多占用 4 字节,所以这里占用1 * 4 = 4字节。
  • DateOfBirth DATE:占用 3 字节。
  • Class VARCHAR(50):最大可能占用50 * 4 = 200字节。长度信息需要额外的 2 个字节(因为长度小于 65535),总共是200 + 2 = 202字节。
  • CreationTime TIMESTAMPLastUpdateTime TIMESTAMPTIMESTAMP类型通常占用 8 字节,所以两个字段共占用8 + 8 = 16字节。
现在,我们可以计算每行的大致大小:
  • ID:8 字节
  • StudentNumber:8 字节
  • Name:402 字节
  • Gender:4 字节
  • DateOfBirth:3 字节
  • Class:202 字节
  • CreationTime:8 字节
  • LastUpdateTime:8 字节
总大小=8+8+402+4+3+202+8+8=651 字节(其实忽略了行记录中的隐藏行的大小)
每个页指针占用 6 字节,主键索引(ID)和唯一索引(StudentNumber)都是BIGINT类型,占用 8 字节,共占用 22 字节。
因此,一页可以存储 16184 / 22 约等于 735 个指针,则第二层可以存储 735 * 735 = 540225 个指针,第三层 540225 * (16184 / 651) = 540255 * 24 = 12,965,400 条记录,也就是 1200 万条记录左右,容量为 7.86 GB。
💡
单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。抛开容量,谈行数就是扯淡!!!

📎 参考

2192. 有向无环图中一个节点的所有祖先2685. 统计完全连通分量的数量
Loading...
目录