数据页结构

经过前面的介绍现在我们都知道,一行一行的数据是存放在数据页里的,所以接下来我们该分析一下数据页的结构了。之前介绍过,每个数据页,实际上是默认有16kb的大小,那么这16kb的大小就是存放大量的数据行吗?明显不是的,其实一个数据页拆分成了很多个部分,大体上来说包含:

文件头、数据页头,最小记录和最大记录、多个数据行、空闲空间、数据页目录、文件尾部。下面我们来看一张图:

datapage2.jpg

其中文件头占据了38个字节,数据页头占据了56个字节,最大记录和最小记录占据了26个字节,数据行区域的大小是不固定的,空闲区域的大小也是不固定的,数据页目录的大小也是不固定的,然后文件尾部占据8个字节。

,刚开始一个数据页可能是空的,没有一行数据,此时这个数据页实际上是没有数据行那个区域的。假设我们现在要插入一行数据,此时数据库里可是一行数据都没有的,那么此时是不是应该先从磁盘上加载一个空的数据页到缓存页里去?加载的过程我们通过一张图来看一下:

datapage3.jpg

接着我们是不是应该在buffer pool中的一个空的缓存页里插入一条数据?记住,缓存页跟数据页是一一对应的,它在磁盘上的时候就是数据页,数据页加载到缓存里了,我们就叫它缓存页。所以此时在缓存页里插入一条数据,实际上就是在数据行那个区域里插入一行数据,然后空闲区域的空间会减少一些,此时当缓存页里插入了一行数据之后,缓存页此时看起来如下图所示:

datapage4.png

接着你就可以不停的插入数据到这个缓存页里,直到它的空闲区域都耗尽了,就是这个页满了,此时数据行区域内可能有很多行数据。大家都知道,在更新缓存页的同时,其实它在lru链表里的位置会不停的变动,而且肯定会在flush链表里,所以最终它一定会通过后台IO线程根据lru链表和flush链表,把这个脏的缓存页刷到磁盘上去。如下图所示:

datapage5.png

表空间、数据区

简单来说,就是平时我们创建的那些表,其实都有一个表空间的概念,在磁盘上都会对应着“表名.ibd”这样的一个磁盘数据文件。所以在物理层面,表空间就是对应一些磁盘上的数据文件。有的表空间,比如系统表空间可能对应的是多个磁盘文件,我们自己创建的表对应的表空间可能就是对应了一个“表名.ibd”数据文件。

在表空间的磁盘文件里会有很多的数据页,但是如果一个表空间包含了太多数据页的话就不便于管理,所以在表空间里又引入了一个

的概念,英文就是extent,一个数据区对应着连续的64个数据页,每个数据页是16kb,所以一个数据区是1mb,然后256个数据区被划分为一组。

对于表空间而言,它的第一组数据区的第一个数据区的前3个数据页都是固定的,里面存放了一些描述性的数据。比如fsp_hdr这个数据页,它里面就存放了表空间和这一组数据区的一些属性。ibuf_bitmap数据页,里面存放的是这一组数据页的所有insert buffer的一些信息。inode数据页,这里也存放了一些特殊信息。

我们现在先不去具体了解它们是干什么的,只要知道第一组数据区的第一个数据区的前3个数据页,都是存放一些特殊信息的。然后这个表空间里的其它各组数据区,每一组数据区的第一个数据区的头两个数据页都是存放特殊信息的,比如xdes数据页就是用来存放这一组数据区的一些相关属性的,其实就是很多描述这组数据区的东西。下面我们通过一张图来看一下表空间的存储结构。

datapage6.jpg

生产经验

1、linux操作系统的存储系统软件层原理分析以及IO调度优化原理

简单来说,linux的存储系统分为VFS层、文件系统层,Page Cache缓存层,通用Block层、IO调度层、Block设备驱动层、Block设备层,如下图:

block1.jpg

当MySQL发起一次数据页的随机读写,或者是一次redo log日志文件的顺序读写的时候,实际上会把磁盘IO请求交给linux操作系统的VFS层。这一层的作用,就是根据你是对哪个目录中的文件执行的磁盘IO操作,把IO请求交给具体的文件系统。

举个例子,在linux中,有的目录比如/xx1/xx2里的文件是由NFS文件系统管理的,有的目录比如/xx3/xx4里的文件其实是由Ext3文件系统管理的,那么这个时候VFS层需要根据你是对哪个目录下的文件发起的读写IO请求,把请求转交给对应的文件系统。

接着,文件系统会先在Page Cache这个基于内存的缓存里找你要的数据在不在里面,如果有就基于内存缓存来执行读写,如果没有就继续往下一层走,此时这个请求会交给通用Block层,在这一层会把你对文件的IO请求转换为Block IO请求。

接着IO请求转换为Block IO请求之后,会把这个Block IO请求交给IO调度层,在这一层里默认是用CFQ公平调度算法的,也就是说,假设此时数据库发起了多个SQL语句同时在执行IO操作。

有的SQL语句可能非常简单,比如“update xxx set xx1=xx2 where id =1”,它可能就只要更新磁盘上的一个block里的数据就可以了,但是有的SQL语句,比如说“select * from xx where xx1 like ‘%xx%’”可能需要IO读取磁盘上的大量数据。那么此时如果基于公平调度算法,就会导致它先执行第二个SQL语句的读取大量数据的IO操作,耗时很久,然后第一个仅仅更新少量数据的SQL语句的IO操作,就一直在等待它,得不到执行的机会。

所以一般建议MySQL的生产环境,需要调整为deadline IO调度算法,它的核心思想就是,任何一个IO操作都不能一直在不停的等待,在指定时间范围内,都必须让它去执行。所以基于deadline算法,上面第一个SQL语句的更新少量数据的IO操作可能在等待一会之后就得到执行的机会,这也是一个生产环境的IO调度优化经验。

最后IO完成调度之后,就会决定哪个IO请求先执行,哪个IO请求后执行,此时可以执行的IO请求就会交给Block设备驱动层,最后经过驱动把IO请求发送给真正的存储硬件,也就是Block设备层。硬件设备完成IO读写操作,最后就把响应经过上面的层级反向依次返回,最终MySQL可以得到本次IO读写操作的结果。

mysql表空间预估_MYSQL实战优化——数据页、表空间相关推荐

  1. mysql 优化表的作用_mysql实战优化之三:表优化

    对于大多数的数据库引擎来说,硬盘操作可能是最重大的瓶颈.所以,把你的数据变得紧凑会对这种情况非常有帮助,因为这减少了对硬盘的访问. 如果一个表只会有几列罢了(比如说字典表,配置表),那么,我们就没有理 ...

  2. mysql多表查询语句_mysql查询语句 和 多表关联查询 以及 子查询

    1.查询一张表:select * from 表名: 2.查询指定字段:select 字段1,字段2,字段3-.from 表名: 3.where条件查询:select字段1,字段2,字段3 frome ...

  3. 用exp无法导出空表解决方法/用exp导出数据时表丢失原因

    用exp无法导出空表解决方法/用exp导出数据时表丢失原因 最早的一次使用oracle 11g导出数据发现有的表丢失了,感觉莫名其妙的,后来终于找到原因了. 找到问题以后,再看看解决方案. 11GR2 ...

  4. 【Excel 2013 数据透视表 学习】一、创建数据透视表

    1 数据透视表 是Excel中数据处理分析工具. 用途: 1. 快速分类汇总.比较大量数据. 2. 快速变化统计分析维度查看统计结果. 数据透视表不仅综合了数据排序.筛选.组合及分类汇总等数据分析方法 ...

  5. excel 透视表 vba_使用Excel VBA删除数据透视表计算字段

    excel 透视表 vba Yesterday, I started out with the best of intentions, planning to get some work done, ...

  6. python实现数据透视表_17,玩转pivot_table数据透视表

    数据透视表是将数据进行分类汇总,统计分析的强大工具.通过设置新的行标签index和列标签columns,指定需要被统计分析的数值values,指定采用的统计聚合函数aggfunc等,利用数据透视表可以 ...

  7. php怎么做数据透视表,sql上使用excel表格数据透视表-会excel基本函数和数据透视表,加基本的SQL增删改......

    excel 数据透视表 sql语句 对空值的处理方法 比如你有个工,工作簿中有2个工作表,一个为.一个为消耗. 字段为: 代码 存货名称 采购金额 存货代码 存货名称 消耗金额 1.在任意一个工作表中 ...

  8. 实战 2000w 数据大表的优化过程,提供三种解决方案

    大家好,我是不才陈某~ 当我们业务数据库表中的数据越来越多,如果你也和我遇到了以下类似场景,那让我们一起来解决这个问题 数据的插入,查询时长较长 后续业务需求的扩展 在表中新增字段 影响较大 表中的数 ...

  9. Mysql在生产环境中快速清理数据及表空间释放

    Mysql数据快速清理及表空间释放 1.TABLES表主要字段说明: MySQL的 information_schema 数据库中的TABLES 表记录了MySQL数据库中每个表占用的空间.表记录的行 ...

  10. mysql如何进行数据透视,mysql-如何优化数据透视表的条件检查?

    在recent question中,StevieG向我展示了如何解决数据透视表的问题.新的问题是我必须检查数据透视表上的某些条件.让我们进行最后的查询: SELECT c.id, GROUP_CONC ...

最新文章

  1. MySql数据库Update批量更新与批量更新多条记录的不同值实现方法
  2. 【FFmpeg】警告:[hls] pkt.duration = 0, maybe the hls segment duration will not precise
  3. acwing算法题--多重背包问题二
  4. 寄快递要在面单上写身份证号?市民担心个人信息泄露
  5. linux系统硬盘坏道,如何在 Linux 系统下检测硬盘上的坏道和坏块
  6. Nginx容器动态流量管理方案-nginx-upsync-module+nginx_upstream_check_module初体验
  7. centos7 python3安装numpy_centos 7 下安装numpy、scipy等python包
  8. mysql表里插不进去数据_Oracle数据中表值插不进去问题(转)
  9. Linux环境下的JFreeChart中文乱码问题解决办法
  10. python什么时候用进程什么时候用线程_Python多线程/多进程释疑:为啥、何时、怎么用?...
  11. 周爱民:真正的架构师是没有title的(图灵访谈)
  12. LeetCode 199. 二叉树的右视图(DFS)(特殊的递归)
  13. python中threading中的lock类
  14. linux kill 杀一个进程
  15. PS打开PSD文档服务器未响应,ps打不开psd文件的解决方法
  16. hbuildX使用夜神模拟器配置
  17. cad 打开硬件加速卡_Win10系统运行CAD不流畅解决方法
  18. FPGA和USB3.0通信-UVC摄像机
  19. 计算机音乐我还是曾经那个少年,我还是曾经的那个少年什么歌曲
  20. 项目经历——地图定位神器

热门文章

  1. cocoapods应用第一部分-xcode创建.framework相关
  2. 安防监控芯片市场高清化趋势愈显 成行业共识
  3. 【莫队算法】URAL - 2080 - Wallet
  4. 使用css3背景渐变中的透明度来设置不同颜色的背景渐变
  5. bash脚本基础概念注意点
  6. 计算机世界:免费的代价
  7. Silverlight 项目结构解析
  8. VC++动态链接库编程之DLL木马(转)
  9. 记忆网络之在对话系统中的应用
  10. 微软小冰迎来了一个新姐妹:“欣小然”