Mysql 数据库索引学习总结

该篇只是针对一个视频的学习后的总结,内容不是非常的全面,不过也可以让我们拾起一些记忆。

本篇主要围绕以下几个问题来说明:

1、什么是索引?

2、索引的作用与本质?

3、索引都有哪些算法?

4、Mysql中索引是如何存储的?

5、为什么普通索引中的叶子节点中只存储id和name?

什么是索引?

  索引是帮助快速检索出数据的数据结构。举个例子:你去图书馆找书,首先会根据目录去找到对应的书架,然后找到你想要的那本书。如果没有目录,图书馆的书有成千上万,你需要一本一本的找,岂不是把人给累死,所以这就是索引的好处。

索引的作用与本质:

作用:快速检索

本质:数据结构+算法

常见的数据结构有:数组、链表、图、树、队列……

那么,数据结构的本质是什么呢?答案:存储数据

索引都有哪些算法:

  哈希散列法、二叉树、红黑树、B-Tree、B+Tree

哈希散列法:

  题外话:InnoDB默认使用了自适应hash算法,当你使用等值查询,达到一定阈值后,会使用这种算法【eg:select * from table where name=‘张三’】

优点:最好时间复杂度是O(1),能够快速检索

缺点:不支持范围查找

二叉树:

特点:一棵相对平衡的有序二叉树,对其进行插入、查找、删除等操作,平均复杂度均为O(logn)。它的左子节点的值比父节点的值要小,右节点的值要比父节点的值大。
在这里插入图片描述

优点:平均复杂度均为O(logn)

缺点:当插入的值比之前大,会导致二叉树倾斜,平均复杂度为O(n)
二叉树倾斜如图:
在这里插入图片描述

红黑树:

特点:

① 每个节点或者是黑色,或者是红色;

② 根节点是黑色;

③ 每个为空的叶子节点是黑色;

④ 如果一个节点是红色的,则它的子节点必须是黑色的;

⑤ 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点;
在这里插入图片描述

优点:相对平衡、平均复杂度均为O(logn)

缺点:跟二叉树一样,也会存在倾斜,只不过是对二叉树的一个小改进
在这里插入图片描述

B-Tree:

特点:

  B-Tree是为磁盘等外存储设备设计的一种平衡查找树。【画外音:系统从磁盘读取数据到内存时,是以磁盘块(block)为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么】。

  InnoDB存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位。InnoDB存储引擎中默认每个页的大小为16kb。show variables like 'innodb_page_size';//查看InnoDB页的大小

  系统一个磁盘块的存储空间往往没有那么大,因此InnoDB每次申请磁盘空间时都会是若干地址连续磁盘块来达到页的大小16kb。InnoDB在把磁盘数据读入到磁盘时会以页为基本单位,在查询数据时如果一个页中的每条数据都能助于定位数据记录的位置,这将会减少磁盘IO次数,提高查询效率。
在这里插入图片描述

优点:B树相对二叉树虽然提高了磁盘IO性能

缺点:并没有解决遍历元素效率低下的问题。每个节点中既要存索引信息,又要存其对应的数据,如果数据很大,那么当树的体量很大时,每次读到内存中的树的信息就会不太够

B+Tree:

  B+树相比B树,本质上是一样的,区别就在与B+树的所有根节点都不带有任何数据信息,只有索引信息,所有数据信息全部存储在叶子节点里,这样,整个树的每个节点所占的内存空间就变小了,读到内存中的索引信息就会更多一些,相当于减少了磁盘IO次数,这样就解决了每次读到内存中的树的信息不太够的问题。

  又由B树的性质可以得到,所有叶子节点都会在同一层,B+树会以一个链表的形式将所有叶子节点的信息全部串联起来,这样,想遍历所有数据信息只需要顺序遍历叶子节点就可以了,方便又高效,这样就解决了遍历元素效率低下的问题。

  不仅如此,B+树还有一个相应的优质特性,就是B+树的查询效率是非常稳定的,因为所有信息都存储在了叶子节点里面,从根节点到所有叶子节点的路径是相同的。

优点:磁盘读写代价更低、数据信息遍历更加方便、查询效率更加稳定
在这里插入图片描述

Mysql中索引是如何存储的:

  对于InnoDB来说,它有两个文件:user.ibd、user.frm,【.ibd是索引文件、.frm是数据结构类型】;

  对于Myisam来说,它有三个文件:user.myi、user.myd、user.frm,【.myi是索引文件、.myd是数据文件、.frm是数据结构类型】

为什么普通索引中的叶子节点中只存储id和name?

  因为,为了减少磁盘空间的占用,如果你每个普通索引的叶子节点都存储整行数据,索引越多所占用的磁盘空间越多,而且你存储聚簇索引的地址,查询整行的数据效率也不会很差。普通索引通过id去查询整行记录的这个过程通常叫回表。

上述算法生成地址:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨润泽林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值