MySQL八股学习历程3MySQL数据页的格式from小林coding
- InnoDB数据页
- MySQL单表建议数据承载量探究
InnoDB数据页
InnoDB 的数据是按数据页为单位来读写的,每个数据页大小默认为16KB,数据页的格式如下图
文件头中有两个指针,指向上一个数据页和下一个数据页,使得页面连接成一个链表,数据页中的记录按照主键的顺序组成一个单向链表,为了提高效率,InnoDB为这些记录分了组,并且用一个指针指向这些组,称之为槽,整个结构如下,这些指针被放到页目录的位置中
为了链表过长,导致顺序查询的复杂度过大,InnoDB对每个链表的长度做了如下限制
- 第一个分组中的记录只能有 1 条记录;
- 最后一个分组中的记录条数范围只能在 1-8 条之间;
- 剩下的分组中记录条数范围只能在 4-8 条之间
MySQL单表建议数据承载量探究
InnoDB的B+树节点种类,非叶子节点存储索引,那么InnoDB的分叉数等于
X
=
(
T
o
t
a
l
S
i
z
e
−
N
o
t
D
a
t
a
S
i
z
e
)
÷
i
n
d
e
x
S
i
z
e
X = (TotalSize - NotDataSize)\div indexSize
X=(TotalSize−NotDataSize)÷indexSize
其中假设主键为bigint类型,那么一个bigint占8byte, 页号为固定的4Byte,indexSize为12B,页大小totalSize为16KB,上面页中除了用户记录大概占据1KB的内存
则叉数X约等于1280
一般而言MySQL的B+树索引层高不大于3,那么单表的数据承载最大量建议值为
Y
=
X
2
×
(
T
o
t
a
l
S
i
z
e
−
N
o
t
D
a
t
a
S
i
z
e
)
÷
(
s
i
n
g
l
e
R
o
w
S
i
z
e
)
Y = X^2 \times (TotalSize - NotDataSize) \div (singleRowSize)
Y=X2×(TotalSize−NotDataSize)÷(singleRowSize)
超过这个上限,MySQL的查询时间将会激增