广告
返回顶部
首页 > 资讯 > 数据库 >MySQL的常用引擎为什么默认使用B+树作为索引
  • 594
分享到

MySQL的常用引擎为什么默认使用B+树作为索引

2024-04-02 19:04:59 594人浏览 独家记忆
摘要

本篇文章给大家分享的是有关Mysql的常用引擎为什么默认使用B+树作为索引,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、前言为了讲清楚这个

本篇文章给大家分享的是有关Mysql的常用引擎为什么默认使用B+树作为索引,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

一、前言

为了讲清楚这个问题,阿粉先带大家了解一下什么是索引。

我记得刚刚学习数据库的时候,老师喜欢用书本的目录来类比数据库的索引,并告诉我们索引能够像目录一样,让我们更快地找到想要找到的数据。

如果是第一次接触索引,这个比喻能够让我们有一个直观的印象。但是当深入去学习索引的时候,我们不能继续持有索引即目录的思想,我们要跳出来去思考索引的本质是什么。

二、索引的本质

在没有索引的情况下,我们查找数据只能按照从头到尾的顺序逐行查找,每查找一行数据,意味着我们要到到磁盘相应的位置去读取一条数据。

如果把查询一条数据分为到磁盘中查询和比对查询条件两步的话,到磁盘中查询的时间会远远大于比对查询条件的时间,这意味着在一次查询中,磁盘io占用了大部分的时间。更进一步地说,一次查询的效率取绝于磁盘io的次数,如果我们能够在一次查询中尽可能地降低磁盘io的次数,那么我们就能加快查询的速度。

在知道了减少磁盘io能加快查询速度后,我们就要聚焦于如何减少磁盘io。如果按照原表逐行查询的话,n条数据就要查询n次,也就是O(N)的时间复杂度,为了减少磁盘io的次数,我们必须用一种查询时间复杂度更低的数据结构来保存数据。

这种查询时间复杂度低的数据结构,我们称之为索引。所以通俗来说,索引其实就是某种数据结构,能充当索引的数据结构是多种多样的。

三、索引的选择

既然索引是一种便于查询的数据结构,如果大家对数据结构有一定了解的话,大概率会首选树型结构。毕竟树型结构普遍有着O(logN)的查询时间复杂度,而且插入删除数据的性能也比较平均。(可能你会说数组,哈希表的查询速度也很高啊,这个后面也会分析)

虽然我们都已经知道mysql中最常用的引擎像InnoDB和MyISAM,最终都选择了B+树作为索引,但是这里我还是打算从最常见的二叉树开始讲起,推导一下为什么最终选择了B+树作为索引,并比较一下几种树型结构在充当索引时的优劣。

二叉树

最普通的二叉树的问题在于他不能保证O(logN)的查询时间复杂度,我们看下面的图:

MySQL的常用引擎为什么默认使用B+树作为索引

由于插入的元素逐渐增大,元素始终在右边进行插入,好好的一棵二叉树最终变成了一条“链表”。在这种极端的情况下,二叉树的查询时间复杂度不再是O(logN),而是退化为O(N),这样显然不符合索引的要求。

平衡二叉树(红黑树)

像红黑树这样的平衡二叉树,无论如何插入元素,他都可以通过一些旋转的方法调整树的高度,使得整棵树的查询效率维持在O(logN),如下图所示:

MySQL的常用引擎为什么默认使用B+树作为索引

这么来说他已经符合了成为索引的必备条件,但是最终没有选择他作为索引说明还有不足的地方。仔细看看可以发现平衡二叉树的每个节点只有两个孩子节点,如果一张表的数据量特别大,整棵树的高度也会随之上升。一个千万级别的表如果用平衡二叉树作为索引的话,树高将会达到二十多层。这也就意味着做一次查询需要二十多次磁盘io,这是一个不小的开销。

那么有没有能在大数据量的情况下,还能保持一个较小树高的树型结构呢?

B树和B+树

答案就是B树。上面我们说到了平衡二叉树的瓶颈在于一个节点只有两个孩子节点,而B树一个节点可以存放N个孩子节点,这就完美解决了树高的问题,我们可以把B树称为平衡多叉树,B树作为索引如下图所示:

MySQL的常用引擎为什么默认使用B+树作为索引

图片来源网络

但是以B树的结构作为索引仍有可以优化的地方,我们先看看最终的B+树,再仔细分析B+树在B树的基础上作了哪些改进,为什么B+树最终能够胜任索引的工作:

MySQL的常用引擎为什么默认使用B+树作为索引

图片来源网络

从图片中可以看到B+树同样是一棵多差平衡树,和B树一样很好地解决了树高的问题。

改进点一:

但仔细看可以发现,B树的节点中既存储索引,也存储表对应的数据;而B+树的非叶子节点是不存储数据的,只存储索引,数据全部存储在叶子节点上。

为什么要做这样的改进?我们做一次算术就知道了。

假设树高为2,主键ID为bigint类型,长度为8字节,节点指针为6字节,一行数据记录的大小为1k,一次io操作能获得一页16k的数据。

在索引为B+树的情况下,根节点能存储:16k / (6 + 8) = 1170 条索引指针;到了第一层,一共能指向 1170 * 1170 =  1368900 条索引指针;到了最底一层叶子节点,一个节点能存储16k / 1k = 16 条记录,一共能存储 1170 * 1170 * 16 =  21902400 条记录

在B树的情况下,由于非叶子节点使用了大量空间存储数据,存放的索引指针肯定就少,最终整棵树如果想要存储和B+树一样多的数据就必须要增加树高,这样一来就增加了磁盘io,所以说B+树作为索引的性能比B树高。

改进点二:

叶子节点之间使用指针连接,提高区间访问效率。如果我们要进行范围查询,可以轻松通过B+树叶子节点之间的指针进行遍历,减少了不必要的磁盘io。

看到这里,相信大家对为什么Mysql的常用引擎都默认使用B+树作为索引已经有了初步的认知。我们只要牢记一点:索引是为了减少磁盘io提高查询性能而存在的。

而数组虽然查询的效率高,但是增加和删除的效率低,由于记录在增加和删除的时候索引也得跟着维护,这会导致大数据量的情况下,增加或删除一条记录效率较低。

以上就是MySQL的常用引擎为什么默认使用B+树作为索引,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL的常用引擎为什么默认使用B+树作为索引

本文链接: https://www.lsjlt.com/news/68454.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL的常用引擎为什么默认使用B+树作为索引
    本篇文章给大家分享的是有关MySQL的常用引擎为什么默认使用B+树作为索引,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、前言为了讲清楚这个...
    99+
    2022-10-19
  • 为什么MySQL用B+树做索引
    索引这个词,相信大多数人已经相当熟悉了,很多人都知道MySQL的索引主要以B+树为主,但是要问到为什么用B+树,恐怕很少有人能把前因后果讲述的很完整。本文就来从头到尾介绍下数据库的索引。 索引是一种数据结构,用于帮助我们在大量数据中快速定...
    99+
    2017-02-01
    为什么MySQL用B+树做索引
  • MySQL使用B+树作为索引结构的原因
    这篇文章将为大家详细讲解有关MySQL使用B+树作为索引结构的原因,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、二叉查找树(BST):不平衡二叉查找树(BST,Bin...
    99+
    2022-10-18
  • MySQL用B+树作为索引结构有什么好处
    前言 在MySQL中,无论是Innodb还是MyIsam,都使用了B+树作索引结构(这里不考虑hash等其他索引)。本文将从最普通的二叉查找树开始,逐步说明各种树解决的问题以及面临的新问题,从而说明MySQL为什么...
    99+
    2022-05-18
    MySQL 索引结构 MySQL b+树
  • 为什么数据库索引多用B+树
    今天就跟大家聊聊有关为什么数据库索引多用B+树,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。今天我们来讲一讲数据库的索引是什么索引,就跟我们的书本的...
    99+
    2022-10-19
  • MySQL-InnoDB为什么采用B+树结构实现索引
    索引的作用是提高查询效率,其实现方式有很多种,常见的索引模型有哈希表、有序列表、搜索树等。 哈希表 一种以key-value键值对的方式存储数据的结构,通过指定的key可以找到对应的value。 哈希把值放在数组里,用一个哈...
    99+
    2018-07-22
    MySQL-InnoDB为什么采用B+树结构实现索引
  • MySQL中B+树索引的作用是什么
    本篇文章给大家分享的是有关MySQL中B+树索引的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。树的简介树的简介树跟数组、链表、堆栈...
    99+
    2022-10-18
  • 一步步分析为什么B+树适合作为索引的结构 以及索引原理
      https://www.cnblogs.com/aspirant/p/9214485.html 一步步分析为什么B+树适合作为索引的结构 以及索引原理    mysql的B+树索引 查找使用了二分查找,redis 跳表也使...
    99+
    2021-02-25
    一步步分析为什么B+树适合作为索引的结构 以及索引原理
  • 一文了解mysql索引的数据结构为什么要用B+树
    目录1. Hash表?No2. 二叉查找树(BST)?No3. 红黑树?No4. 平衡二叉树(AVL)?差那么二点意思5. B-tree(B-树也称B树)?差那么一点意思6. B+树...
    99+
    2022-11-13
  • MySQL中为什么要使用索引
    小编给大家分享一下MySQL中为什么要使用索引,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!索引是什么?MySQL 官方对索引的...
    99+
    2022-10-18
  • B+树在数据库索引中的作用是什么
    本篇文章给大家分享的是有关B+树在数据库索引中的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、B-树和B+树回顾1.B-树B-tree(多路搜索树)是一种常见的数...
    99+
    2023-06-19
  • mysql中B+Tree索引的作用是什么
    本篇文章给大家分享的是有关mysql中B+Tree索引的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、概念B+Tree是在B-Tree基础上的一种优化,使其更适合...
    99+
    2023-06-15
  • Mongodb中使用B树索引的原因是什么
    这篇文章给大家介绍Mongodb中使用B树索引的原因是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。  B树和B+树  开头,我们先回忆一下,B树和B+树的结构以及特点。  树内的...
    99+
    2022-10-18
  • MySQL数据库索引选择使用B+树的原因是什么
    这篇文章主要介绍MySQL数据库索引选择使用B+树的原因是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、二叉查找树(1)二叉树简介:二叉查找树也称为有序二叉查找树,满足二叉查...
    99+
    2022-10-18
  • mysql索引数据结构要用B+树的原因是什么
    这篇文章主要讲解了“mysql索引数据结构要用B+树的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql索引数据结构要用B+树的原因是什么”吧!1. Hash表?No因考虑到...
    99+
    2023-06-30
  • 为什么MySQL不建议使用NULL作为列默认值?
    1 前言 NULL值是一种对列的特殊约束,我们创建一个新列时,如果没有明确的使用关键字not null声明该数据列,Mysql会默认的为我们添加上NULL约束. 有些开发人员在创建数据表时,由于懒惰直...
    99+
    2023-09-10
    mysql 数据库
  • 美团面试:为什么MySQL不建议使用NULL作为列默认值?
    今天给大家分享一道美团高频面试题,“为什么 MySQL 不建议使用 NULL 作为列默认值?”。 对于这个问题,通常能听到的答案是 使用了 NULL 值的列将会使索引失效,但是如果实际测试过一下,你就...
    99+
    2023-09-11
    面试 mysql adb
  • 为什么在HTTP索引中使用Java对象是必要的?
    HTTP 索引是一种用于存储和查询信息的数据结构。通常情况下,我们使用 HTTP 索引来存储和查询文本数据,但是在某些场合下,我们需要存储和查询 Java 对象。本文将探讨为什么在 HTTP 索引中使用 Java 对象是必要的,并演示如何使...
    99+
    2023-09-13
    对象 http 索引
  • 为什么使用 PHP 容器和 Django 索引可以提高你的应用程序的性能?
    随着互联网的发展,应用程序的性能越来越受到重视。为了提高应用程序的性能,很多开发者采用了各种技术手段。其中,使用 PHP 容器和 Django 索引是提高应用程序性能的有效方法。在本文中,我们将探讨为什么使用 PHP 容器和 Django ...
    99+
    2023-10-10
    容器 django 索引
  • 为什么使用Python和Linux容器索引进行开发是一个不错的选择?
    在当今的软件开发领域,Python和Linux容器索引已经成为了非常流行的选择。这两者的结合为开发人员提供了很多便利和优势。在本文中,我们将探讨为什么使用Python和Linux容器索引进行开发是一个不错的选择,并且我们将提供一些演示代码来...
    99+
    2023-11-04
    容器 linux 索引
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作