我跟面试官说MySQL单表数据量不要超过两千万,面试官不信
👉导读
👉目录
于是小王以过往项目里的某个 case 为例做了回答:
我负责的项目里涉及到存储用户操作记录的功能,因为每天的数据量比较大,差不多超过 5000 万条,所以我另外又做了分库分表的操作。系统会自动定时生成 3 张表,数据分别存储其中,防止都放在一个表里面导致查询性能降低。
小王内心 OS:为什么1+1=2?但他还是语气平常地回答说:
MySQL 单表不要超过 2000 万行基本上是一个行业共识,只有当单表行数超过 500 万行或者单表容量超过 2GB,我们一般才推荐进行分库分表。
01
02
对于一个高度为 N 的 B+树,顶层(根节点)有一个非叶子节点,那么第二层就有X个节点,第三层就有 X 的2次方个节点,第四层就有 X 的三次方个节点,以此类推,第 N 层(即叶子节点所在的第 N 层)就有 X 的 N-1 次方个节点; 在 B+ 树中,所有的记录都存储在叶子节点中,假设每个叶子节点都可以存储的行记录数为 Y; 那么 B+ 树可以存储的数据总量为叶子节点总数乘以每个叶子节点存储的记录数,即:M=(X 的 N-1 次方)乘以 Y;
一个数据页大小16K,扣除页号、前后指针、页目录,校验码等信息,实际可以存储数据的大约为15K,假设主键ID为bigint型,那么主键 ID 占用8个 byte,页号占用4个 byte,则 X=15*1024/(8 + 4) 等于1280; 一个数据页实际可以存储数据的空间大小,大约为15K,假设一条行记录占用的空间大小为1K,那么一个数据页就可以存储15条行记录,即 Y=15; 假设 B+树是两层的:则 N=2,即 M=1280的(2-1)次方 * 15 ≈ 2w ; 假设 B+树是三层的:则 N=3,即 M=1280的2次方 * 15 ≈ 2.5 kw; 假设 B+树是四层的:则 N=4,即 M=1280的3次方 * 15 ≈ 300亿 ;