您当前的位置: 首页 >  sql

小志的博客

暂无认证

  • 2浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

MySQL——索引

小志的博客 发布时间:2021-11-04 20:45:00 ,浏览量:2

目录
    • 一、mysql中如果没有索引如何查找数据
      • 1、方式一:在一个页中查找
      • 2、方式二:在多个页中查找
    • 二、mysql中索引的概念
      • 1、前提条件
      • 2、目录项记录
      • 3、如何区分普通用户记录和目录项记录
      • 4、普通用户记录和目录项的区别有哪些?
    • 三、mysql中B+树
      • 1、如何快速定位目录项
      • 2、上图中B+树的解释

一、mysql中如果没有索引如何查找数据 1、方式一:在一个页中查找

比如数据较少,都存储在一个页中。在查找记录时,是要根据搜索条件的不同分为两种情况的。

  • 第一种情况:以主键列作为搜索条件 (1)、在页目录(Page Directory)中使用二分法快速定位到对应的槽。 (2)、然后再遍历该槽对应分组中的记录。
  • 第二种情况:以其他列作为搜索条件 (1)、因为在数据页中,没有为非主键建立Page Directory。只能从Infimum记录开始依次遍历单向链表中的每条记录,然后对比每条记录是否符合搜索条件。
2、方式二:在多个页中查找
  • 大多情况,数据量都是很多的,那么就会涉及到多个页中的查找
  • 由于没有索引,我们无法定位到记录所在的页,所以只能从第1页开始,利用【在一个页中查找】的方式,遍历所有的数据页来查找,非常耗时。
二、mysql中索引的概念 1、前提条件
  • 首先,数据准备阶段,创建表index_demo并插入如下12条数据。(假设一个Page页最多只能存放3条记录)
  • 采用数据页来存储目录项。 在这里插入图片描述
2、目录项记录
  • 为了与普通用户记录进行区分,把这些用来表示目录项的记录称之为目录项记录。
3、如何区分普通用户记录和目录项记录
  • 采用记录头信息中的record_type属性:
  • 0:普通的用户记录。
  • 1:目录项记录。
  • 2:Infimum记录。
  • 3:Supremum记录。
  • 将目录项放到数据页中的效果请见下图:

在这里插入图片描述

4、普通用户记录和目录项的区别有哪些?

(1)、不同点

  • 目录项记录的record_type=1,而不是普通用户记录的0。
  • 目录项只包含主键值和页的编号两个列;而普通用户记录的列是用户自己定义的,可能包含很多列,另外还有InnoDb自己添加到隐藏列。
  • min_rec_flag属性,只有目录项记录的这个属性才可能为min_rec_flag=1,普通用户记录的min_rec_flag都是0。

(2)、相同点

  • 它们用的都是一样的数据页。
  • 它们页的组成结构也是一样的,参考lz此博文链接https://wwwxz.blog.csdn.net/article/details/121044179。
  • 都会为主键生成页目录Page Directory。
  • 按主键值进行查找的时候,可以使用二分法来加快查询速度。
三、mysql中B+树

由于一个页我们假设只能存储3条记录,那么目录项就生成了两个——Page30和Page35。那如果数据增多,目录项也会扩展很多,那怎么快速定位目录项呢?

1、如何快速定位目录项
  • 再往上层建立节点;而这种结果,就是B+树了。如下所示: 在这里插入图片描述
2、上图中B+树的解释
  • 我们真正的用户记录其实都存放在B+树最底层的节点上,即:叶子节点。

  • 其他用来存放目录项记录的节点称为非叶子节点或内节点。

  • B+树最上面的节点叫根节点。

  • 其中最下层为第0层,往上层一次递增。

  • 按照上面的说法,往上面建立更高层的节点,那么会不会实际情况下,B+树会有好多层呢?

    我们可以大致计算一下,假设存储目录项的页可以存放1000条目录项记录;存储用户记录的页可以存放100条记录; 第1层:那么也就是说,只有1个用于存放用户记录的页节点(leaf Page),那么最多可以存储100条用户记录。 第2层:那么最多可以存放 1001000=10万条记录。 第3层:那么最多可以存放 10010001000=1亿条记录。 第4层:那么最多可以存放 100100010001000=1000亿条记录。 所以,综上所述,一般情况下,我们用到的B+树都不会超过4层。 数据页的Page Header部分,介绍过一个名为PAGE_LEVEL的属性,它就代表着这个数据页作为节点在B+树中的层级。

关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0471s