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。每一页的结构:


每个页面 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 TIMESTAMP
和LastUpdateTime TIMESTAMP
:TIMESTAMP
类型通常占用 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,才推荐进行分库分表。抛开容量,谈行数就是扯淡!!!