MySQL——索引

x33g5p2x  于2021-11-21 转载在 Mysql  
字(1.5k)|赞(0)|评价(0)|浏览(490)

一、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层:那么最多可以存放 100
    10001000=1亿条记录。
    第4层:那么最多可以存放 100
    100010001000=1000亿条记录。
    所以,综上所述,一般情况下,我们用到的B+树都不会超过4层。
    数据页的Page Header部分,介绍过一个名为PAGE_LEVEL的属性,它就代表着这个数据页作为节点在B+树中的层级。

相关文章