数据页存储结构

  • 16KB
  • 数据页.jpg
  • 索引页.jpg

数据页存储 - 图3

  • 文件头:38个字节
  • 数据页头:56个字节
  • 最大记录、最小记录:26个字节
  • 文件尾部:8个字节

    表空间

  • 物理层面上,表空间就对应一个磁盘文件“表名.ibd”,系统表空间对于多个磁盘文件

    数据区- extent

  • 一个数据区对应64个连续的数据页

  • 每个数据页16KB,所以一个数据区就是1MB
  • 256个数据区被划分为一个数据组

    特殊信息

  • 对于一个表空间,他的第一组数据区的第一个数据区的前三个数据页是固定的,存放描述信息

    • FSP_HDR:存放表空间和这一组数据区的属性信息
    • IBUF_BITMAP:这一组数据页的insert buffer的信息
    • INODE:也是存放一些特殊信息
  • 这个表空间的其他各组数据区的第一个数据区的前两个数据页,也是存放特殊信息

    磁盘随机读写

  • 从磁盘读取数据页,是随机读写

  • 随机读写关注IOPS和响应延迟

    • IOPS:磁盘每秒随机读写次数
    • IOPS越高,数据库并发性能越好
    • 响应延迟:随机读写响应时间
    • 核心业务数据库机器建议使用SSD固态硬盘,IOPS和响应延迟都比机械硬盘好很多

      磁盘顺序读写

  • 磁盘顺序写能力很高,接近内存

  • 关注磁盘读写的吞吐量,每秒写入磁盘的数据量

    Linux存储系统分层

    数据页存储 - 图4

  • VFS层:根据文件目录找到对应的文件系统

  • IO调度层默认使用CFQ公平调度算法

    • 可能影响性能
    • 生产环境可以使用deadline IO调度算法
      • 核心思想是任何一个IO操作都不能一直等待,在指定时间范围内,必须执行

        RAID

  • 磁盘冗余阵列,管理磁盘的读写

  • 数据冗余机制

    • 当写入数据时,会讲数据写入多个磁盘上,作为备份,当一个磁盘损毁,数据不会丢失

      RAID缓存

  • RAID自带的一个缓存

  • 如果讲缓存模式设置为write back,那么写入RAID磁盘阵列的数据会先写入到RAID的缓存,后续会慢慢刷新到磁盘

    RAID卡锂电池

  • RAID卡一般都配置的有自己的锂电池,当断电的时候,会讲缓存中数据写入到磁盘

  • 但是锂电池有性能衰减问题,所以一般锂电池要配置定时充放电,来延长电池寿命
  • 在充放电过程中,RAID的缓存级别会从write back变为write through,数据直接写入到磁盘
  • 所以RAID锂电池的自动充放电时候,会导致MYSQL数据库性能下降,每隔一段时间出现抖动
    • 解决:关闭自动充放电,写一个脚本,自动在业务低峰期,进行充放电