【MySQL】数据库索引详解 | 聚簇索引 | 最左匹配原则 | 索引的优缺点

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述


目录

  • 索引概述
    • 索引的使用
  • 为什么不使用 AVL、 红黑树作为索引?
  • 为什么不使用哈希作为索引?
  • B 树
  • B+树
  • 聚簇索引、非聚簇索引
  • 最左匹配原则
  • MySQL 索引的优缺点
    • 索引的优化
    • 索引失效
  • 慢 SQL 优化

索引概述

什么是索引?可以用于优化查询

是一种已经排好序的数据结构(映射结构),根据 key 找到 value

如果不使用索引,mysql 查询就会从第一个开始逐个去查询(全表查询)
每次查询都会产生磁盘的 I/O 交互

为什么要使用索引?
就是为了缩短查询的时间。就像书本的目录一样。
数据量和数据结构有很大的关系。

mysql索引使用什么?
有使用B+树的索引,有使用hash表的 引擎决定了索引的类型

MySQL 常见引擎与索引类型:

  • MyISAM、InnoDB:B+ 树
  • Memory/heap:Hash 表

存储引擎形容数据库表!


索引的使用

创建索引

create index 索引名 on 表名(列名);

删除索引

drop index 索引名 on 表名;

使用 explian关键字查看是否使用索引进行检索:type = RES时代表使用索引检索,还可关注 key、row、extra等字段,查看影响查询性能的主要指标。


为什么不使用 AVL、 红黑树作为索引?

红黑树的本质仍是二叉树,当数据量比较大时,红黑树的层数比较高,每次读取节点都是在做磁盘 IO

并且每个节点只能存储一个数据,但是在索引的数据结构中,一个节点需要存两个值,一个是key 用来存节点的值,一个是value 存索引所在行的磁盘地址,查到后就能获取到其value内的值即地址


为什么不使用哈希作为索引?

哈希表不支持排序操作,哈希表不能进行范围查询,如果发生哈希冲突效率变低


B 树

B 树相比于二叉树,每个节点横向上能够存储更多的索引元素,在树的高度相同的情况下,B 树能够存储更多的数据。

B 树的每个节点都存储索引 key 和数据地址 value,导致层数变高。


B+树

  • B+树 将所有的索引都存放在叶子节点上
  • B+树的节点上索引顺序从左到右依次递增
  • B+树只有叶子节点存储索引 key 和数据地址 value,非叶子节点存储冗余索引(冗余索引的值为主键) 注意所有在冗余索引中出现的主键值都会在叶子节点中再现。设置冗余索引目的:为了使树高尽可能小,所以一层要尽可能多的放索引,按照B树这种结构,一个节点16KB,data元素会占用空间。如果不存储data只存储索引就可以存储更多索引,树可以分更多叉

对比红黑树: B+树的一个节点可以存放多个元素,比红黑树更低,磁盘 IO 次数更少。

对比 B 树: B 树不利于范围查询,B+树可以通过双向指针进行范围查找,只需要遍历叶子节点即可完成数据遍历

B+树查找索引的过程:
image.png
① 把根节点所有的索引从磁盘加载到内存中(如图的15、56、77),磁盘加载到内存就是一次磁盘 IO
② 在内存中比对(比对过程可用二分查找),发现在15-56之间,注意他俩之间白色框存储的是其指向节点在磁盘中的文件地址
③ 把指向节点所有索引再次加载到内存
④ 重复直到 当定位到目标索引元素30后,直接用其data中的物理地址去访问索引所在行的磁盘地址
高版本 Mysql 在启动时就将所有的非叶子节点即冗余节点加载到内存中


聚簇索引、非聚簇索引

聚簇索引是节点聚合数据,即在存储节点的位置直接存储数据

非聚簇索引是节点只存储地址,需要通过地址间接寻址来获取实际存储的数据

一张表只允许存在一种类型的索引(聚簇索引或非聚簇索引)

  • 在 Innodb 引擎下主键索引是聚簇索引,表结构文件 FRM,索引与数据文件 IBD

image.png

  • 在 MyISAM 引擎下主键索引是非聚簇索引,表结构文件 FRM,索引文件 MYI(index),数据文件 MYD(data)

image.png
聚集索引相比于非聚集索引查找效率一般更高,直接在当前文件即可查询到数据,不用再去数据文件中查询。

聚簇索引的插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则影响性能。


对于 Innodb 表,一般主键定义为自增 整型,不可更新,二级索引访问需要进行两次索引查找,第一次找到主键值,第二次根据主键值找到行数据(回表),因此多使用主键查询

如果没有定义主键,那么会使用第一非空的唯一索引(NOT NULL and UNIQUE INDEX)作为聚簇索引
如果既没有主键也没有合适的非空索引,那么InnoDB会自动生成维护一个包含了ROW_ID值的列作为聚簇索引

最左匹配原则

联合索引:将多个字段(列)组合成为一个索引。

在使用联合索引时,需要遵循最左匹配原则,即按照最左优先的方式进行索引查询。

最左匹配原则要求查询的列必须从索引中最左的列开始,并且不能跳过中间列,否则索引失效。

联合索引底层为排好序的 B+树,如果没有给出第一字段,就无法快速找到该数据应该处在的节点,因为优先以第一字段排序,只看第二字段并不是从左到右排好序的,需要扫描所以节点

MySQL 索引的优缺点

优点:

  • 1.方便查询,极大地缩短查找的时间

缺点:

  • 1.创建索引。那么维护索引就需要消耗时间,数据量越多,维护成本越高
  • 2.索引占用空间较大,每个节点都是 16Kb 的页大小,会影响表的最大存储量。
  • 3.对表中的数据进行增加和删除修改。索引要动态维护,会降低数据维护速度

索引的优化

  • 1.对于需要经常更新的字段,避免为他建立过多的索引
  • 2.数据量小的表不用创建索引,不一定能比全表查询效率高
  • 3.字段中存在重复数据例如性别不需要创建索引
  • 4.主键索引最好是自增,方式插入新数据时对原数据的大量操作
  • 5.尽量保证将索引设置为唯一,无需大量查找

索引失效

在如下情况可能会导致索引失效:

  • 违背最左匹配原则
  • 索引列中使用函数进行计算
  • 查询条件中出现了类型转换
  • 索引列和非索引列掺杂使用
  • like 模糊查询%在最左或两边
  • 联表查询时两个表的字符集不同

慢 SQL 优化

  • 1.优先使用索引
  • 2.是否索引失效
  • 3.将数据量较大的表进行垂直或水平拆分
  • 4.加 redis 缓存

在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

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

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

相关文章

mysql 2-22

变量 查看系统变量 修改 用户变量 赋值 定义处理程序 流程控制 IF CASE LOOP语句 WHILE循环 REPEAT leave ITERATE 游标 使用步骤 全局系统变量持久化 触发器 查看触发器 优点 MYSQL8的新特性 移除的旧特性 窗口函数 公用表表达式 JDBC 存储引擎 MYISAM存储引擎 InnoDB存储引擎…

【Redis】理论进阶篇------浅谈Redis的缓存穿透和雪崩原理

一、缓存穿透 1、概念 缓存穿透&#xff08;查不到数据&#xff09;&#xff0c;是指当用户想要查询数据的时候&#xff0c;会先去Redis中取命中&#xff0c;如果Redis中没有该数据&#xff0c;那么就会向数据库中去查找数据。如果数据库中也没有&#xff0c;则该次查询结果失…

Linux之信号

首先我们来了解一下信号的概念! 我们可以以上红框中的4个特点。 进程分为前台和后台进程,前台进程只有一个,后台进程可以有多个!(并且后台进程不能用ctrl+c中止,只能用kill -9去杀掉) jobs可以看作业标识号! (ctrl+z可以暂停进程,不能暂停前台进程,如果暂停就会被…

Eclipse中Working Sets是用来做什么的?

当Eclipse中创建了太多的project&#xff0c;太多了&#xff0c;看的眼花缭乱&#xff0c;不好管理,也不想更换工作空间&#xff0c;Eclipse中 Java Working Set 工作集&#xff0c;可以将这些project分组&#xff0c;就像文件夹分类存放文件一样。 多说一句&#xff0c;感觉E…

C++ Primer 笔记(总结,摘要,概括)——第2章 变量和基本类型

目录 2.1 基本内置变量 2.1.1 算术类型 2.1.2 类型转换 2.1.3 字面值常量 2.2 变量 2.2.1 变量定义 2.2.2 变量声明和定义的关系 2.2.3 标识符 2.2.4 名字的作用域 2.3 复合类型 2.3.1 引用 2.3.2 指针 2.3.3 理解复合类型的声明 2.4 const限定符 2.4.1 const的引用 2.4.2…

【时事篇-05-03】20240222 金额145-150元填充27笔货币基金的具体数目测算( itertools)

作品展示 背景需求&#xff1a; 通过 itertools计算2525元存17笔145-150元金额的最适合方案 【时事篇-05-02】20240221 2525元存17只货币基金的具体数目测算&#xff08; itertools&#xff09;-CSDN博客文章浏览阅读823次&#xff0c;点赞32次&#xff0c;收藏13次。【时事篇…

陈世元:被保送中科院,两次被裁,人生不能老是按部就班的走下去,需要冒险,尝试一下新的东西

《程客有话说》是我们最新推出的一个访谈栏目&#xff0c;邀请了一些国内外有趣的程序员来分享他们的经验、观点与成长故事&#xff0c;我们尝试建立一个程序员交流与学习的平台&#xff0c;也欢迎大家推荐朋友或自己来参加我们的节目&#xff0c;一起加油。 本期我们邀请的程…

MyBatisPlus常用注解

目录 一、TableName 二、TableId 三、TableField 四、TableLogic 一、TableName 在使用MyBatis-Plus实现基本的CRUD时&#xff0c;我们并没有指定要操作的表&#xff0c;只是在Mapper接口继承BaseMapper时&#xff0c;设置了泛型User&#xff0c;而操作的表为user表 由此得出…

AD9226 65M采样 模数转换

用 vivado 写的 AD9220_ReadTEST module AD9220_ReadTEST( input clk, input rstn,output clk_driver, //模块时钟管脚 input [12:0]IO_data, //模块数据管脚output [11:0]ADC_Data,//12位ADC数据 output ADC_OTR //信号过压标志位 );wire areset, pll260m_lockedPIN; wire…

BigTime赛前季:2.027亿美金$BIGTIME玩家空投,塑造Web3游戏新时代

公开游戏策略和统计数据&#xff0c;证明游戏的未来在于真正以玩家为中心。 Big Time 工作室宣布&#xff0c;其旗舰作品 Big Time 的 pre-alpha 版本季前赛预开发阶段取得成功&#xff0c;这是一款混合了动作游戏与 MMORPG 的免费游戏。这是独一无二的类型融合&#xff0c;它结…

项目解决方案:校园云视频平台方案(视频接入、汇聚、联网、分享)

目 录 一、项目需求 二、系统设计方案 三、平台功能 四、案例展示 本方案分四个部分&#xff1a;项目需求、系统设计方案、平台基础功能、案例展示&#xff0c;如下&#xff1a; 一、项目需求 二、系统设计方案 通过AS-V1000视频资源综合管理平台实现监控视频的接入、…

JavaWeb——003Axios Vue组件库(Element)

目录 一、Ajax 1、同步与异步​编辑 2、原生Ajax&#xff08;繁琐&#xff09;​编辑 2.1、写一个简易的Ajax 3、Axios&#xff08;推荐使用&#xff09;​编辑 3.1、Axios入门 3.2、Axios请求方式别名 3.3、案例&#xff1a;基于Vue及Axios完成数据的动态加载展示​编…