【MYSQL的索引】


前言

索引是数据库中很重要的一个知识点,所以我们很有必要去更深刻的了解它.在这篇博客中,我们将会来了解索引背后的知识,


一、什么是索引

mysql 官方对于索引的定义为:索引(Index)是帮助 mysql 高效获取数据的数据结构。可以得到索引的本质:索引是数据结构。
索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。

二、索引的作用

数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
索引所起的作用类似书籍目录,可用于快速定位、检索数据。
索引对于提高数据库的性能有很大的帮助。

三、索引的分类

你知道索引有哪些吗?大家肯定都能霹雳啪啦地说出聚簇索引、主键索引、二级索引、普通索引、唯一索引、hash索引、B+树索引等等。然后再问你,你能将这些索引分一下类吗?可能大家就有点模糊了。其实,要对这些索引进行分类,要清楚这些索引的使用和实现方式,然后再针对有相同特点的索引归为一类。我们可以按照四个角度来分类索引。

按「数据结构」分类:B+tree索引、Hash索引、Full-text索引。
按「物理存储」分类:聚簇索引(主键索引)、二级索引(辅助索引)。
按「字段特性」分类:主键索引、唯一索引、普通索引、前缀索引。
按「字段个数」分类:单列索引、联合索引。

在这里我可以展开讲讲----聚簇索引(主键索引)

首先我们需要知道的是InnoDB 是在 MySQL 5.5 之后成为默认的 MySQL 存储引擎,B+Tree 索引类型也是 MySQL 存储引擎采用最多的索引类型。

在创建表时,InnoDB 存储引擎会根据不同的场景选择不同的列作为索引:

  • 如果有主键的情况,默认会使用主键作为聚簇索引的索引键(key)
  • 如果没有主键,则会选择第一个不包含NULL值的唯一列作为聚簇索引的索引键(key)
  • 在上面都不满足的情况下,InnoDB 将自动生成一个隐式自增 id 列作为聚簇索引的索引键(key)

然后其它索引都属于辅助索引(Secondary Index),也被称为二级索引或非聚簇索引。
在这里插入图片描述

通过不同的索引进行查询,查询的方式也是不同的(因为他们在叶子节点存储的数据不同(区别))

  • 主键索引的 B+Tree 的叶子节点存放的是实际数据,所有完整的用户记录都存放在主键索引的 B+Tree 的叶子节点里;
  • 二级索引的 B+Tree 的叶子节点存放的是主键值,而不是实际数据。

比如举个例子:如果通过聚簇索引查询,我们只需要找到叶子节点中的数据就会拿到完整的数据,然而如果通过二级索引去查找,在二级索引中,我们到叶子节点中只能拿到这个数据的主键(比如上图sn作为二级索引,我们要查找sn为00031学生的信息,通过二级索引查询我们会先拿到00031学生的主键为4,然后再通过这个4进行主键查询,然后拿到00031这个学生的信息),这个过程叫回表,也就是说要查两个 B+Tree 才能查到数据。

不过,当查询的数据是能在二级索引的 B+Tree 的叶子节点里查询到,这时就不用再查主键索引查,比如下面这条查询语句:
select id from student where sn = ‘00031’

在这里插入图片描述

这种在二级索引的 B+Tree 就能查询到结果的过程就叫作「覆盖索引」,也就是只需要查一个 B+Tree 就能找到数据。

按字段个数分类

从字段个数的角度来看,索引分为单列索引、联合索引(复合索引)

  • 建立在单列上的索引称为单列索引,比如主键索引;
  • 建立在多列上的索引称为联合索引;

四、使用的场景

要考虑对数据库表的某列或某几列创建索引,需要考虑以下几点:

  1. 数据量较大,且经常对这些列进行条件查询。
  2. 该数据库表的插入操作,及对这些列的修改操作频率较低。
  3. 索引会占用额外的磁盘空间。

满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。
反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。

五、索引的操作

show index from 表名;
create index 索引名 on 表名(字段名);
drop index 索引名 on 表名;

六、索引背后的数据结构

从上面我们可以知道.索引是一种数据结构,搜索相关资料我们可以知道,mysql最典型的存储数据结构是B+树,但是为什么要用这个类型呢?这就需要我们去研究研究了,查询速度快的我们都知道,应该是Hash,还有二叉树,为什么我们不用这两个呢?

1.Hash
首先我们来看看Hash存在的问题,哈希表的插入、删除、查找的时间复杂度都是 O(1);这个速度是非常快的,但是mysql并没有选择这种数据结构,这是为什么呢,因为对于Hash而言,其创建和添加数据并不是通过排序和比较的方式,所以他不支持做范围查询.这是非常大的一个问题,我们进行查询怎么可能不进行范围查询呢,所以排除了这种数据结构

2.二叉平衡搜索树
在这里插入图片描述
平衡是为了不浪费,搜索可以后面支持范围查询,虽然它支持了范围查找,但是它也出现了一个问题,那就是当数据量非常大的时候,树的高度会非常的高,这个树的高度会产生一个问题,每一层查找导致IO访问次数变多了,这是非常耗费时间的,所以为了提高IO访问次数,我们可以降低树的高度,这个时候B树就出现了,

3.多路平衡查找树(B树)
在这里插入图片描述
它很大程度上解决了二叉搜索树所存在的问题,虽然多叉树时间效率相对较高且支持范围查询,mysql并没有选择它,而是在他的基础上进行了优化,选择了B+树

4.B+树
在这里插入图片描述
这就是Mysql最典型使用的存储数据结构,接下来分析一下它的特点

  1. 相较于B树,所有数据都出现在叶子结点,非叶子节点,只存储key,导致非叶子节点占用空间更少,这些非叶子节点就可能存储在内存中,或者(部分存储在内存中),那么IO访问次数将会更少
  2. B+树的所有叶子节点构成链表,此时更方便进行范围查询
  3. 相对于B树,其每个节点值都在叶子结点上,在同一层进行查询操作,性能相对均衡,也就是在控制树高的情况下,其性能是可控的
  4. B+树通过一层多个节点的引用,控制了树的高度,减少了IO次数,提高了时间效率

总结

在这篇博客中,我了解到了索引的分类,什么时候可以用索引,索引背后的存储引擎是用的什么数据结构,知道了为什么B+树为什么是最适合Mysql的,还对聚簇索引,二级索引有了深刻理解,知道了什么是回表,知道了不需要回表查询的过程叫覆盖索引.

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值