【MySQL数据库 | 第十七篇】索引以及索引结构介绍

这篇具有很好参考价值的文章主要介绍了【MySQL数据库 | 第十七篇】索引以及索引结构介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【MySQL数据库 | 第十七篇】索引以及索引结构介绍

目录

前言:

索引简介: 

索引结构:

          二叉树索引结构

        Tree(普通二叉树)

        B-Tree(多路平衡查找树)

        B+Tree

         哈希索引数据结构

总结:


前言:

在实际生活中,我们对SQL语句进行优化实际上有很大一部分都是对索引进行优化,因此对索引有一个较好的掌握度至关重要。而讲索引必定会引用到很多的数据结构,因此我们在这里向大家提供一个网站:数据结构可视化 (usfca.edu)。他会对我们输入的数据逐步生成我们想要演示的数据结构动图。方便各位对各种数据结构有更加深刻的了解。

索引简介: 

          索引是用于加速数据库中数据检索的一种有序的数据结构。在数据库中,数据存储在表中,表中的每一行称为记录,每一列称为字段。当我们需要检索、查询表中的某些数据时,如果表中数据量很大,那么就会变得非常耗时。这时,使用索引可以快速定位到符合条件的记录,从而提高查询效率。

          索引的本质是一个存储有序键值对的数据结构,其中键是表中某一列的值,而值是指向该值所在记录的指针。索引对于某一列的值建立了快速的查找路径,使得查询操作不再需要对整个表中的数据进行扫描,而是直接定位到符合条件的记录。

索引类型:

  • B树索引
  • B+树索引
  • hash索引

        当没有索引的时候,如果我们要对一个数据库进行条件查询操作,我们的数据库会对每一条数据都进行查询判断,直到找出来符合条件的数据

B树和B+树

B树和B+树都是一种基于磁盘存储的平衡树,被广泛应用于数据库索引结构中。它们的主要区别在于:

       1. B树中既存储数据又存储索引,而B+树只存储索引,数据存储在叶子节点上。

       2. B树的每个节点可以存储的关键字数目较小,一般不超过2个。而B+树的每个节点可以存储的关键字数目较多,一般可以存储几十个甚至几百个。

       3. B树中的非叶子节点和叶子节点的存储方式不同,而B+树的非叶子节点和叶子节点的存储方式相同。

       4. B树采用的是节点分裂和合并方式来维护平衡,而B+树采用的是节点分裂和叶子节点链表方式来维护平衡。

因为B+树节点只存储索引,数据存储在叶子节点上,因此在查询范围查找、顺序查找的情况下,B+树比B树更适合,因为B+树的叶子节点形成了一个链表,可以很快地查找到指定范围内的数据。而对于B树,需要遍历整个树结构才能找到想要的数据,这会导致非常高的时间成本。在数据库索引的应用中,B+树是更常用的一种索引结构。

案例:

       例如我们如果要查询年龄大于40岁的员工,此时我们没有建立索引,我们就会逐一遍历这些数据,直至数据完结。(并不是找到一条符合条件的之后就结束查询,而是会遍历完整个表,因为无法确定这条数据之后还是否会有符合条件的数据)。

我们把这种查询方式叫做全表查询。

无索引查询:【MySQL数据库 | 第十七篇】索引以及索引结构介绍

索引的优点:

  1. 提高数据的查询效率:索引可以加快数据库的查询效率。通过建立索引,可以对关键字进行快速的定位和访问,从而最大限度地减少了磁盘I/O的次数,降低查询数据的时间成本。

  2. 减少数据的重复存储:索引存储的是关键字的位置信息,可以避免在表中重复存储关键字,减少数据的存储空间,提高存储效率。

  3. 提高数据的完整性和准确性:索引可以对数据进行唯一性、完整性约束,防止数据重复或者无效数据的出现。

  4. 优化数据的排序和分组操作:索引可以优化数据的排序和分组操作,使这些操作更快捷和更有效率。

  5. 支持高并发查询操作:在高并发的情况下,索引可以提高数据库的查询效率,减少数据库的响应时间,从而提升了系统的性能。

索引的缺点:

  1. 增加了存储空间和维护成本:索引需要占用额外的存储空间,并且每次对数据进行更新、插入或删除等操作时都需要更新对应的索引,增加了维护成本。

  2. 索引可能不适用于所有查询:不是所有查询都能够使用索引。如果查询中包含了大量的计算、表达式、函数或者是使用了非索引列进行排序和分组,那么索引对于提高查询效率的作用就会较小。

  3. 索引可能造成资源竞争和锁的问题:当多个客户端同时访问同一个索引时,就可能会出现资源竞争和锁的问题,降低系统的并发性和性能。

  4. 索引可能会降低数据更新、插入和删除的效率:因为每次对数据进行更新、插入或删除等操作时都需要更新对应的索引,所以这些操作的效率可能会降低。

索引结构:

       索引结构随着底层的存储引擎不同而会有不同的数据结构。

【MySQL数据库 | 第十七篇】索引以及索引结构介绍

     引擎对索引的支持情况:
 【MySQL数据库 | 第十七篇】索引以及索引结构介绍

     我们平时说的索引,如果没有特别指明,都是指B+树结构组织的索引。

二叉树索引结构

Tree(普通二叉树)

【MySQL数据库 | 第十七篇】索引以及索引结构介绍

 在这里我们可以看到:如果二叉树是按照顺序结构插入,那么他就是一个链表,查询性能会大大降低。

而为了解决顺序结构的插入问题,我们引入了红黑树。

【MySQL数据库 | 第十七篇】索引以及索引结构介绍

而为了解决二叉树在层级较深的时候,会有检索速度慢的问题。我们又想到了一个方法:

      既然检索速度慢是因为每个层级只能有两个节点,那我们能否开发出来一种树,而这种树每一个层级拥有多个节点,那么我们不就解决了数据结构多的情况下普通树太多引发的层级过多的问题。

B-Tree(多路平衡查找树)

B-Tree树的生成分裂问题一直都是一个难点,搞不清楚的同学可以去这个网站:B-Tree Visualization (usfca.edu),自己输入几组数据,它会自动生成从0开始形成树的动图来让各位同学对B-Tree的形成更有体会。

我们以一颗最大度数为5的b-tree为例(每个接待你最多存储4个key,五个指针)

树的度数就是指一个节点的子节点个数:

【MySQL数据库 | 第十七篇】索引以及索引结构介绍

 翻译一下最上级的指针指向:

  • 小于20的指向一个节点

  • 20到30之间的指向一个节点

  • 30到62之间的指向一个节点

  • 62到89之间的指向一个节点

  • 大于89的指向一个节点

这也就是为什么指针的数量总是比数据的数量多一个

B+Tree

B+树节点只存储索引,数据存储在叶子节点上,因此在查询范围查找、顺序查找的情况下,B+树比B树更适合,因为B+树的叶子节点形成了一个链表,可以很快地查找到指定范围内的数据。

【MySQL数据库 | 第十七篇】索引以及索引结构介绍

 B+树的特点:

  • 所有的数据都会出现在叶子节点。
  • 叶子节点形成一个单向链表。

但需要注意的是MySQL索引中并不会直接使用这种原版的B+树,而是做了以下改进:

  •      向叶子节点中的各个节点再次添加一个指针,以此来指向相邻的节点,这种做法优化了在查询数据的时候的遍历问题,优化了时间复杂度。

【MySQL数据库 | 第十七篇】索引以及索引结构介绍

 哈希索引数据结构

       哈希索引是一种常见的索引结构,它使用哈希函数将关键字映射到哈希表中的位置,从而实现快速的查找操作。在哈希表中,每个关键字都被分配一个唯一的哈希值,这个哈希值通常是一个整数,它表示该关键字在哈希表中的位置。

       当需要查找一个关键字时,哈希函数可以快速计算出它在哈希表中的位置,并且只需要访问一个位置,就可以找到对应的数据。因此,哈希索引具有非常高效的查找性能,速度快且稳定。

       但是,哈希索引也有一些局限性。由于哈希函数是不可逆的,无法直接从哈希值中恢复原始数据,所以哈希索引不支持范围查找和排序操作。并且,当多个关键字被映射到同一个哈希值时,哈希表必须使用冲突解决策略来处理这些冲突。常见的冲突解决方法包括链式哈希和开放地址哈希等。

链式哈希(Chaining Hash)开放地址哈希(Open Addressing Hash)都是常用的哈希表实现方式。

       1.链式哈希将哈希冲突的元素放入同一个链表中,每个链表节点包含了关键字和对应的值,链表头节点位于哈希表中的对应槽位中。插入操作只需要先对元素进行哈希计算找到相应的槽位,然后再在对应槽位的链表中进行元素的插入,查找操作只需要先对元素进行哈希计算找到相应的槽位,然后再在对应槽位的链表中进行线性查找即可。

       2.开放地址哈希则是在哈希表中找到一个可用的槽位作为元素存放的位置。当遇到冲突时,需要根据哈希表中不同的探查序列方法(例如线性探查、二次探查或双重哈希等),搜索哈希表中下一个可用的槽位,直到找到可用的槽位。这种方法使得哈希表中不需要链表等额外空间来存储冲突的元素,从而节约了空间。

 哈希表索引数据结构(链式哈希解决的哈希冲突)【MySQL数据库 | 第十七篇】索引以及索引结构介绍

 哈希索引特点:

  1. 快速查找:哈希索引通过对关键字进行哈希函数运算,将其映射到哈希表中的一个特定位置,从而可以快速的查找到对应的数据。对于大量数据的查询,哈希索引比其他类型的索引更快。

  2. 不支持排序和模糊匹配:与其他类型的索引相比,哈希索引重点在于等值查找,不支持通过关键字进行排序或者模糊匹配。因此,在需要排序或者模糊查询的情况下,哈希索引比较无效。

  3. 不支持范围查询哈希索引是用哈希函数将关键字转化为固定的位置索引,因此不支持范围查询。

  4. 内存占用较小:哈希索引中不需要存储关键字的排序值,只需要存储关键字哈希值及其对应的指针向量。因此,哈希索引的内存占用较小。

  5. 高并发时性能较差:当有大量并发查询时,因为哈希索引使用哈希函数将关键字映射到表中一个位置,不同数据可能被映射到同一个位置,从而导致哈希冲突,因此当前查询可能需要等待前一个查询完成,导致效率降低。

哈希检索通常只需要一次检索(不出现哈希碰撞)哈希索引的效率通常要比B+树索引的查询效率高

在MySQL中,目前只有Memory引擎支持hash索引。

总结:

        索引的数据结构形式多种多样,我们只有学好底层的数据机构才可以更好的理解索引的逻辑。其中以B+树为数据结构的索引最为重要,实际生活中我们默认索引就是通过B+树来实现的。因此我们要重点掌握好B+树的数据机构。

今天的内容到这里就结束了,感谢大家的阅读。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

【MySQL数据库 | 第十七篇】索引以及索引结构介绍文章来源地址https://www.toymoban.com/news/detail-486365.html

到了这里,关于【MySQL数据库 | 第十七篇】索引以及索引结构介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux篇】第十七篇——信号量

    前言 POSIX信号量 信号量的概念 信号量的工作原理 信号量函数 二元信号量模拟实现互斥功能 基于环形队列的生产消费模型 空间资源和数据资源 生产者和消费者申请和释放资源 必须遵守的两个规则 代码实现 信号量保护环形队列的原理 将可能被多个执行流同时访问的资源叫

    2024年02月06日
    浏览(37)
  • MySQL数据库:索引

            索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。         相当于是给数据库中的数据建立了一个目录,通过目录可以知道数据所在位置,然后到指定位置

    2023年04月17日
    浏览(61)
  • 【MySql】数据库索引

    可以简单理解为一本书的目录信息,是为了提升查找效率而建立的 1、在创建一个主键、唯一键、外键时候,数据库会自动地针对查找字段设置索引; 2、在创建表时侯,使用 index 进行普通索引的声明 3、修改表结构,给指定的字段添加索引 alter table 表名 add index 索引名

    2024年02月03日
    浏览(45)
  • 【MySQL数据库 | 第十五篇】事务

        目录    前言:  介绍事务:  控制事务:  事务四大特性:  并发事务问题:  事务隔离级别: 总结:   这章我们将进入到MySQL基础篇的最后一章:事务,希望大家可以坚持下去,跟着我一起走完MySQL的学习之旅。 MySQL是一种关系型数据库管理系统,支持事务管理。 事

    2024年02月08日
    浏览(43)
  • 【MySQL数据库 | 第十二篇】:约束

    在MySQL中, 约束是一种限制数据表中列值的规定 。保证数据库中的数据正确,有效性和完整性。MySQL中的约束有以下几种: 1. 主键约束(Primary Key Constraint) :主键是用于唯一标识表中每行记录的列。主键约束要求 每个主键列的值都是唯一的,且不能为NULL 。一个表只能有一

    2024年02月08日
    浏览(38)
  • MySQL数据库索引机制

    MySQL是一款有客户端和服务端的网络应用,mysql是它的客户端,mysqld是它的服务端。服务端本质就是一个进程,它存在于内存当中。而我们存储在MySQL中的数据是保存在磁盘上的,当我们对MySQL中数据进行增删查改操作时,不可能是直接在磁盘上进行操作,而是将对应的数据加

    2024年02月12日
    浏览(55)
  • MySQL数据库唯一索引

    创建索引是指在某个表的一列或多列上建立一个索引,以便提高对表的访问速度。创建索引有3种方式,分别是1.创建表的时候创建索引、2.在已经存在的表上创建索引和使用3.ALTER TABLE语句来创建索引。 本文福利, 莬 费领取Qt开发学习资料包、技术视频,内容包括(C++语言基

    2024年02月08日
    浏览(43)
  • 【MySQL数据库 | 第十六篇】存储引擎

    目录  前言:  MySQL体系结构图: 存储引擎简介: 1. InnoDB存储引擎: 2. MyISAM存储引擎: 3. MEMORY存储引擎: 4. NDB Cluster存储引擎: 5. ARCHIVE存储引擎: 存储引擎语法: ACID与行级锁:  总结: 经过前面15篇的学习,我们已经学完了SQL的基本语法内容,大致掌握了数据库的操作

    2024年02月08日
    浏览(35)
  • MySQL数据库索引的数据结构

    数据库索引的功能就是让查找更加的高效,所以索引的数据结构应该是能够加速查找的数据结构。 MySQL的innoDB存储引擎的索引的数据结构就是多叉搜索树中的b+树,这可以说是为索引量身定做的一个数据结构。 首先,索引可以通过主键,unique修饰创建,也可以直接使用sql语句

    2024年02月10日
    浏览(44)
  • 简单认识MySQL数据库索引

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ●索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。 ●使用索引后可以不用扫描全表来定位某行的

    2024年02月16日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包