MySQL八股学习历程3MySQL数据页的格式from小林coding

MySQL八股学习历程3MySQL数据页的格式from小林coding

  • InnoDB数据页
  • MySQL单表建议数据承载量探究

InnoDB数据页

InnoDB 的数据是按数据页为单位来读写的,每个数据页大小默认为16KB,数据页的格式如下图
MySQL八股学习历程3MySQL数据页的格式from小林coding_第1张图片
MySQL八股学习历程3MySQL数据页的格式from小林coding_第2张图片
文件头中有两个指针,指向上一个数据页和下一个数据页,使得页面连接成一个链表,数据页中的记录按照主键的顺序组成一个单向链表,为了提高效率,InnoDB为这些记录分了组,并且用一个指针指向这些组,称之为槽,整个结构如下,这些指针被放到页目录的位置中
MySQL八股学习历程3MySQL数据页的格式from小林coding_第3张图片
为了链表过长,导致顺序查询的复杂度过大,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=(TotalSizeNotDataSize)÷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×(TotalSizeNotDataSize)÷(singleRowSize)
超过这个上限,MySQL的查询时间将会激增

你可能感兴趣的:(mysql,学习,数据库)