Mysql 索引底层数据结构和算法

news/2024/10/6 18:27:27 标签: mysql, 数据结构, 数据库

目录

索引数据结构

Hash表

二叉树

红黑树

B树 

B+树 


索引数据结构

        索引(index)是帮助MySQL高效获取数据的一种有序数据结构。索引是存储到表空间中,当我们的 sql 中的where条件用到索引的时候,会在存储引擎层就过滤出数据来,如果不走索引,则需要在server层过滤。 存储层过滤的性能比在server层更好。

 常用的索引结构有:Hash表,二叉树,平衡二叉查找树(红黑树是一个近似平衡二叉树),B树,B+树。

数据结构在线演示网站:Data Structure Visualization

Mysql5.7之后选用B+树作为默认的索引结构,接下来,介绍各种数据结构存在的优缺点。

Hash表

        我们使用Hash表存储表数据Key可以存储索引列,Value可以存储行记录或者行磁盘地址。Hash表在等 值查询时效率很高,时间复杂度为O(1);

原理

 A. 事先将索引通过 hash算法后得到的hash值(即磁盘文件指针)存到hash表中。

 B. 在进行查询时,将索引通过hash算法,得到hash值,与hash表中的hash值比对。通过磁盘文件指针,只要一次磁盘IO就能找到要的值。

优点:

  • 对索引的key进行一次 hash 计算就可以定位出数据存储的位置。
  • 很多时候 hash 索引要比 B+ 树索引更高效

缺点:

  • 仅能满足 ''='',''IN'',不支持范围查询(因为Hash冲突问题,且hash表无序
  • 不适合模糊查询(like)的场景

二叉树

特点:父节点左子树所有结点的值小于父节点的值,右子树所有结点的值大于父节点的值。二叉树的检索复杂度和树高相关:理想状态下效率可以达到O(logn)

缺点:在某些特定的情况下,二叉树有可能退化成单链表的,此时会进行全表扫描,并且元素的查找效率也会明显的下降。

红黑树

  红黑树是一个近似平衡的二叉树。

   平衡二叉树是采用二分法思维,平衡二叉查找树除了具备二叉树的特点,最主要的特征是树的左右两个 子树的层级最多相差1。在插入删除数据时通过左旋/右旋操作保持二叉树的平衡,不会出现左子树很 高、右子树很矮的情况。

    使用平衡二叉查找树查询的性能接近于二分查找法,时间复杂度是 O(log2n)。

缺点:

  • 时间复杂度和树高相关:树有多高就需要检索多少次,每个节点的读取,都对应一次磁盘 IO 操作 【瓶颈】。
    • 磁盘每次寻道时间为10ms,在表数据量大时,对响应时间要求高的场景下,查询性能就会出 现瓶颈。 举例:1百万的数据量,log2n约等于20次磁盘IO,时间20*10=0.2s
  • 平衡二叉树不支持范围查询快速查找,范围查询时需要从根节点多次遍历,查询效率极差。
  •   数据量大的情况下,索引存储空间占用巨大

B树 

       减少耗时的IO操作,就要尽量降低树的高度, 把二叉树,变为多叉树。每个节点存储多个元素,在每个节点尽可能多的存储 数据。

特点:

  • B树的节点中存储着多个元素,每个节点内有多个分叉。
  •  节点中的元素包含键值和数据,节点中的键值从大到小排列。也就是说,在所有的节点都储存数 据。
  •   父节点当中的元素不会出现在子节点中。
  •  所有的叶子结点都位于同一层,叶节点具有相同的深度,叶节点之间没有指针连接

优点:

  • 磁盘IO次数会大大减少。
  • 比较是在内存中进行的,比较的耗时可以忽略不计。
  • B树的高度相比于平衡二叉树会大幅缩小,所以使用B树构建索引可以很好的提升查询的效率。

缺点

  • B树不支持范围查询的快速查找:如果我们想要查找15和26之间的数据,查找到15之后,需要回到 根节点重新遍历查找,需要从根节点进行多次遍历,查询效率有待提高。
  • 空间占用较大:如果data存储的是行记录,行的大小随着列数的增多,所占空间会变大。一个页中 可存储的数据量就会变少,树相应就会变高,磁盘IO次数就会变大。

B+树 

        在B树基础上,MySQL在B树的基础上继续改造,使用B+树构建索引。B+树和B树最主要的区别在于非 叶子节点是否存储数据的问题

B树:非叶子节点和叶子节点都会存储数据。

B+树:只有叶子节点才会存储数据,非叶子节点只存储键值。叶子节点之间使用双向指针连接,最 底层的叶子节点形成了一个双向有序链表。

优点:

  • 继承了B树的优点【多叉树的优点】
  • 支持范围查询,保证等值和范围查询的快速查找
  • MySQL的索引就采用了B+树的数据结构


http://www.niftyadmin.cn/n/5691988.html

相关文章

C++、Ruby和JavaScript

C C最初被称为带类的C, 兼容C的语法,此既是C得以流行的前提,也是C某些语法被捆绑的根源。C的来源于C语言的递增运算符,代表增加,意义为扩展。 C的历史 C类的设计思想来源于Simula. Simula为模拟的意思,被称为最早的面向…

计算机网络:物理层 —— 物理层下的传输媒体

文章目录 传输媒体导向性媒体同轴电缆双绞线光纤光纤分类中心波长光纤规格光纤的优缺点 非导向性媒体ISM 频段无线电波微波激光红外线可见光 传输媒体 传输媒体是计算机网络设备之间的物理通路,也称为传输介质或传输媒介,并不包含在计算机网络体系结构中…

计算机找不到vcomp140.dll,无法继续执行代码如何解决,有什么好的修复方法

1. vcomp140.dll 简介 1.1 定义 vcomp140.dll 是一个动态链接库(DLL)文件,它属于 Microsoft Visual C 2015 Redistributable Package 的一部分。该文件为应用程序提供了 OpenMP 并行框架所需的运行时支持,允许开发者编写并发和多…

Python知识点:如何使用SpaCy进行文本预处理与分析

开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候! 如何使用SpaCy进行文本预处理与分析 在自然语言处理(NLP&#xff09…

阿里巴巴开源的FastJson 1反序列化漏洞复现攻击保姆级教程

免责申明 本文仅是用于学习检测自己搭建的靶场环境有关FastJson1反序列化漏洞的原理和攻击实验,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其所在…

自闭症寄宿学校陕西:提供综合发展的教育环境

在陕西这片古老而充满希望的土地上,有一所特殊的学校——星贝育园康复中心,它如同一座灯塔,照亮了无数自闭症儿童及其家庭前行的道路。这所全国规模较大的广泛性发育障碍全托寄宿制儿童康复训练机构,不仅以其专业的康复训练和独特…

swift使用代码结构解析

多模态模型的训练llamafactory也可以训练,但是总的来说,llamafactory对多模态模型的支持还是不太多,ms-swift支持的多模态模型更多,因此有时候去找框架是否够支持相应的模型时会有所困难,所以对这些框架的代码也要稍微…

计算机网络——ftp

在网络通信中,控制连接和数据连接是两种不同类型的连接,它们各自具有特定的功能和用途。 一、控制连接 定义与功能: 控制连接主要用于在通信双方之间传输控制信息,以建立、维护和终止数据连接。它负责协调和管理数据传输的过程&am…