文章目录

  • 一、Page——页
    • 一、Page Directory(记录在页中的展现)
  • 二、B数 & B+树
    • 一、B树和B+树的区别
  • 三、Index——索引
    • 1、聚簇索引——主键
    • 2、二级索引——非主键
  • 缓冲池——Buffer Pool
  • 总结

一、Page——页

为了避免一条提条的读取磁盘的数据,InnoDB采取页的方式,作为磁盘和内存之间交互的基本方式

一个页的大小一般是16KB

InnoDB为了不同的目的而设计了多种不同类型的页:
1、存放表空间头部信息的页
2、粗放undo日志信息的页等…
把存放表中数据的页称为索引页或是数据页

                             数据页结构

                             数据页的头信息


一、Page Directory(记录在页中的展现)

最底层记录的特点
1、按照主键从小到大一次排序
2、单项列表

分组的规则
1、对于Infimum记录,组里只能有1条记录,就是本身
2、对于Supremum记录,组里只能有1-8条记录
3、对于其他的记录,组里面只能有4-8条记录

分组步骤
起初:没有记录,一个新的数据页有两个组,Infimum组1条记录,另一个是Supremum组1条记录
之后:插入数据的时候,往Supremum组里面插入,n_owned 加 一
最后:Supremum组满后,进行拆分,1个组拆分为2个组,申请新的槽位(Slot)

各个标志位的解释

  • deleted_flag

物理删除(delete语句删除数据)& 逻辑删除(is_deleted字段) 0:未删除, 1:已删除

为什么不直接删除? 性能消耗

删除操作:
1、把deleted_flag=1
2、把删除掉的记录,组成一个垃圾链表(目的:空间的可重用性)

  • min_rec_flag

B+树每层非叶子节点中标识最小的目录项记录

  • n_owned

把一个页划分成若干个组。一个组里的“大哥(组里面主键最大)”,会保存该值,该值标识一个组里有多少条记录

  • heap_no

堆号。每条插入进来的记录都会分配堆号。从heap_no=2开始

为什么从heap_no=2开始?
infimum的heap_no=0(默认) 第一条
Supremum的heap_no=1(默认)最后一条

  • record_type

记录类型
0:普通记录(插入的记录)
1:B+树非叶子节点目录项记录
2:表示infimum的记录
3:表示Supremum的记录

  • next_record

下一条记录
:从当前记录的真实数据到下一条记录的真实数据的距离


二、B数 & B+树

一、B树和B+树的区别

                                 B树

                                             B+树

  • B树和B+树的相同点

    • 一个节点可以存储多个元素
    • 与B树一样,叶子节点是排序
    • 每个节点中的元素,也都是按照从小到大的顺序排列,即左小右大
    • 所有的叶子节点都位于同一层,或者说根节点到每个叶子节点的长度都相同
    • 根节点元素个数: 1<= k <= m-1 (m表示阶数,即:一个节点最多有多少个子节点)
    • 非根节点元素个数:m/2 <= k <= m-1
  • B树和B+树的不同点

    • 叶子节点是有指针的,MySQL中采用双向指针
    • 非叶子节点的元素是与叶子节点有冗余的

三、Index——索引

B+树中,叶子节点里存储完整的数据(数据页)。非叶子节点,存储的主键索引(索引页)

1、聚簇索引——主键

聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分


2、二级索引——非主键

根据实际情况自行添加的索引都是辅助索引,辅助索引就是一个为了需找主键索引的二级索引,先找到主键索引再通过主键索引找数据


缓冲池——Buffer Pool

mysql使用 Innodb作为存储引擎, 并且数据都是以页(page)的形式存储在表空间里,因为磁盘访问速度很慢,所以为了提高速度,当访问某个页上面的数据时 ,先将这个页的所有数据加载到内存中并且缓存起来就可以对数据进行读写操作了,下次再次访就不需要再去磁盘里找了,为了提高效率这个内存就是buffer pool 缓存池

1、缓存作用
2、关系:索引、数据————>页————> 磁盘
3、select * from user where id = 1; 查询一条记录,但是需要把该记录所在的页的所有记录都查询出来放入内存那种
4、如果查询数据不在一个页里,就会导致有大量的io操作

5、某一刻,会将脏页刷新到磁盘?什么情况下刷新?
1、 从flush链表中刷新一部分页面到磁盘
后台有线程,根据系统的繁忙程度来确定刷新的速率。BUF_FLUSH_LISH
系统很繁忙,照成我们刷新脏页到磁盘的速度很慢。没有可用的缓冲液。就会去查看LRU链表尾部,是不是存在直接释放掉的未修改的缓冲液。如果没有,不得不将LRU链表尾部的一个脏页同步刷新到磁盘中。BUF_FLUSH_SINGLE_PAGE
2、从LRU链表的冷数据汇总刷新一部分页面到磁盘 BUF_FLUSH_LRU

                         flush链表

                         LRU链表

总结

提示:

Mysql中Page(页)和结构的认识相关推荐

  1. 从MySQL中导出表中数据_用命令从mysql中导出/导入表结构及数据

    在命令行下mysql的数据导出有个很好用命令mysqldump,它的参数有一大把,可以这样查看: mysqldump 最常用的: mysqldump -uroot -pmysql databasefo ...

  2. MYSQL中如何查看表结构命令_mysql查看表结构命令

    mysql查看表结构命令,如下: desc 表名; show columns from 表名; describe 表名; show create table 表名; use information_s ...

  3. MySQL中dd::columns表结构转table过程以及应用

    一.MySQL的dd表介绍 二.代码跟踪 三.知识应用 四.总结 一.MySQL的dd表介绍 MySQL的dd表是用来存放表结构和各种建表信息的,客户端建的表都存在mysql.table和mysql. ...

  4. mysql 表数据转储_在MySQL中仅将表结构转储到文件中

    mysql 表数据转储 For this exercise, we will use the mysqldump utility the same as if we were backing up t ...

  5. mysql中的页与磁盘关系_数据库和磁盘阵列的关系

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  6. mysql中如何查看表结构

    1.登陆mysql 命令: mysql -uroot -p 2.此处以mysql数据库的func表为例 查看表结构的方法1 ---命令: desc func; --方法2 命令: describe f ...

  7. MySQL中B+树索引,聚簇索引,二级索引,辅助索引,回表,索引生效条件

    对于MySQL,我们经常说调优有一个手段就是加索引,那么为什么加索引能够优化查询,是不是加了索引查询就快了 ? 在MySQL中,存储的单元并不是按照我们理解的一条一条记录,而是按照页来进行存储的,My ...

  8. java怎么判断mysql中是否存在我们查找的索引_10张图告诉你,MySQL 是如何查找数据的?...

    在我们日常生活中经常会涉及到查找某个东西的场景,就比如说在一个学校里吧,我们想找出个子"最高的10个"同学,或者想查找姓名是"张三"的同学,又或者是查找学号是& ...

  9. writedouble_从MySQL中的double write问题说开去

    有句话说得好,世上只有两种工具,一种是被人骂的,另一种是没人用的.被骂得越多,侧面反映出关注度越高,使用率越高,越用越成熟,这一点上, MySQL就是一个很不错的例子.而MySQL可支持的存储引擎很多 ...

最新文章

  1. mipi LCD 的CLK时钟频率与显示分辨率及帧率的关系
  2. linux 内核 发送数据,linux 内核tcp数据发送的实现
  3. sql server 2008学习2 文件和文件组
  4. 学水利的想转行计算机,为什么说千万别学水利水电工程?附水利八大院排名2020年(最新)...
  5. 接口测试到底是什么?如何制造接口数据
  6. Github远程仓库管理
  7. 致openGauss社区用户的一封信
  8. CGAL4.4+VC2008编译
  9. Unknown symbol platform_driver_unregister (err 0)
  10. axios 是如何封装 HTTP 请求的
  11. [zz]ASP.net中新建Web网站与新建Web应用程序的区别
  12. 1.2 矩阵与线性方程组-向量空间、内积空间与线性映射
  13. JAVA拉取Hive的数据导入到MySQL中
  14. 使用Laravel和Vue.js2.5进行服务器端渲染
  15. 宽带DDC matlab,基于DDC和DUC的大带宽DRFM设计与实现
  16. flutter在IOS上显示英文
  17. 【JoJo的摄影笔记】胶卷的落日——柯达帝国兴衰录
  18. 第三章程序的机器级表示 学习报告
  19. 三维地图之cesium加载天地图(有代码)
  20. MATLAB2016b遗传算法工具箱安装

热门文章

  1. 在安卓手机上安装Ubuntu详细教程(无需root)
  2. 网络计划法中的最早时间和最迟时间以及关键事件。
  3. 3D视觉检测风挡玻璃智能涂胶工作站
  4. 《互联网保险业务监管办法》(征求意见稿)全文无删减
  5. Skywalking(10):告警功能
  6. nor和nand的区别 emmc 字符设备和块设备
  7. IT运维工单高效协同,助力打造一站式运维方案
  8. 关于mysql group by后取指定的数据留下来
  9. BZOJ1064【NOI2008】【假面舞会】
  10. 极验验证的滑动验证码破解