MySQL-没有索引的时候数据是个什么样子

从一条记录说起

数据结构

  在innnerDB引擎中上图就是一条记录的数据结构,图中可以看出一条记录分为额外信息和真实信息两大块,真实信息就是各个列的实际值,而额外信息就包含变长字段长度列表,NULL值列表和记录头信息3部分。
.1. 变长字段长度列表.: 在mysql中有基本类型(定长)和变长类型两大块。基本类型有TINYINT ,SMALLINT,INT,INTEGER,BIGINT,FLOAT,DOUBLE。变长类型就有char,varchar,text,DECIMAL等。变长类型就会在此列表中,因为变长字段是由用户自定义的长度,所以mysql需要在字段创建后,需要记录每个变长列实际值。
.2. NULL列表.:对于记录为NULL值的数据会存放在这些地方。
.3. 记录头信息.:记录头信息是由固定的5个字节组成,那么就是40位。这些位一共组合成8个参数。
在这里插入图片描述
  上图就是记录头中各个参数的意思。大家别被这些参数吓到,小编给大家讲讲大概意思。
  前两个预留位就不说了,设计mysql的大叔为了方便扩展用的保留字。
.1.delete_flag:标记记录是否删除,大家可能就会疑惑,平时砸门删除记录,难道不是直接从硬盘上删除了么。其实对于记录的删除,mysql做的事情有很多,这里就浅讲一下,首先记录会讲这个标记为设置为1,但是实际不会从硬盘直接删除,就类似砸门工作中的软删。这么做的目的是为了复用,mysql会像向内存申请一块连续的存储空间,如果下次又有相同的记录进来,直接将标志位复原就行,而不用进i/o,重新排序等操作消耗性能。那么会一直存在不进行物理删除么,其实也不会,mysql有一个线程会专门处理这些标记删除的记录进行实实在在的删除。其实除了删除线程,我们的日志文件也会进行帮忙删除。这里就暂时先不展开了。

2.record_type:0和1好理解,那后面那两个玩意又是啥呢?,其实这两个东西就类似,队长和队尾的兄弟,就是说在表没有记录的时候就会有这两个记录存在,一个永远在队首的位置,一个永远在队尾的位置,其实对数据结构了解的兄弟一眼就看出这就是头结点和尾结点。

  其他参数就是字面含义了,大家其实多看几遍这几个参数,又是头结点,尾结点的,又是记录下一条的记录地址。那么就联想到数据结构-链表了。没错在没有索引树的时候,记录就是通过链表相连的。

存放记录的池子-页

在这里插入图片描述
  原谅小编画图实在太辣鸡就直接抠图了哈。上图就是数据页的结构,其实在前面页提到过页,细心的同学就行发现了页面中最小的记录和最大记录两个参数,这也证实了页是由多个记录组成的。
  我们先来看User Records这个参数,意思是用户的记录(也叫做堆),记录分为mysql自己的系统参数和我们用户插入的记录。那么我们插入的记录都是在这里紧密相连的,前面我们在说一条记录的数据机构的时候提过heap_no这个参数,表示在页中的地址位置,那么就是在User Records中的位置。
  再来谈next_record这个参数,表示下一条记录的位置,其实就知道了队列中你后面那兄弟距离你有多远,Supremum一直是队列中吊车尾的存在所以他的这个参数值就是0了。
  砸门来看看重点n_owned这个参数的目的,前面说过页里面的数据会被分为若干个组,每个组都有个队长,这个值就代表每个组有多少条记录,其实他不仅仅这个作用。我们大概介绍了记录和页的数据结构,那么我们查询记录的时候,mysql到底是怎么遍历的呢?不说废话,搬图!
在这里插入图片描述
  这就是一个页的里面记录存放的样子,每个页被分组为若干个组,每个组中的数据按照顺序用单向链表连接起来,每个组中最大的记录(队长)取next_record参数作为槽拿出来连接起来放到左边,那么这个时候我想要查id为6的记录该怎么玩呢?
  一条条遍历肯定是非常耗时,因为记录都是链表,无法向数组那样通过下标就可以取出来。这时候槽的作用就体现出来,我们可以先遍历槽,符合条件再通过槽去找那一组记录,再遍历那一组记录就可以得到值啦。
  这里采用的是二分法进行遍历,首先找到中间槽槽2的位置,通过next_record参数发现是8,那证明前面有8条记录,而记录又是顺序相连的,那么肯定是在槽2或者前面的槽里面,再二分法从槽0和槽2之间查到槽1的位置,发现槽1的next_record参数发现是4,那就证明只可能再槽2中,这时候通过8这条记录往前遍历就可以找到6这条记录啦。
  不得不佩服设计mysql的大叔的睿智,其实这里大家也发现了,虽然使用了二分法避免全表遍历,但是如果记录非常多呢,二分法同样非常耗时。所以mysql大叔就引进了索引这个东西。这个下章会讲到索引的结构。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值