MYSQL——索引概念索引结构

索引

索引是帮助数据库高效获取数据的排好序的数据结构

有无索引时,查询的区别

主要区别在于查询速度系统资源的消耗。

  1. 查询速度

    没有索引的情况下,数据库需要对表中的所有记录进行扫描,以找到符合查询条件的记录,这个过程可能会非常耗时,特别是对于大表来说。

    如果有索引,数据库可以通过索引快速定位到符合查询条件的记录,大大减少了查询时间。

  2. 系统资源消耗

    无索引时,由于需要扫描整个表,因此会占用大量的系统资源,如CPU、内存等。

    有索引时,由于只需扫描索引,所以系统资源的消耗相对较小

注意:索引并不是越多越好。过多的索引会增加数据库的空间开销,同时也可能导致查询性能下降
也会降低更新表的速度,如对表进行INSERT、UPDATE、DELETE时,效率降低

索引结构

常见的索引结构:

二叉树

二叉树索引结构是一种基于排序二叉树的索引方法。树中每个节点的值大于其左子树中任意节点的值,小于其右子树中任意节点的值。

优点

查找效率高,特别是在数据量较大时,查找性能的优势更为明显。

局限性

二叉树索引最理想的状态,即主键插入构成的排序二叉树为完全二叉树,即叶子节点都在最后一层,这样二叉树的查询效率最高。如下图所示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但如果主键是顺序插入的,则会出现一条单向链表,也就是最极端的情况。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(此时查询的情况就跟无索引时一样了,需要通过遍历整列数据来得到查询结果)

所以二叉树的局限性在于它的高度(层次)不可控,影响因素高。

二叉树的缺点

  • 顺序插入时,会形成一个链表,查询性能大大降低。

  • 大数据量情况下,层级较深,检索速度慢。

红黑树

红黑树是一种自平衡的二叉查找树,它通过一定的规则使得树保持大致平衡,从而提高了查找效率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二叉树改良,但还是存在大数据量情况下,层级较深,检索速度慢的问题。

B-Tree

B-Tree是一种自平衡的多路查找树。

(其中B是Balanced (平衡)的意思,节点最大的孩子数目m称为B-Tree的阶(order)。)

但是,由于每个节点同时存储了数据和索引,所以每个节点所能存储的数据较少,浪费了一定的存储空间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

特点

  • 在B-Tree中,非叶子节点和叶子节点都会存放数据。
  • 在B-Tree中,每个内部节点(非叶子节点)存储的key数量等于它的阶数减一,对应的指针数量等于它的阶数.
  • 一旦节点存储的key数量到达阶数,就会裂变,中间元素向上分裂。

B+Tree

B+Tree和B-Tree十分类似。

B+Tree的特点在于:

  • 所有的数据都会出现在叶子节点。
  • 叶子节点形成一个单向链表。
  • 非叶子节点仅仅起到索引数据作用,具体的数据都是在叶子节点存放的。

所以B+Tree更有优势

  • 更好的磁盘读写性能
  • 更好的范围查找性能

优化

在MySQL中,索引数据结构对经典的B+Tree进行了优化,这种优化主要是增加了指向相邻叶子节点的链表指针,形成了带有顺序指针的B+Tree。

提高区间访问的性能,当在查找某个范围内的数据时,可以直接通过这些顺序指针快速跳转到下一个叶子节点,而不必逐级向上查找。

Hash

Hash索引是一种基于哈希表实现的索引结构。其基本思想是,对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针

在哈希索引中,数据的存储和查找都是基于哈希函数进行的。哈希函数可以将任意长度的输入(也叫做“键”)通过散列算法,变换成固定长度的散列值(也叫做“哈希值”)。这个哈希值就是我们在哈希索引中用来定位数据的地址。

img当我们需要查找某一行的数据时,只需要根据这一行的主键值计算出相应的哈希值,然后在哈希表中查找这个哈希值所对应的指针,再通过这个指针就可以快速找到这一行的数据。因此,哈希索引的查找效率是非常高的,基本上可以达到O(1)的时间复杂度。

img

特点

  • Hash索引只能用于对等比较(=,in),不支持范围查询(between,>,< ,…)
  • 无法利用索引完成排序操作
  • 查询效率高,通常(不存在hash冲突的情况)只需要一次检索就可以了,效率通常要高于B+tree索引

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/783002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Doris实践——票务平台的实时数仓建设

目录 前言 一、引入 Doris原因 二、基于Doris搭建数据平台 2.1 构建实时数仓 2.2 Flink CDC全库同步 三、基于Doris进行OLAP报表开发 四、未来规划 原文大佬介绍的这篇票务平台的实时数仓建设有借鉴意义&#xff0c;现摘抄下来用作沉淀学习。如有侵权&#xff0c;请告知…

web前端面试题----->VUE

Vue的数据双向绑定是通过Vue的响应式系统实现的。具体原理&#xff1a; 1. Vue会在初始化时对数据对象进行遍历&#xff0c;使用Object.defineProperty方法将每个属性转化为getter、setter。这样在访问或修改数据时&#xff0c;Vue能够监听到数据的变化。 2. 当数据发生变化时…

Java学习31-Java 多线程Thread 线程的创建

多线程的概念&#xff1a; 用户想要一边听歌&#xff0c;一边QQ聊天&#xff0c;一边游戏。要求能并发执行。 program程序&#xff1a; 有特殊功能的一组代码process进程&#xff1a; 正在执行中的program&#xff0c;或者程序program的一次执行过程thread线程&#xff1a;程…

CSS实现元素边框渐变动画

前言&#xff1a; 边框流动动画是一种非常常见的效果&#xff0c;能够让网页看起来更加生动有趣。通过使用 CSS3&#xff0c;我们可以轻松地实现这种动画效果。本文将介绍如何使用 CSS3 实现边框流动效果&#xff0c;下面一起来看看吧。 示例图&#xff1a;边框是动画持续变化的…

前端简历:大学还没毕业,就写2年工作经验,上的啥大学呢?

我看过很多前端简历&#xff0c;不知道是不是被所谓简历专家和面试专家给拐带的&#xff0c;还没毕业就敢写2年工作经验&#xff0c;如果属实&#xff0c;大学上了个啥&#xff1f; 简历每天都能收到几十上百封&#xff0c;对于初级人才招聘&#xff0c;基本上看以下几点。 1、…

CIM搭建实现发送消息的效果

目录 背景过程1、下载代码2、进行配置3、直接启动项目4、打开管理界面5、启动web客户端实例项目6、发送消息 项目使用总结 背景 公司项目有许多需要发送即时消息的场景&#xff0c;之前一直采用的是传统的websocket连接&#xff0c;它会存在掉线严重&#xff0c;不可重连&…

深入理解数据结构(3):栈和队列详解

文章主题&#xff1a;顺序表和链表详解&#x1f331;所属专栏&#xff1a;深入理解数据结构&#x1f4d8;作者简介&#xff1a;更新有关深入理解数据结构知识的博主一枚&#xff0c;记录分享自己对数据结构的深入解读。&#x1f604;个人主页&#xff1a;[₽]的个人主页&#x…

瑞吉外卖实战学习--7、员工信息分页查询

员工信息分页查询 前言1、配置公共分页组件2、创建接口并查看接收的参数3、使用分页构造器并添加查询条件和排序条件4、测试结果 前言 1、配置公共分页组件 package com.example.ruiji_demo.config;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;…

sharemore少数派提示词或许需要工程,但提问一定需要智慧

Matrix 首页推荐 Matrix 是少数派的写作社区&#xff0c;我们主张分享真实的产品体验&#xff0c;有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章&#xff0c;展示来自用户的最真实的体验和观点。 文章代表作者个人观点&#xff0c;少数派仅对标题和排版略作…

代码随想录算法训练营第二十五天| 216.组合总和III,17.电话号码的字母组合

题目与题解 216.组合总和III 题目链接&#xff1a;216.组合总和III 代码随想录题解&#xff1a;216.组合总和III 视频讲解&#xff1a;和组合问题有啥区别&#xff1f;回溯算法如何剪枝&#xff1f;| LeetCode&#xff1a;216.组合总和III_哔哩哔哩_bilibili 解题思路&#xf…

数据结构和算法:图

图 图&#xff08;graph&#xff09;是一种非线性数据结构&#xff0c;由顶点&#xff08;vertex&#xff09;和边&#xff08;edge&#xff09;组成。可以将图 &#x1d43a; 抽象地表示为一组顶点 &#x1d449; 和一组边 &#x1d438; 的集合。 如果将顶点看作节点&#…

9.2-源码分析:Dubbo Remoting 层 Buffer 缓冲区

Buffer 是一种字节容器&#xff0c;在 Netty 等 NIO 框架中都有类似的设计&#xff0c;例如&#xff0c;Java NIO 中的ByteBuffer、Netty4 中的 ByteBuf。Dubbo 抽象出了 ChannelBuffer 接口对底层 NIO 框架中的 Buffer 设计进行统一&#xff0c;其子类如下图所示&#xff1a; …

Oracle数据库——子查询五

14.1子查询语法 子查询 (内查询) 在主查询之前一次执行完成。子查询的结果被主查询(外查询)使用 。范例一:谁的工资比 Abel 高? 第一:查询Abel的工资是多少。第二:比较大于这个工资的人数。 注意事项: 子查询要包含在括号内。将子查询放在比较条件的右侧。</

文件名目录名或卷标语法不正确:数据恢复策略与预防措施

一、文件名目录名或卷标语法不正确的现象 在日常使用电脑或移动设备时&#xff0c;我们经常会遇到“文件名目录名或卷标语法不正确”的错误提示。这种错误通常发生在尝试访问、修改或删除文件、目录或卷标时&#xff0c;系统会提示无法完成操作&#xff0c;因为文件名、目录名…

C++格式化输入和输出

格式化输入与输出 除了条件状态外&#xff0c;每个iostream对象还维护一个格式状态来控制IO如何格式化的细节。 格式状态控制格式化的某些方面&#xff0c;如整型值是几进制、浮点值的精度、一个输出元素的宽度等。 标准库定义了一组操纵符来修改流的格式状态。 一个操纵符…

电商系列之商详

> 插&#xff1a;AI时代&#xff0c;程序员或多或少要了解些人工智能&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家…

java解数独(力扣Leetcode37)

数独问题 力扣原题链接 问题描述 数独的解法需遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 数独部分空格内已填入了数字&#xff0c;空白格用.表示。 示例 示例&…

微服务监控:确保分布式系统的可观察性与稳定性

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 目录 一、前言二、微服务监控的重要性三、关键监控指标四、常用监控工具五、最佳实践六、结论 一、前言 在当前的软件开发领域&a…

const在指针中的作用以及*p在各种写法中分别代表什么含义

const在指针中起固定的作用&#xff0c;在不同的写法中其效果也有所区别&#xff0c;具体如下&#xff1a; 1、int* const p固定的是指针p指向的地址。 2、int const *p固定的是指针p指向地址中储存的内容。 例&#xff1a; 以上操作在编译器中执行不了&#xff0c;会报错。…

flutter生成二维码并截图保存到图库

引入库&#xff1a;flutter_screenutil、image_gallery_saver、qr_flutter弹窗布局 import dart:async; import dart:typed_data; import package/generated/l10n.dart; import package:jade/configs/PathConfig.dart; import package:jade/utils/ImageWaterMarkUtil.dart; im…