返回顶部
首页 > 资讯 > 数据库 >MySQL的索引系统采用B+树的原因解析
  • 652
分享到

MySQL的索引系统采用B+树的原因解析

2024-04-02 19:04:59 652人浏览 薄情痞子
摘要

目录1.什么是索引?2.为什么需要索引?3.如何设计索引系统?4.Mysql索引系统是什么呢?5.哈希表 6.树6.1 二叉树6.2 二分查找树(Binary Search

1.什么是索引?

索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。(就好像我们小时候用的字典,有了字典查到对应的字就会变快)

2.为什么需要索引?

首先我们需要了解一些概念和知识

  1. mysql数据存储在什么地方?----磁盘
  2. 查询数据比较慢的,一般情况下是卡在哪了? ----io
  3. (所以我们要提高IO的效率,那么如何提高呢?---- 次数和量两个层面,例如:搬砖,搬一次和搬十次耗费的力气是不一样的,一次搬一块和一次搬十块耗费的力气(占用IO资源)也是不一样的。所以我们尽可能的在满足自身需求的前提下,减少和IO的交互)
  4. 去磁盘读取数据的时候,是用多少读取多少嘛? ----磁盘预读
  5. 磁盘预读:内存跟磁盘在发生数据交互的时候,一般情况下有一个最小的逻辑单元,称为页,datapage,页一般由操作系统决定是多大,一般是4k和8k,而我们在进行数据交互的时候,可以取页的的整数倍来进行读取,innodb存储引擎每次读取数据为16k
  6. 局部性原理:数据和程序都有聚集成群的倾向,同时之前被访问过的数据和可能再次被查询,涉及空间局部性、时间局部性

通过以上几个概念我们大概知道索引是用来干嘛的了----预先设计好索引系统,等我们查询数据的时候,减少和IO的交互来提高我们的查询效率。

3.如何设计索引系统?

我们还是先明白几个概念

  • 索引存储在哪?---- 磁盘,查询数据的时候会优先将索引加载到内存中
  • 索引在存储的时候需要什么信息?需要存什么字段值?

—— key:实际数据行中储存的值
—— 文件地址(指针、我们需要找到存储数据文件在哪就得靠文件地址)
—— offset:偏移量(如果我们要取文件中的某一条数据时,就需要用到偏移量)

  • 上面说的这种格式的数据要使用什么样的数据结构来储存?

—— 上面可知我们我们的数据格式是 K-V类型的
知道K-V格式数据那我们就知道使用什么数据结构来储存了,有哈希表、树(二叉树二分查找树二分平衡树红黑树B树B+树
综上所述,我们可以上面的数据结构来设计我们的索引系统

4.MYsql索引系统是什么呢?

为什么不按照上面说的格式储存呢?

众所周知,mysql的索引系统使用的是B+树,为什么是B+树呢?接下来我们逐个分析其他的存储结构为什么不行。在此之前,我们还是需要了解两个前置知识----OLAP和OLTP

当我们存储的数据量越多时,对应建立的索引也会越大,当我们从磁盘读取到内存时就会产生IO问题,那我们又对索引建立索引嘛?不是的,所以mysql采取的B+树

5.哈希表

在这里插入图片描述

上面是哈希表的存储结构,我们来探讨这类的存储结构的优缺点
缺点:

  • 哈希冲突会造成数据散列不均匀,会产生大量的线性查询,比较浪费时间
  • 不支持范围查询,当进行范围查询的时候,必须要挨个遍历
  • 对于内存空间的要求比较高(要把全部数据加到到内存中)

优点:
如果是等值查询,那么会非常快

那么在mysql中有没有hash索引呢?

  • memory存储引擎使用的是hash索引
  • innodb支持自适应hash

 6.树

6.1 二叉树

在这里插入图片描述

二叉树本身是无序的,当我们在进行数据查找时要挨个去跟每个节点进行数据对比,看是否符合我们的数据要求,效率低下

6.2 二分查找树(Binary Search Tree ,BST)

在这里插入图片描述

二分查找树的特点:插入数据的时候必须有序,左子树必须小于跟节点,右子树必须保证大于根节点。所以使用二分查找树对比二叉树来显然提高了查询效率。
但是如果数据插入是递增或者递减的顺序的话,二分查找树就会退化成链表,查找效率又降低了

在这里插入图片描述

6.3 平衡二叉树(Balanced Binary Tree, AVL树)

在这里插入图片描述

根据二叉查找树的所暴露出的问题,我们通过使用AVL树经过左旋或者右旋让树平衡。但是为了保证平衡,在插入数据的时候必须要旋转,通过插入性能的损失来弥补查询性能的提升。读多写少的情况还好,但是如果我读写请求一样多,那就不合适了。

6.4 红黑树

在这里插入图片描述

红黑树也是经过左旋和右旋让树平衡起来,还有变色的行为,最长子树只要不超过最短子树的两倍即可…所以就能让查询性能和插入性能近似取得一个平衡,但是随着数据的插入,发现树的深度会变深,深的深度越深,意味着IO次数越多,影响数据读取的效率。

6.5 B树

针对红黑树暴露的问题,那么我们应该如何提高读取的效率呢?我们能不能从有序的二叉树,变成有序的多叉树呢,这样我们就可以储存更多的数据

在这里插入图片描述

Degree为4表示的是一个节点存储三个数据值,超过就要变换。那么实际的数据是怎么存储的呢?我们需要Key完整的数据行

在这里插入图片描述

上图是B树实际存储数据的图,每个节点有三个元素key指针数据
查找实例,如果我想找28这个数据,先从磁盘块1开始发现读取不到,经对比范围在p2指针指向的磁盘块3,还是没找到,再根据磁盘块3的p2指针指向磁盘块8找到28。我们来分析一下,每个磁盘块大小为16kb,我们查找了三个磁盘块只需读取48kb,那么三层B树能存储多少条记录呢?

我们理想化一下,假设key和指针不占用大小,一条数据占用1k的大小,那么磁盘1数据可以存储16条,磁盘3也是16条,磁盘8也是16条,那么我们只能存储161616=4096条记录,这明显有点少了,而且我们是理想化的,实际key和指针也是占用大小的。

于是乎我们不禁思考,为什么存储的数据量那么少?
我们发现每层存储的大小都被data给占用了,那么我们能不能只存储key跟指针呢?为此就引出了B+树

6.6 B+树

在这里插入图片描述

B树到B+树的演变:非叶子节点不存储数据,叶子节点才存储数据

在这里插入图片描述

上图我们可以假设p1和28为一组占用10字节大小,那么第一层可以存储16000/10=1600个这样的大小,第二层也是1600,第三层data占用1kb,那就是16条,所以总的存储1600160016=40960000(4096万)条记录

mysql索引结构一般3~4层,但是还要注意一个问题。假设我们就是3层存储结构,如何存储更多的数据?
刚刚我们假设的是p1和28为10字节大小,那如果它们是1字节呢,那么存储总量是160001600010=4096000000。所以就引申出面试一直被提到的建立索引用int还是var好?

答:保证key的长度越小也好,varchar小于4字节用varcahr,大于4字节用int

根据B+树的特点,存储量大,查询快,所以mysql使用的就是B+树

总结

至此mysql索引系统为什么使用的是B+树就讲述完了,如果有什么讲错的地方希望能提醒我改正过来。

到此这篇关于MySQL的索引系统采用B+树的原因解析的文章就介绍到这了,更多相关MySQL索引B+树内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL的索引系统采用B+树的原因解析

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

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

猜你喜欢
  • MySQL的索引系统采用B+树的原因解析
    目录1.什么是索引?2.为什么需要索引?3.如何设计索引系统?4.MYSQL索引系统是什么呢?5.哈希表 6.树6.1 二叉树6.2 二分查找树(Binary Search...
    99+
    2024-04-02
  • mysql索引采用B+树结构的原因有哪些
    这篇文章将为大家详细讲解有关mysql索引采用B+树结构的原因有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。索引提高查询效率,就像我们看的书,想要直接翻到某一章,是...
    99+
    2024-04-02
  • MySQL用B+树(而不是B树)做索引的原因
      https://www.jianshu.com/p/7ce804f97967 众所周知,MySQL的索引使用了B+树的数据结构。那么为什么不用B树呢? 先看一下B树和B+树的区别。 1.B树 维基百科对B树的定义为“在计算...
    99+
    2020-03-03
    MySQL用B+树(而不是B树)做索引的原因
  • 浅析MySQL索引结构采用B+树的问题
    目录1、B树和B+树2、原因分析3、总结一位6年经验的小伙伴去字节面试的时候被问到这样一个问题,为什么mysql索引结构要采用B+树?这位小伙伴从来就没有思考过这个问题。只因为现在都这么卷,后面还特意查了很多资料,他也希...
    99+
    2022-06-21
    mysql 索引B+树 MySQL索引结构
  • MySQL使用B+树作为索引结构的原因
    这篇文章将为大家详细讲解有关MySQL使用B+树作为索引结构的原因,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、二叉查找树(BST):不平衡二叉查找树(BST,Bin...
    99+
    2024-04-02
  • MySQL中B树索引和B+树索引的区别详解
    目录1. 多路搜索树2. B树-多路平衡搜索树3. B树索引4. B+树索引总结如果用树作为索引的数据结构,每查找一次数据就会从磁盘中读取树的一个节点,也就是一页,而二叉树的每个节点...
    99+
    2024-04-02
  • MySQL索引要用B+tree的原因
    了解MySQL索引要用B+tree的原因?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!当你现在遇到了一条慢 SQL 需要进...
    99+
    2024-04-02
  • MySQL索引结构采用B+树的问题怎么理解
    这篇文章主要介绍了MySQL索引结构采用B+树的问题怎么理解的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL索引结构采用B+树的问题怎么理解文章都会有所收获,下面我们一起来看看吧。1、B树和B+树一般来...
    99+
    2023-07-02
  • Mongodb中使用B树索引的原因是什么
    这篇文章给大家介绍Mongodb中使用B树索引的原因是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。  B树和B+树  开头,我们先回忆一下,B树和B+树的结构以及特点。  树内的...
    99+
    2024-04-02
  • mysql索引数据结构要用B+树的原因是什么
    这篇文章主要讲解了“mysql索引数据结构要用B+树的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql索引数据结构要用B+树的原因是什么”吧!1. Hash表?No因考虑到...
    99+
    2023-06-30
  • MySQL中B树索引和B+树索引的区别是什么
    本文小编为大家详细介绍“MySQL中B树索引和B+树索引的区别是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL中B树索引和B+树索引的区别是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。如果用...
    99+
    2023-06-29
  • MySQL数据库索引选择使用B+树的原因是什么
    这篇文章主要介绍MySQL数据库索引选择使用B+树的原因是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、二叉查找树(1)二叉树简介:二叉查找树也称为有序二叉查找树,满足二叉查...
    99+
    2024-04-02
  • MongoDB 中索引选择B-树的原因是什么
    这期内容当中小编将会给大家带来有关MongoDB 中索引选择B-树的原因是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、B-树和B+树的区别很明显,我们要想弄清楚...
    99+
    2024-04-02
  • MySQL-InnoDB为什么采用B+树结构实现索引
    索引的作用是提高查询效率,其实现方式有很多种,常见的索引模型有哈希表、有序列表、搜索树等。 哈希表 一种以key-value键值对的方式存储数据的结构,通过指定的key可以找到对应的value。 哈希把值放在数组里,用一个哈...
    99+
    2018-07-22
    MySQL-InnoDB为什么采用B+树结构实现索引
  • MySQL的B+树索引和hash索引的区别
    简述一下索引: 索引是数据库表中一列或多列的值进行排序的一种数据结构;索引分为聚集索引和非聚集索引,聚集索引查询类似书的目录,快速定位查找的数据,非聚集索引查询一般需要再次回表查询一次,如果不使用索引就会进行全表扫描;还有可以进行多字段...
    99+
    2016-10-05
    MySQL的B+树索引和hash索引的区别
  • MySQL使用B树的原因有哪些
    这篇文章主要介绍MySQL使用B树的原因有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!  一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁...
    99+
    2024-04-02
  • MySQL中B+树索引的作用是什么
    本篇文章给大家分享的是有关MySQL中B+树索引的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。树的简介树的简介树跟数组、链表、堆栈...
    99+
    2024-04-02
  • 浅谈MySQL的B树索引与索引优化小结
    MySQL的MyISAM、InnoDB引擎默认均使用B+树索引(查询时都显示为“BTREE”),本文讨论两个问题: 为什么MySQL等主流数据库选择B+树的索引结构? 如何基于索引结构,理解常见的...
    99+
    2024-04-02
  • 使用MySQL索引的原因
    这篇文章主要介绍使用MySQL索引的原因,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!数据库系统访问数据的两种方式:(1) 顺序访问顺序访问是在表中实行全表扫描,从头到尾逐行遍历,直...
    99+
    2024-04-02
  • MySQL索引的数据结构-B+树介绍
    1.聚集索引和辅助索引 在数据库中,B+树的高度一般都在24层,这也就是说查找某一个键值的行记录时最多只需要2到4次IO,这倒不错。因为当前一般的机械硬盘每秒至少可以做100次IO,24次的IO意味着查询时间只需要0.02~0.0...
    99+
    2017-02-08
    MySQL索引的数据结构-B+树介绍
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作