mysql innodbpagesize_MySQL innodb_page_size

导读:Page 是 MySQL Innodb 存储的最基本结构,也是 Innodb 磁盘管理的最小单位,了解 page 的一些特性,可以更容易理解 MySQL。

innodb_page_size 作为 innodb 和 OS 交互单位。文件系统对文件的 buffer IO,也是 page 为单位进行处理的。Linux 的默认 page 的大小 4096 字节,当要将数据写入到文件的时候,会先在内存里,然后将对应的 page cache,整个的从内存刷到磁盘上。但是如果要写入的文件区域,因为还没有被缓存或者被置换出去了等原因,在内存里不存在对应的 page cache,则需要先将对应 page 的内容从磁盘上读到内存里,修改要写入的数据,然后在将整个 page 写回到磁盘;在这种情况下,会有一次额外的读 IO 开销,IO 的性能会有一定的损失。假如 mysql 的 16K 的页表数据支持起,那就是一次内存 IO 光是虚拟地址到物理地址的转换就要去内存查 4 次页表,再算上真正的内存访问,需要 5 次内存 IO 才能获取一个内存数据。

操作系统 PAGE:

在操作系统层面,每个进程都有自己独立的地址空间,看到的都是操作系统虚拟出来的地址空间,虚拟地址最终还是要落在实际内存的物理地址上进行操作的。操作系统就会通过页表的机制来实现进程的虚拟地址到物理地址。其中每一页的大小都是固定的。

获取当前操作系统的 page size:

####X86:

[root@ens8 ~]# getconf PAGESIZE

4096

####ARM:

root@ens8ARM:~# getconf PAGESIZE

65536

页表级数:页表级数越少,虚拟地址到物理地址的映射会很快,但是需要管理的页表项会很多,能支持的地址空间也有限。

相反页表级数越多,需要的存储的页表数据就会越少,而且能支持到比较大的地址空间,但是虚拟地址到物理地址的映射就会越慢。

备注:ARM 系统来说需要编译指定才可以。因为 Linux 默认 4kb 页是通过长期的跟 MySQL 磨合,才有现在的稳定的表现。

MySQL 数据库 Page

InnoDB 逻辑存储单元主要分为表空间、段、区和页。层级关系为 tablespace -> segment -> extent (64 个 page,1M) -> page。(非常经典的图)

在看看 innodb_page_size 的官方描述:

第一个系统表空间数据文件 (ibdata1) 的最小文件大小取决于 innodb_page_size 值

innodb_page_size 只能在初始化 MySQL 实例之前配置,不能在之后修改。如果没有指定值,则使用默认页面大小初始化实例。

MySQL 5.7 增加了对 32KB 和 64KB 页面大小的支持。对于 32KB 和 64KB 的页面大小,最大行长度约为 16000 字节。当 innodb_page_size 设置为 32KB 或 64KB 时,不支持 ROW_FORMAT= compression。对于 innodb_page_size=32k,区段大小为 2MB。对于 innodb_page_size=64KB,区段大小为 4MB。当使用 32KB 或 64KB 的页面大小时,innodb_log_buffer_size 应该至少设置为 16M (默认)。

默认的 16KB 或更大的页面大小适用于各种工作负载,特别是涉及表扫描的查询和涉及批量更新的 DML 操作。对于涉及许多小写操作的 OLTP 工作负载,较小的页面大小可能更有效,在这种工作负载中,当单个页面包含许多行时,可能会出现争用问题。对于通常使用较小块的 SSD 存储设备,较小的页面也可能是有效的。保持 InnoDB 页面大小接近存储设备块大小,可以最大限度地减少被重写到磁盘的未更改数据量.

对于 row,index,tablesapce 的影响Page 对 Row 的影响:

对于 4KB、8KB、16KB 和 32KB 的页大小,最大行大小 (不包括存储在页外的任何可变长度的列) 略小于页大小的一半。例如,默认 innodb_page_size 为 16KB 的最大行大小约为 8000 字节。然而,对于 InnoDB 页面大小为 64KB 的页面,最大行大小大约是 16000 字节。LONGBLOB 和 LONGTEXT 列必须小于 4GB,包括 BLOB 和文本列在内的总行大小必须小于 4GB。Page 对 index 的影响:

如果在创建 MySQL 实例时通过指定 innodb_page_size 选项将 InnoDB 页面大小减少到 8KB 或 4KB,索引键的最大长度将按比例降低,这是基于 16KB 页面大小的 3072 字节限制。也就是说,当页面大小为 8KB 时,最大索引键长度为 1536 字节,而当页面大小为 4KB 时,最大索引键长度为 768 字节。不同的 Page 大小,表空间限制:

Pages 对字段的影响 :

对于 4KB、8KB、16KB 和 32KB 的 innodb_page_size 设置,最大行长度略小于数据库页的一半。例如,对于默认的 16KB InnoDB 页面大小,最大行长度略小于 8KB。对于 64KB 的页面,最大行长度略小于 16KB。 如果一行不超过最大行长度,则所有行都存储在本地页中。如果一行超过最大行长,则选择可变长度列用于外部页外存储,直到该行符合最大行长限制为止。可变长度列的外部离页存储因行格式不同而不同:

COMPACTRow Formats:

当一个可变长度的列被选择用于外部页外存储时,InnoDB 将前 768 个字节本地存储在行中,其余的存储在外部溢出的页面中。每个这样的列都有自己的溢出页列表。768 字节的前缀伴有一个 20 字节的值,该值存储列的真实长度,并指向存储其余值的溢出列表

DYNAMICRow Formats:

当一个可变长度的列被选择用于外部页外存储时,InnoDB 在本地的行中存储一个 20 字节的指针,其余的则在外部存储到溢出的页面中,LONGBLOB 和 LONGTEXT 列必须小于 4GB,包括 BLOB 和 TEXT 列在内的总行长度必须小于 4GB。

Page 如何计算记录数page 构成结构:

除数据外 ROW 额外信息存在哪些:

16k 页为基准,能保存多少记录数:

按照上面 Page 结构图,可以如下计算:page 大小(16*1024=16384)- 必要信息(File Header38 字节 + page header56 字节 + 虚拟最大最小记录 26 字节 + Page Directory4 字节 + File Trailer8 字节)=16252 字节

约每 4 条记录占用一个 slot,一个 slot 大小占用 2 字节

row header(5 字节 + 可变长 + 非空占位符)+ 主键 key 长度(如果没有显示声明默认会创建 6 字节 row id)+ trxid6 字节 + rollptr7 字节

假如单行长度计算公式为:row header5 字节 + 主键索引列 4 字节 + 指针 4 字节 = 13 字节 单个 page 最多能容纳最多行数为 单行长度 N+N/4*2 = 16252,

N 为 1203

测试:

...

✨ 接下来内容请点击【原文】进行查看~

更多数据库相关内容,可访问【墨天轮】进行浏览。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值