了解过Mysql索引吗?(什么是索引)

了解过Mysql索引吗?(什么是索引)

今日内容介绍,大约花费9分钟

了解过Mysql索引吗?(什么是索引)

思考:了解过索引吗?(什么是索引)

索引(index): 帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引

思考:Mysql索引的底层数据结构了解过嘛?


MySQL默认使用的索引底层数据结构是B+树

再介绍B+树之前,我们先知道二叉树(主要是二叉搜索树和红黑树)和B树

1.二叉树

二叉树: 顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只有左子节点,有的节点只有右子节点。二叉树每个节点的左子树和右子树也分别满足二叉树的定义

了解过Mysql索引吗?(什么是索引)

常见的二叉树有:

  • 满二叉树
  • 完全二叉树
  • 二叉搜索树
  • 红黑树

1.1. 二叉搜索树

二叉搜索树(Binary Search Tree,BST)名二叉查找树,有序二叉树或者排序二叉树,是二叉树中比较常用的一种类型

二叉查找树要求,在树中的任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值

了解过Mysql索引吗?(什么是索引)

在极端情况下,二叉树会形成一个单向链表,结构如下

了解过Mysql索引吗?(什么是索引)

二叉搜索树,属于最坏的情况,已经退化成了链表,左右子树极度不平衡,此时查找的时间复杂度肯定是O(n)

1.2. 二叉树作为索引结构缺点

  • 1.如果数据是有序的,则会顺序插入,形成链表,查询效率就降低
  • 2.如果数据量比较大,层级就比较深,检索效率就慢

2. 红黑树

考虑到二叉树有这些缺点后,我们可能就会考虑使用二叉树进阶版红黑树,红黑树是一个自由平衡二叉树,解决了是顺序插入数据形成单向链表的缺点,最终形成的数据结构也是一颗平衡的二叉树

红黑树(Red Black Tree):也是一种自平衡的二叉搜索树(BST),之前叫做平衡二叉B树(Symmetric Binary B-Tree)

红黑树数据结构如下:

了解过Mysql索引吗?(什么是索引)

2.1. 红黑树的特质

  • 性质1:节点要么是红色,要么是黑色
  • 性质2根节点是黑色
  • 性质3:红黑树中红色节点的子节点都是黑色
  • 性质4: 叶子节点都是黑色
  • 性质5:从任一节点到叶子节点的所有路径都包含相同数目的黑色节点

在添加或删除节点的时候,如果不符合这些性质会发生旋转,以达到所有的性质

红黑树:保证平衡

虽然解决单向列表缺点,但是还是存在缺点:

如果数据量比较大,层级就较深,检索效率就慢

3. B树(B-Tree)

B-Tree:B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉

B树(B-Tree)具有一下特点:

  • 1.多叉树结构:B-Tree是一种多叉树,每个内部节点可以有多个子节点,使得B-Tree能够有效地存储和管理大量数据。

  • 2.平衡性:B-Tree具有平衡性,这意味着从根节点到叶子节点的任何路径的长度几乎相等。这确保了在平均情况下,对树的操作(插入、删除、查找)具有稳定的性能,不会出现严重的性能退化

  • 3.按序存储:B-Tree内的节点和数据通常按照键的顺序存储,这有助于范围查询和排序操作的高效执行。

  • 4.分层结构:B-Tree具有分层结构,从根节点到叶子节点有多个级别。

  • 5.高度平衡B-Tree的高度通常是相对较低,这是因为它的平衡性和多叉性质。高度平衡有助于减少查找操作所需的磁盘访问。

了解过Mysql索引吗?(什么是索引)

对数据库而言,所有的数据都将会保存到磁盘上,磁盘 I/O 的效率又比较低,特别是在随机磁盘 I/O 的情况下效率更低

B树(B-Tree),高度决定了磁盘 I/O 的次数,磁盘 I/O 次数越少,对于性能的提升就越大,这也是为什么采用 B 树作为索引存储结构的原因

4. B+树(B+Tree)

B+Tree是在BTree基础上的一种优化,使其更适合实现外存储索引结构,MySQL 的 InnoDB 存储引擎就是用B+Tree实现其索引结构

相比较于 B-Tree结构来说,B+Tree做了两个方面的优化,如图所示:

了解过Mysql索引吗?(什么是索引)可以看到两部分:

  • 1.蓝色框部分,索引部分,是非叶子结点,仅仅起到索引数据的作用,不存储数据
  • 2.绿色框部分,数据存储部分,是叶子结点叶子节点中要存储具体的数据
  • 3.MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能,利于排序

B树与B+树对比

  • 磁盘读写代价B+树更低

  • 查询效率B+树更加稳定

  • B+树便于扫库和区间查询

5. Mysql索引面试题

面试官:了解过索引吗?(什么是索引)

候选人:

索引在项目中还是比较常见的,帮助MySQL高效获取数据的数据结构,主要是用来提高数据检索的效率,降低数据库的IO成本,同时通过索引列对数据进行排序,降低数据排序的成本,也能降低了CPU的消耗

面试官:索引的底层数据结构了解过嘛 ?

候选人:

MySQL的默认的存储引擎InnoDB采用的B+树的数据结构来存储索引,选择B+树的主要的原因是:

第一:阶数更多,路径更短,搜索效率高

第二:磁盘读写代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据,而B-Tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储键值减少,指针跟着减少,相对于B+树同样保存大量数据,只能增加树的高度,导致性能降低

第三:B+树便于扫库和区间查询,叶子节点是一个双向链表

面试官:B树和B+树的区别是什么呢?

候选人

第一:在B树中,非叶子节点和叶子节点都会存放数据,而B+树的所有的数据都会出现在叶子节点,在查询的时候,B+树查找效率更加稳定

第二:在进行范围查询的时候,B+树效率更高,因为B+树都在叶子节点存储,并且叶子节点是一个双向链表

如果您觉得本文不错,欢迎关注,点赞,收藏支持,您的关注是我坚持的动力!

原创不易,转载请注明出处,感谢支持!如果本文对您有用,欢迎转发分享!


原文始发于微信公众号(springboot葵花宝典):了解过Mysql索引吗?(什么是索引)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/182424.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!