数据库->索引

目录

一、索引是什么

二、索引的数据结构

1.HASH

2.二叉搜索树

3.N叉树(B树)

4.B+树

5.B+树与B树的区别

三、MYSQL的页

1.页文件头与页文件尾

2.页主体

3.页目录

4.数据页头

四、B+在MYSQL索引中的应用

1.应用

2.计算三层树⾼的B+树可以存放多少条记录

五、索引分类

1.主键索引

2.普通索引

3.唯一索引

4.全文索引

5.聚集索引

6.非聚集索引(回表查询)

7.索引覆盖

六、索引的使用

1.自动创建

2.手动创建

2.1主键索引

1.创建表时创建主键

​编辑​编辑

2.创建表时单独指定主键列

3.修改表中的列为主键索引

2.2唯一索引

1.创建表时创建唯⼀键

2.创建表时单独指定唯⼀列

3.修改表中的列为唯⼀索引

2.3普通索引

1.创建时机

2..创建表时指定索引列

3.修改表中的列为普通索引

4.单独创建索引并指定索引名

3.查看索引

1.以行的形式去显示

2.show index

3.简要信息:desc 表名

4.删除索引

1.主键索引

1.1语法

1.2示例

2.其它索引

2.1语法

2.2示例

5.创建索引的注意事项

七、怎么查看自己写的SQL有没有走索引

1.查询所有

2.使用主键查询

3.子查询中使用索引


一、索引是什么

MySQL的索引是⼀种数据结构,它可以帮助数据库⾼效地查询、更新数据表中的数据。索引通过
⼀定的规则排列数据表中的记录,使得对表的查询可以通过对索引的搜索来加快速度

二、索引的数据结构

1.HASH

时间复杂度:O(1)  最重要的数据结构,没有之一  但不支持范围查找

2.二叉搜索树

中序遍历是一个有序的序列 --> 支持范围查询

时间复杂度:可能会退化成一个单边树O(n)

I/O的次数:数据库系统需要进行的读取或写入磁盘的总次数

3.N叉树(B树)

每个节点都可以超过两个节点,可以解决树的高度从而提高I/O的性能

时间复杂度:O(logn)

4.B+树

时间复杂度:O(logn)

可以有效控制树高

5.B+树与B树的区别

1.叶子节点之间有一个相互连接的引用,可以通过一个叶子节点找到与它相邻的兄弟节点

MYSQL在组织叶子节点的时候用的是双向链表

2.非叶子节点的值都包含在叶子节点中

MYSQL非叶子节点只保存了对叶子节点的引用,没保存真实的数据,所有真实的数据全都在叶子节点中保存

3.对于B+树而言,在相同的树高的情况下,查找任意元素的时间复杂度都一样,性能均衡

三、MYSQL的页

⻚是内存与磁盘交互的最⼩单元,默认⼤⼩为16KB

页的结构:文件头、文件尾、页主体

1.页文件头与页文件尾

2.页主体

⻚主体部分是保存真实数据的主要区域,每当创建⼀个新⻚,都会⾃动分配两个⾏,⼀个是⻚内最
⼩⾏ Infimun ,另⼀个是⻚内最⼤⾏ Supremun ,这两个⾏并不存储任何真实信息,⽽是做为数据⾏链表的头和尾,第⼀个数据⾏有⼀个记录下⼀⾏的地址偏移量的区域 next_record 将⻚内所有数据⾏组成了⼀个单向链表,此时新⻚的结构如下所⽰:

当向⼀个新⻚插⼊数据时,将 Infimun 连接第⼀个数据⾏,最后⼀⾏真实数据⾏连接Supremun ,这样数据⾏就构建成了⼀个单向链表,更多的⾏数据插⼊后,会按照主键从⼩到⼤的顺序进⾏链接,如下图所⽰

3.页目录

4.数据页头

数据⻚头记录了当前⻚保存数据相关的信息,如下图所⽰

四、B+在MYSQL索引中的应用

1.应用

⾮叶⼦节点保存索引数据,叶⼦节点保存真实数据,如下图所⽰

索引页,保存的是主键的值和子节点得到引用   叶子节点保存零点数据    数据页,一行的具体数据

页与页之间建立关联关系,最终形成一个双向循环链表

数据行的排序是按从做到右,从小到大的顺序去组织的,插入一行数据的时候会被安排到合适的位置

例:以查找id为5的记录,完整的检索过程如下 

1. ⾸先判断B+树的根节点中的索引记录,此时 5 < 7 ,应访问左孩⼦节点,找到索引⻚2
2. 在索引⻚2中判断id的⼤⼩,找到与5相等的记录,命中,加载对应的数据⻚

以上的IO过程,加载索引⻚1 --> 加载索引⻚2 --> 加载数据⻚3

2.计算三层树⾼的B+树可以存放多少条记录

五、索引分类

1.主键索引

• 当在⼀个表上定义⼀个主键 PRIMARY KEY 时,InnoDB使⽤它作为聚集索引。
• 推荐为每个表定义⼀个主键。如果没有逻辑上唯⼀且⾮空的列或列集可以使⽤主键,则添加⼀个⾃增列。

如果为表定义了主键,则自动创建主键索引

如果没有为表定义主键索引,innodb会使用唯一列构建索引树  如果没有唯一列,则自动生成一个ROW_ID构建索引树

2.普通索引

• 最基本的索引类型,没有唯⼀性的限制。
• 可以为多列创建组合索引,称为复合索引或组全索引

为了提升查询效率,可以为查询频繁的列创建一个普通索引   

如果手动创建了索引,都会生成一个与之对应的索引树(B+)(会占用磁盘空间)

索引中包含多个列,列在索引中的排序按创建时指定的顺序排序,同时每个索引行都会包含主键值

3.唯一索引

• 当在⼀个表上定义⼀个唯⼀键 UNQUE 时,⾃动创建唯⼀索引。
• 与普通索引类似,但区别在于唯⼀索引的列不允许有重复值。

4.全文索引

• 基于⽂本列(CHAR、VARCHAR或TEXT列)上创建,以加快对这些列中包含的数据查询和DML操作
• ⽤于全⽂搜索,仅MyISAM和InnoDB引擎⽀持。

有专门的文档数据库,可以高效的处理文档搜索

5.聚集索引

• 与主键索引是同义词
• 如果没有为表定义 PRIMARY KEY,  InnoDB使⽤第⼀个 UNIQUE 和 NOT NULL 的列作为聚集索
引。
• 如果表中没有 PRIMARY KEY 或合适的 UNIQUE 索引,InnoDB会为新插⼊的⾏⽣成⼀个⾏号并
⽤6字节的 ROW_ID 字段记录, ROW_ID 单调递增,并使⽤ ROW_ID 做为索引。

6.非聚集索引(回表查询)

• 聚集索引以外的索引称为⾮聚集索引或⼆级索引
• ⼆级索引中的每条记录都包含该⾏的主键列,以及⼆级索引指定的列。
• InnoDB使⽤这个主键值来搜索聚集索引中的⾏,这个过程称为回表查询

通过普通索引的列为条件查到主键值,再用主键值去主键索引树中去查找学生的详细信息,涉及到两个索引树,这个过程叫回表查询

7.索引覆盖

• 当⼀个select语句使⽤了普通索引且查询列表中的列刚好是创建普通索引时的所有或部分列,这时就可以直接返回数据,⽽不⽤回表查询,这样的现象称为索引覆盖

查询的列包含在创建的索引的列中,就可以直接从普通索引中返回结果,这个现象叫索引覆盖

六、索引的使用

1.自动创建

• 当我们为⼀张表加主键约束(Primary key),外键约束(Foreign Key),唯⼀约束(Unique)时,
MySQL会为对应的的列⾃动创建⼀个索引 
• 如果表不指定任何约束时,MySQL会⾃动为每⼀列⽣成⼀个索引并⽤ ROW_ID 进⾏标识

2.手动创建

2.1主键索引
1.创建表时创建主键

2.创建表时单独指定主键列

3.修改表中的列为主键索引

2.2唯一索引
1.创建表时创建唯⼀键

2.创建表时单独指定唯⼀列

3.修改表中的列为唯⼀索引

2.3普通索引
1.创建时机

1.创建表的时候,明确知道某些列是频繁查询的列,就直接创建(当表中数据比较少时,全表扫描的效率可能比使用索引的效率还要高)

2.随着业务不断地发展,在版本迭代的过程中添加索引

2..创建表时指定索引列

一个复合索引,索引中包含两个列

3.修改表中的列为普通索引

4.单独创建索引并指定索引名

create index : 创建索引的关键字     idx_index3_sno : 为索引命名(idx_表名_索引包含的列名)

推荐以后使用这种方式创建索引:create index idx_index5_sno_classId on index5(sno, class_id);

3.查看索引

1.以行的形式去显示

2.show index

3.简要信息:desc 表名

4.删除索引

1.主键索引
1.1语法
alter table 表名 drop primary key;

删除主键时不指定索引名,因为表中只有一个主键        删除之前要把自增取消

如果存在自增列,则会报错

1.2示例

2.其它索引
2.1语法
alter table 表名 drop index 索引名;
2.2示例

5.创建索引的注意事项

• 索引应该创建在⾼频查询的列上
• 索引需要占⽤额外的存储空间
• 对表进⾏插⼊、更新和删除操作时,同时也会修索引,可能会影响性能
• 创建过多或不合理的索引会导致性能下降,需要谨慎选择和规划索引

七、怎么查看自己写的SQL有没有走索引

可以查看执行计划 explain select...

1.查询所有

2.使用主键查询

3.子查询中使用索引

为name建立索引

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

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

相关文章

mongodb 按条件进行备份和恢复

在宝塔面板环境下&#xff0c;可以在定时任务设置备份mongodb但是存在缺陷&#xff0c;mongodb如果存储日志&#xff0c;一定时间后会特别巨大&#xff0c;全量备份会导致服务器卡死并很快耗尽磁盘空间&#xff0c;按一定的条件对进行&#xff0c;按天备份数据是必须的。我们用…

从SRE视角透视DevOps的构建精髓

SRE 侧重系统稳定性&#xff0c;DevOps 强调开发运维协作。SRE 实践助力DevOps&#xff0c;提升系统稳定性与团队协作效率。 SRE 运用软件工程的原理&#xff0c;将系统管理员的手工任务自动化&#xff0c;负责运维由系统组件构成的服务&#xff0c;确保服务稳定运行。SRE职责涵…

【数据库】elasticsearch

1、架构 es会为每个索引创建一定数量的主分片和副本分片。 分片&#xff08;Shard&#xff09;&#xff1a; 将索引数据分割成多个部分&#xff0c;每个部分都是一个独立的索引。 主要目的是实现数据的分布式存储和并行处理&#xff0c;从而提高系统的扩展性和性能。 在创建索…

深度学习基础知识-编解码结构理论超详细讲解

编解码结构&#xff08;Encoder-Decoder&#xff09;是一种应用广泛且高效的神经网络架构&#xff0c;最早用于序列到序列&#xff08;Seq2Seq&#xff09;任务&#xff0c;如机器翻译、图像生成、文本生成等。随着深度学习的发展&#xff0c;编解码结构不断演变出多种模型变体…

spark-on-k8s 介绍

spark-on-k8s 介绍 摘要 最近一段时间都在做与spark相关的项目&#xff0c;主要是与最近今年比较火的隐私计算相结合&#xff0c;主要是在机密计算领域使用spark做大数据分析、SQL等业务&#xff0c;从中也了解到了一些spark的知识&#xff0c;现在做一个简单的总结&#xff…

探索PickleDB:Python中的轻量级数据存储利器

文章目录 探索PickleDB&#xff1a;Python中的轻量级数据存储利器1. 背景&#xff1a;为什么选择PickleDB&#xff1f;2. PickleDB是什么&#xff1f;3. 如何安装PickleDB&#xff1f;4. 简单的库函数使用方法创建和打开数据库设置数据获取数据删除数据保存数据库 5. 应用场景与…

【华硕天选5开机黑屏只有鼠标,调用资源管理器也无法黑屏状态的一种解决方式】

华硕天选5开机黑屏只有鼠标&#xff0c;调用资源管理器也无法黑屏状态的一种解决方式 1.问题描述2.解决方法3.重启如下图 1.问题描述 华硕天选5开机黑屏只有鼠标&#xff0c;调用资源管理器&#xff08;ctrlalt.&#xff09;也无法黑屏状态。 2.解决方法 ctrl shitf10 就能正…

【详细 工程向】基于Smart3D的五镜头相机三维重建

数据部分&#xff1a; 数据要求 &#xff08;1&#xff09;每条行带至少从 3 个不同的视角进行拍摄。 &#xff08;2&#xff09;相邻相片之间的重叠度通常要求大于三分之二。 &#xff08;3&#xff09;不同拍摄视角之间夹角应该少于 15 度。 &#xff08;4&#xff09;通…

使用 RabbitMQ 有什么好处?

大家好&#xff0c;我是锋哥。今天分享关于【使用 RabbitMQ 有什么好处&#xff1f;】面试题。希望对大家有帮助&#xff1b; 使用 RabbitMQ 有什么好处&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RabbitMQ 是一种流行的开源消息代理&#xff0c;广…

【自用】时序数据库、时序数据库,IOTDB官方文档笔记

什么叫时序数据&#xff1f; 万物互联的今天&#xff0c;物联网场景、工业场景等各类场景都在进行数字化转型&#xff0c;人们通过在各类设备上安装传感器对设备的各类状态进行采集。如电机采集电压、电流&#xff0c;风机的叶片转速、角速度、发电功率&#xff1b;车辆采集经…

线程池执行流程

线程池执行流程 1、如果当前在运行的线程数不超过核心线程数&#xff0c;那么则创建新的核心线程去执行任务 2、如果当前在运行的线程数超过了核心线程数&#xff0c;那么就将任务加入到队列中去 3、如果任务队列已经满了&#xff0c;那么就创建非核心线程去执行当前任务 4…

【google play】使用Java接入谷歌支付流程

【google play】使用Java接入谷歌支付流程 整体流程准备工作Java实现 整体流程 客户端向Java服务端发起支付&#xff0c;生成预订单&#xff0c;将生成的订单号返回给客户端&#xff1b;客户端向Google发起支付&#xff08;传入本地服务器生成的订单号&#xff09;&#xff1b…

实现GUI界面中的logo图片的编码与隐藏

实现GUI界面中的logo图片的编码与隐藏 一、问题描述二、解决办法 一、问题描述 利用PyQt5编写的GUI界面&#xff0c;有时候需要我们添加自定义的图片来作为UI界面的logo&#xff0c;在源码使用时&#xff0c;logo的形式一般不影响使用&#xff0c;但是当我们需要将软件进行打包…

2024最新的开源博客系统:vue3.x+SpringBoot 3.x 前后端分离

本文转载自&#xff1a;https://fangcaicoding.cn/article/54 大家好&#xff01;我是方才&#xff0c;目前是8人后端研发团队的负责人&#xff0c;拥有6年后端经验&3年团队管理经验&#xff0c;截止目前面试过近200位候选人&#xff0c;主导过单表上10亿、累计上100亿数据…

sqli-labs(第一关)

前言&#xff1a; 各位&#xff0c;我准备最近把靶场练一下&#xff0c;看看别人的payload&#xff0c;跟着别人学一下怎么实战。我用的靶场是sqli-labs。 正文&#xff1a; 第一关&#xff1a; &#xff08;1&#xff09;找注入点&#xff1a; 刚开始界面是这样的&#xf…

LabVIEW气体检测系统

随着工业化进程的加速&#xff0c;环境污染问题愈加严峻&#xff0c;尤其是有害气体的排放对人类生存环境构成了严重威胁。为了更好地监测这些有害气体&#xff0c;开发一个高效、准确且易于操作的气体检测系统显得尤为重要。LabVIEW软件开发的气体检测系统&#xff0c;采用激光…

盘点10款录音转文字工具,帮你开启高效记录。

如果你有课堂录音或者是一些网课内容像转成文字笔记&#xff1b;或者是想将会议录音转换成书面的文稿&#xff1b;又或者是想将访谈音频或者是商务谈判转换成文字稿件&#xff1b;那就千万要收藏这些录音转文字的工具&#xff0c;它们的功能专业&#xff0c;转换准确且效率很高…

IntelliJ IDEA 设置数据库连接全局共享

前言 在日常的软件开发工作中&#xff0c;我们经常会遇到需要在多个项目之间共享同一个数据库连接的情况。默认情况下&#xff0c;IntelliJ IDEA 中的数据库连接配置是针对每个项目单独存储的。这意味着如果你在一个项目中配置了一个数据库连接&#xff0c;那么在另一个项目中…

Memento 备忘录模式

备忘录模式 意图结构适用性实例Java Web开发中的简单示例Originator 类Memento 类Caretaker 类 文本编辑器示例1. Originator (发起人) - TextEditor2. Memento (备忘录) - TextMemento3. Caretaker (负责人) - History4. 使用示例输出 备忘录模式&#xff08;Memento Pattern&…

国际版JAVA同城打车源码同城服务线下结账系统源码适配PAD支持Android+IOS+H5

一、数据中心 总用户数今日接单数量今日新增今日收入本月新增本月收入本年新增本年收入 二、用户中心 全部用户普通用户师傅用户推广员用户 三、财务中心 提现管理收入统计提现统计充值统计充值记录保证金管理平台收入统计 四、首页装修 轮播图分享图语音播报配置 五…