9efbcbc3d25747719da38c01b3fa9b4f.gif

                                                      作者主页:     作者主页

                                                      本篇博客专栏:Linux

                                                      创作时间 :2025年7月11日

9efbcbc3d25747719da38c01b3fa9b4f.gif

Mysql索引

索引介绍

索引是什么
  • 根据官方对索引的介绍,索引是帮助MySQL高效的获取数据的数据结构,在我看来,索引就相当于一本书的目录项,能加快查找数据的速度
  • 当然,索引本身也是一种资源,索引也要存储在MySQL中,但是索引一般不会存储在内存中,因为索引占据的内存还是比较大的,一般的索引都是存储在磁盘中的文件中
  • 我们通常所说的索引,包括聚集索引、覆盖索引、组合索引、前缀索引、唯一索引等,没有特别说明,默认都是使用B+树结构组织(多路搜索树,并不一定是二叉的)的索引。

索引的优势和劣势

优势:

  1. 索引可以提高数据检索的效率,可以快速找到我们想要找到的资源,降低数据库IO的成本,类似于书的目录
  2. 通过索引对数据进行排序,可以降低数据排序的成本,降低CPU的消耗
  • 被索引的列会自动进行排序,包括【单列索引】和【组合索引】,只是组合索引的排序要复杂一些。
  • 如果按照索引列的顺序进行排序,对应order by语句来说,效率就会提高很多。

劣势:

  • 索引会占据磁盘空间

  • 索引虽然会提高查询效率,但是会降低更新表的效率。比如每次对表进行增删改操作,MySQL不仅要保存数据,还有保存或者更新对应的索引文件。

索引类型

主键索引

索引列中的值必须是唯一的,不允许有空值。

普通索引

MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值。

唯一索引

索引列中的值必须是唯一的,但是允许为空值。

全文索引

只能在文本类型CHAR,VARCHAR,TEXT类型字段上创建全文索引。字段长度比较大时,如果创建普通索引,在进行like模糊查询时效率比较低,这时可以创建全文索引。 MyISAM和InnoDB中都可以使用全文索引。

空间索引

MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型。MySQL在空间索引这方面遵循OpenGIS几何数据模型规则。

前缀索引

在文本类型如CHAR,VARCHAR,TEXT类列上创建索引时,可以指定索引列的长度,但是数值类型不能指定。

索引的数据结构

Hash表

我们使用Hash表存储表数据Key可以存储索引列,Value可以存储行记录或者行磁盘地址。Hash表在等值查询时效率很高,时间复杂度为O(1);但是不支持范围快速查找,范围查找时还是只能通过扫描全表方式。

显然这种并不适合作为经常需要查找和范围查找的数据库索引使用。

二叉搜索树

二叉树,我想大家都会在心里有个图。

这个特点就是为了保证每次查找都可以这折半而减少IO次数,但是二叉树就很考验第一个根节点的取值,因为很容易在这个特点下出现我们并发想发生的情况“树不分叉了”,这就很难受很不稳定。

平衡二叉树

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

B树:改造二叉树

MySQL的数据是存储在磁盘文件中的,查询处理数据时,需要先把磁盘中的数据加载到内存中,磁盘IO 操作非常耗时,所以我们优化的重点就是尽量减少磁盘 IO 操作。访问二叉树的每个节点就会发生一次IO,如果想要减少磁盘IO操作,就需要尽量降低树的高度。那如何降低树的高度呢?

假如key为bigint=8字节,每个节点有两个指针,每个指针为4个字节,一个节点占用的空间16个字节(8+4*2=16)。

因为在MySQL的InnoDB存储引擎一次IO会读取的一页(默认一页16K)的数据量,而二叉树一次IO有效数据量只有16字节,空间利用率极低。为了最大化利用一次IO空间,一个简单的想法是在每个节点存储多个元素,在每个节点尽可能多的存储数据。每个节点可以存储1000个索引(16k/16=1000),这样就将二叉树改造成了多叉树,通过增加树的叉树,将树从高瘦变为矮胖。构建1百万条数据,树的高度只需要2层就可以(1000*1000=1百万),也就是说只需要2次磁盘IO就可以查询到数据。磁盘IO次数变少了,查询数据的效率也就提高了。

这种数据结构我们称为B树,B树是一种多叉平衡查找树,如下图主要特点:

B树的节点中存储着多个元素,每个内节点有多个分叉。

节点中的元素包含键值和数据,节点中的键值从大到小排列。也就是说,在所有的节点都储存数据。

父节点当中的元素不会出现在子节点中。

所有的叶子结点都位于同一层,叶节点具有相同的深度,叶节点之间没有指针连接。

B+树:改造B树

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

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

Mysql的索引实现

介绍完了索引数据结构,那肯定是要带入到Mysql里面看看真实的使用场景的,所以这里分析一下一种实现方式:InnoDB索引

InnoDB索引
主键索引(聚簇索引)

每个InnoDB表都有一个聚簇索引 ,聚簇索引使用B+树构建,叶子节点存储的数据是整行记录。一般情况下,聚簇索引等同于主键索引,当一个表没有创建主键索引时,InnoDB会自动创建一个ROWID字段来构建聚簇索引。InnoDB创建索引的具体规则如下:

  • 在表上定义主键PRIMARY KEY,InnoDB将主键索引用作聚簇索引。
  • 如果表没有定义主键,InnoDB会选择第一个不为NULL的唯一索引列用作聚簇索引。
  • 如果以上两个都没有,InnoDB 会使用一个6 字节长整型的隐式字段 ROWID字段构建聚簇索引。该ROWID字段会在插入新行时自动递增。

除聚簇索引之外的所有索引都称为辅助索引。在中InnoDB,辅助索引中的叶子节点存储的数据是该行的主键值都。 在检索时,InnoDB使用此主键值在聚簇索引中搜索行记录。

这里以user_innodb为例,user_innodb的id列为主键,age列为普通索引。

CREATE TABLE `user_innodb`
(`id`       int(11) NOT NULL AUTO_INCREMENT,`username` varchar(20) DEFAULT NULL,`age`      int(11)     DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,KEY `idx_age` (`age`) USING BTREE
) ENGINE = InnoDB;

总结:

避免回表

在InnoDB的存储引擎中,使用辅助索引查询的时候,因为辅助索引叶子节点保存的数据不是当前记录的数据而是当前记录的主键索引,索引如果需要获取当前记录完整数据就必然需要根据主键值从主键索引继续查询。这个过程我们成位回表。想想回表必然是会消耗性能影响性能。那如何避免呢?

使用索引覆盖,举个例子:现有User表(id(PK),name(key),sex,address,hobby…)

如果在一个场景下,select id,name,sex from user where name ='zhangsan';这个语句在业务上频繁使用到,而user表的其他字段使用频率远低于它,在这种情况下,如果我们在建立 name 字段的索引的时候,不是使用单一索引,而是使用联合索引(name,sex)这样的话再执行这个查询语句是不是根据辅助索引查询到的结果就可以获取当前语句的完整数据。这样就可以有效地避免了回表再获取sex的数据。

最后:

十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:

1.一个冷知识:
屏蔽力是一个人最顶级的能力,任何消耗你的人和事,多看一眼都是你的不对。

2.你不用变得很外向,内向挺好的,但需要你发言的时候,一定要勇敢。
正所谓:君子可内敛不可懦弱,面不公可起而论之。

3.成年人的世界,只筛选,不教育。

4.自律不是6点起床,7点准时学习,而是不管别人怎么说怎么看,你也会坚持去做,绝不打乱自己的节奏,是一种自我的恒心。

5.你开始炫耀自己,往往都是灾难的开始,就像老子在《道德经》里写到:光而不耀,静水流深。

最后如果觉得我写的还不错,请不要忘记点赞✌,收藏✌,加关注✌哦(。・ω・。)

愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚菜鸟逐渐成为大佬。加油,为自己点赞!

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

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

相关文章

页面html,当鼠标点击图标,移开图标,颜色方块消失

html页面代码&#xff1a;<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>颜色选择器</title><style>body {font-family: "Microsoft YaHei", sans-serif;padding: 20px;}.c…

netdxf—— CAD c#二次开发之(netDxf 处理 DXF 文件)

1.创建新项目打开 VS2022&#xff0c;选择 "创建新项目"搜索 "控制台应用"&#xff0c;选择 ".NET 6.0 (C#)" 模板&#xff0c;点击 "下一步"项目名称&#xff1a;"DxfProcessor"&#xff0c;位置&#xff1a;自选&#xff…

如何将一个本地的jar包安装到 Maven 仓库中

我们需要执行以下步骤&#xff1a; 首先&#xff0c;打开命令提示符&#xff08;CMD&#xff09;或 PowerShell&#xff0c;执行以下命令&#xff1a; mvn install:install-file ^ -Dfile"你的jar包路径" ^ -DgroupId"组织ID" ^ -DartifactId"项目ID&…

AI赋能的企业音频智能中枢:重构会议价值提升决策效率的数字化转型实践

在当今快节奏的商业环境中&#xff0c;企业管理者每天都要处理海量信息&#xff0c;其中音频内容占据了重要位置。你是否经常遇到这样的困扰&#xff1a;重要会议结束后&#xff0c;录音文件静静躺在设备里&#xff0c;迟迟无法变成可用的会议纪要跨部门协作时&#xff0c;收到…

医学+AI!湖北中医药大学信息工程学院与和鲸科技签约101数智领航计划

为积极推动人工智能与中医药信息化深度融合&#xff0c;着力培育既精通中医药理论又掌握人工智能技术的复合型人才&#xff0c;6 月 27 日&#xff0c;湖北中医药大学信息工程学院与上海和今信息科技有限公司&#xff08;以下简称 “和鲸科技”&#xff09;召开校企合作座谈会&…

全面掌控 Claude Code:命令 + 参数 + 快捷键一文全整理(建议收藏)

近日&#xff0c;随着Cursor套餐定价的风波&#xff0c;Claude Code 无疑成为了最近颇受欢迎的代码助手&#xff0c;不仅支持多种编程语言&#xff0c;还比Cursor更能理解复杂的上下文逻辑&#xff0c;极受广大开发者的青睐。 不过&#xff0c;与其他AI编程助手不同的是&#x…

深度学习-正则化

摘要 本文系统阐述了深度学习中的正则化技术体系&#xff0c;围绕防止过拟合这一核心目标展开。首先通过偏差-方差框架解析过拟合/欠拟合本质&#xff0c;并使用对比表明确区分特征&#xff1b;其次深入分析了L1/L2正则化的数学原理&#xff08;2mλ​∥w∥2与mλ​∥w∥1​&a…

STM32之风扇模块(开关控制+PWM调速)

目录 一、系统概述 二、5V直流风扇模块简介 2.1 基本概述 2.2 关键特性 2.3 接口定义 2.4 典型驱动电路 2.4.1 继电器驱动方案&#xff08;开关控制&#xff09; 2.4.2 三极管驱动方案&#xff08;调速控制&#xff09; 2.5 常见问题解决 三、继电器模块控制风…

AGX Xavier 搭建360环视教程【二、环境配置】

AGX Xavier 场景下的 【OpenCV FFmpeg CUDA GStreamer】 重装 & 编译的2025年稳定方案✅ 1️⃣ 先卸载老版本AGX 自带很多预装包&#xff0c;原则&#xff1a;卸载干净&#xff0c;避免旧库和新编译冲突。&#x1f539; 卸载 OpenCVdpkg -l | grep opencv sudo apt-get …

Cesium实战:交互式多边形绘制与编辑功能完全指南(最终修复版)

&#x1f4cb; 文章目录 引言功能概述环境准备核心实现步骤 地图初始化多边形绘制顶点编辑功能颜色与透明度自定义面积计算与显示 常见问题解决方案 多边形颜色显示异常面积标签不可见控制台alpha类型错误地图交互无法恢复 完整代码总结与扩展 引言 Cesium作为一款强大的3D地…

SQL判断先判断条件1是否符合,条件1不符合再判断条件2

伪代码假设存在条件1和条件2SELECT * FROM table1 WHERE 条件1 AND 条件2方法1&#xff1a;先判断条件1是否符合,条件1不符合再判断条件2是否满足&#xff1a;SELECT * FROM table1 WHERE (条件1) OR (NOT 条件1 AND 条件2);方法 2: 使用 IF 或数据库特有函数&#xff08;…

游戏的程序员会不会偷偷改自己账号的数据?

看到这个问题&#xff0c;我忍不住笑了。 作为一个在程序员这条路上摸爬滚打了快10年的老司机&#xff0c;虽然我主要专精嵌入式开发&#xff0c;但我也接触过不少游戏开发的朋友&#xff0c;对游戏行业的内部运作有一定了解。这个问题可以说是每个游戏玩家都曾经想过的&#x…

uniapp小程序tabbar跳转拦截与弹窗控制

一、第一步1、App.vue中定义globalData用于全局存储状态globalData:{needShowReleaseConfirm: false, // 标记是否需要显示发布页面确认弹窗allowReleaseJump: false ,// 标记是否允许跳转到发布页面},2、在App.vue中的onLaunch写入监听事件onLaunch: function() {// 添加switc…

华为网路设备学习-26(BGP协议 一)

一、AS&#xff08;自治系统&#xff09;AS&#xff08;自治系统&#xff09;的大小通常指其分配的唯一编号&#xff0c;范围分为两种&#xff1a;‌2字节AS号‌&#xff1a;取值范围1至65535&#xff08;其中64512-65535为私有AS号&#xff09; ‌‌4字节AS号‌&#xff1a;取…

大模型开发框架LangChain之函数调用

1.前言 之前一直使用 dify开发 agent&#xff0c;虽然功能很全面、效果也稳定&#xff0c;但是也存在流程固化、不灵活&#xff0c;以及 dify本身太重&#xff08;内部包含10个容器&#xff09;等问题。 故最近研究了大名顶顶的 langchain&#xff0c;先从函数调用开始&#xf…

pycharm中自动补全方法返回变量

使用IDEA开发java中&#xff0c;可以使用altenter 快捷键快速补全方法放回的变量使用pycharm也想实现此效果&#xff0c;如下图操作方法&#xff1a;pycharm中默认的补全方法返回变量的快捷键是&#xff1a;CtrlAltv 可以直接使用默认快捷键&#xff0c;也可以在settings->k…

Set 二分 -> 剑指算法竞赛

C【STL】集合set 标准库提供 set 关联容器分为&#xff1a; 按关键字有序保存元素&#xff1a;set&#xff08;关键字即值&#xff0c;即只保存关键字的容器&#xff09;、multiset&#xff08;关键字可重复出现的 set&#xff09;&#xff1b; 无序集合&#xff1a;unordered…

php的原生类

前言&#xff1a;累麻了&#xff01; 反射类 反射类 ReflectionClass&#xff1a;ReflectionClass 类报告了一个类的有关信息。正如其名用于映射反射一个类的类&#xff01; new ReflectionClass(MyClass) 会创建一个 ReflectionClass 实例&#xff0c;代表 MyClass 这个类。 …

PC网站和uniapp安卓APP、H5接入支付宝支付

首先我们需要完成支付宝账号注册&#xff0c;支持的账号类型&#xff1a;支付宝企业账号、支付宝个人账号、个体工商户。 到支付宝商家平台 产品中心开通APP支付、手机网站支付、电脑网站支付的产品权限。 一、电脑PC网站接入 电脑PC网站支付是指商户在电脑网页展示商品或服务&…

MCU芯片内部的ECC安全机制

MCU&#xff08;微控制器单元&#xff09;芯片内部的 ECC&#xff08;错误检测与纠正&#xff09;安全机制 是一种至关重要的硬件级可靠性技术&#xff0c;主要用于保护关键存储单元&#xff08;如 SRAM、Flash、Cache&#xff09;中的数据完整性&#xff0c;防止因外部干扰或硬…