MySQL 索引解析:让查询速度飙升

1.前言

之前几篇文章,小编和大家分享了mysql innodb的内存结构,这次小编准备用两篇文章来和大家分享下mysql innodb的索引: mysql的基础知识 和 基于索引的sql优化 。

2. 什么是索引?

定义:索引是数据库中用于快速查找数据的机制,本质是某种数据结构。它存储着指向数据的指针,从而帮助数据库跳过不必要的行,直接定位到目标数据,减少扫描时间。

比如我们看<<三国演义>>刘备三顾茅庐这章,如果没有目录,我们就需要一篇一篇的翻书,要翻很久,因为不知道在书的哪一页;但是如果有目录,我们是不是先在目录里面找到这章的目录,这章的目录对应着正文的书页,我们一下就可以翻到对应的书页,找到对应的章节。目录就类似于mysql的索引。

3. 为什么需要索引?

  • 加速查询:索引可以显著减少数据库检索所需的时间。没有索引时,数据库会执行全表扫描(读取每一行),而索引让数据库只需要扫描部分数据。

  • 降低 I/O 负载:索引通过减少物理读取的次数,从而减少 I/O 操作。在大型数据集上尤其明显,特别是对于复杂查询或多表连接(JOIN)的场景。

  • 常见应用场景:索引在以下场景中最有用:

    • WHERE 子句中的条件过滤。

    • ORDER BY 语句进行排序时。

    • GROUP BY 语句进行分组时。

    • 多表 JOIN 操作时匹配外键或其他相关列。

4. 索引的类型

  • 主键索引:主键是表中唯一标识记录的字段,通常自动创建索引。InnoDB 存储引擎会将主键索引作为聚簇索引(Clustered Index),即数据的物理存储顺序和主键索引顺序一致。

  • 唯一索引:保证索引列中的所有值唯一性,类似于主键索引,但可以应用于非主键字段。

  • 普通索引:没有唯一性要求的索引,用于加速查询的非主键列。普通索引仅保证加速查找,没有其他约束。

  • 联合索引(复合索引):一个索引包含多个列,按照指定顺序进行索引。根据最左前缀原则,只要查询的条件从左开始匹配列的顺序,索引就可以生效。

5. 索引的结构

  • B-Tree 索引:MySQL 中最常见的索引结构是 B-Tree,特别是 InnoDB 存储引擎。B-Tree 索引通过一种平衡树结构,使得数据查找时间复杂度为 O(log n)。每个节点存储键值,并且有指向下层节点的指针。查询通过层次结构逐级缩小搜索范围,从而快速定位目标数据。

  • 哈希索引:哈希索引基于哈希函数,将键值映射为固定大小的哈希值。其特点是查询效率极高(O(1) 时间复杂度),但只适用于精确匹配的查询。不支持范围查询(例如 <> 操作),因此哈希索引不适合大多数通用场景。

这里强调一下:innodb只能创建B-Tree 索引,不支持哈希索引。即使创建的时候选择的是哈希,实际创建之后的结果也是B-Tree,有兴趣的同学可以试试,小编这里就不截图了。

下面,小编用六条数据模拟下索引的结构。首先看下表结构:

然后表里面的数据:

然后看下主键索引的结构,这里是小编根据索引的结构自己画的:

根据这个B+ 树索引结构图,小编简单的说下:

  • 绿色: 绿色框框表示页数,之前已经讲过,数据库的数据是以页的方式存储。

  • 红色: 红色框框表示是否是索引还是数据行,1:索引;0:数据。

  • B+树的叶子节点存放的是完整的数据,非叶子节点存放的是索引数据。

  • B+树的子节点可以有多个,这里是只用4条数据模拟,多了难得画。

  • 叶子节点的数据是有序的,根据主键id由小到大存储,并且行与行,页与页之间是用双向链表连接的。

二级索引

除了主键外,我们会根据查询的字段,也去建立相应的字段索引。小编这里就不画图了,二级索引的叶子节点放的是对应的主键索引值。

回表

指的是 MySQL 在通过二级索引查找到符合条件的记录后,还需要回到主键索引中去读取额外的列数据。因为索引只包含部分列的信息,如果查询中请求了索引中未包含的列,数据库就需要从主键索引中再次读取完整的行数据。

比如user表中,我给name添加索引,我需要查询name=小九这行数据的信息,因为二级索引是没有完整的数据,所以mysql需要去主键索引里面找到对应的完整数据返回。

覆盖索引

指的是当一个索引完全包含了查询所需的所有列时,MySQL 不需要再回表,而是直接从索引中就可以返回结果。这种情况就称为覆盖索引。

比如user表中,我给name添加索引,我需要查询name=小九这条数据的id,因为id在叶子节点已经有了,直接就返回了结果,不需要去主键索引再次查询。

覆盖索引的优势:

性能提升:避免了回表,降低了 I/O 和查询时间。减少表扫描:索引的存储比表的数据量小得多,索引扫描比全表扫描快。

6. 总结

  • 索引是提升查询性能的关键工具,选择合适的索引类型和合理优化可以极大提高数据库效率。

  • 理解索引的类型和底层原理能够帮助开发者在构建数据库时做出明智的决策。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

记录 idea 启动 tomcat 控制台输出乱码问题解决

文章目录 问题现象解决排查过程1. **检查 idea 编码设置**2. **检查 tomcat 配置**3.检查 idea 配置文件4.在 Help 菜单栏中&#xff0c;修改Custom VM Options完成后保存&#xff0c;并重启 idea 问题现象 运行 tomcat 后&#xff0c;控制台输出乱码 解决排查过程 1. 检查 id…

MySQL有哪些高可用方案?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL有哪些高可用方案?】面试题。希望对大家有帮助&#xff1b; MySQL有哪些高可用方案? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL 高可用方案旨在确保数据库系统的高可靠性、低宕机时间、以及在硬件故障…

基于STM32的火灾烟雾报警器设计开题报告

开题报告 题目&#xff1a;基于STM32的火灾烟雾报警器Proteus仿真设计 一、研究背景与意义 随着现代城市化进程的加快&#xff0c;火灾安全问题日益凸显&#xff0c;火灾的早期预警对于减少人员伤亡和财产损失至关重要。传统的火灾报警系统往往依赖于烟雾或温度的单一检测&a…

《机器学习》3.7-4.3end if 启发式 uci数据集klda方法——非线性可分的分类器

目录 uci数据集 klda方法——非线性可分的分类器 计算 步骤 1: 选择核函数 步骤 2: 计算核矩阵 步骤 4: 解广义特征值问题 と支持向量机&#xff08;svm&#xff09; 目标&#xff1a; 方法&#xff1a; 核技巧的应用&#xff1a; 区别&#xff1a; 使用 OvR MvM 将…

【蓝桥杯选拔赛真题93】Scratch青蛙过河 第十五届蓝桥杯scratch图形化编程 少儿编程创意编程选拔赛真题解析

目录 Scratch青蛙过河 一、题目要求 编程实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、python资料 Scratc…

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 多图推理

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 多图推理 flyfish 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_LoRA配置如何写 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_单图推理 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_原模型_单图推理 基于Q…

好玩的汇编编译器NASM:一款基于x86架构的汇编与反汇编软件

好玩的汇编编译器NASM This is the project webpage for the Netwide Assembler (NASM), an asssembler for the x86 CPU architecture portable to nearly every modern platform, and with code generation for many platforms old and new. Netwide Assembler&#xff08;…

Bootstrap-HTML(六)Bootstrap按钮

Bootstrap按钮与按钮组 前言一、Bootstrap按钮&#xff08;一&#xff09;、内置按钮样式&#xff08;二&#xff09;、按钮边框设置&#xff08;三&#xff09;、按钮尺寸调整&#xff08;四&#xff09;、块级按钮创建&#xff08;五&#xff09;、活动 / 禁用按钮设置 二、B…

储能技术方案综述

全球电量浪费现状 根据国际可再生能源机构&#xff08;IRENA&#xff09;和其他研究机构的数据&#xff0c;全球范围内光伏和风电的电量浪费主要表现为发电弃风弃光、输电损耗和储能不足等方面。 弃风弃光现象 弃风率&#xff1a;指风电场在有风时未能发出的电量占总发电量的比…

深入探索:createThread与cancelThread的用法及实例

在多线程编程领域,线程的创建与管理是核心技能之一。本文将详细介绍两个关键函数:createThread(用于创建新线程)和cancelThread(用于取消已存在的线程),并通过具体实例展示它们的用法。需要注意的是,不同的编程语言和线程库可能有不同的API设计,但基本概念是相通的。本…

Java基础学习:java常用启动命令

一、java -jar 1、系统属性传递 使用形式&#xff1a;java -DpathD:\jacoco -jar 获取方式&#xff1a;System.getProperties() 2、系统参数传递 使用形式&#xff1a;java -jar application.jar --jacocoPathD:\tomcat 获取方式&#xff1a;通过启动方法入口main的参数arg…

guava 整合springboot 自定义注解实现接口鉴权调用保护

文章目录 一、简要概述二、实现过程1. pom引入依赖2. 自定义注解3. 定义切面4. 定义权限检查逻辑 三、注解使用四、运行结果五、源码放送 一、简要概述 Guava Cache是一个全内存的本地缓存实现&#xff0c;它提供了线程安全的实现机制。我们借助expireAfterWrite过期时间设置和…

nginx 部署 ModSecurity3

一、查看本地nginx版本 nginx是yum安装的 # nginx -v nginx version: nginx/1.26.2 二、安装依赖工具 # yum install -y gcc-c flex bison yajl lmdb lua curl-devel curl GeoIP-devel zlib-devel pcre-devel pcre2-devel libxml2-devel ssdeep-devel libtool autoconf aut…

threejs——无人机概念切割效果

主要技术采用着色器的切割渲染,和之前写的风车可视化的文章不同,这次的切割效果是在着色器的基础上实现的,并新增了很多可调节的变量,兄弟们,走曲儿~ 线上演示地址,点击体验 源码下载地址,点击下载 正文 从图中大概可以看出以下信息,一个由线组成的无人机模型,一个由…

【LeetCode】每日一题 2024_12_13 K 次乘运算后的最终数组 I(暴力)

前言 每天和你一起刷 LeetCode 每日一题~ 小聊两句 1、今天是 12.13 南京大屠杀国家公祭日。铭记历史&#xff0c;勿忘国耻。 2、今天早上去看了 TGA 年度游戏颁奖&#xff0c;小机器人拿下了年度最佳游戏&#xff0c;所有人都震惊了&#xff0c;大伙纷纷问到&#xff0c;谁…

向达梦告警日志说声hello

为了调试和跟踪一些业务功能&#xff0c;通常会创建一个日志表&#xff0c;写入每个关键步骤的信息。也可以向达梦数据库的告警日志输出信息&#xff0c;然后通过查看告警日志即可。 在达梦的告警日志中输出一个信息可以这样 SQL> DBMS_SYSTEM.KSDWRT(2,hi dm);

MySQL 索引事务

目录 1. 索引是什么 2. 索引的相关操作 3. 索引的原理 4. 事务是什么 5. 事务的使用 6. 事务的原理 1. 索引是什么 索引是用来加快查询的机制&#xff0c;是针对某个表的指定列来设置的&#xff0c;查询条件如果就是使用这个带有索引的列来查询&#xff0c;那么查询速度…

基于django协同过滤的音乐推荐系统的设计与实现

一、摘要 随着现代音乐的快速发展&#xff0c;协同过滤的音乐推荐系统已成为人们业余生活的需求。该平台采用Python技术和django搭建系统框架&#xff0c;后台使用MySQL数据库进行信息管理&#xff1b;通过用户管理、音乐分类管理、音乐信息管理、歌曲数据管理、系统管理、我的…

代码随想录算法训练营第51期第14天 | 226. 翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

226. 翻转二叉树 226. 翻转二叉树https://leetcode.cn/problems/invert-binary-tree/1.昨天忘了声明&#xff0c;如果都用C的话&#xff0c;我大概率写不完&#xff0c;所以思路方面&#xff0c;我可能考虑用pyhon先写&#xff0c;后续会用文心一言转换成C 2.这里可以直接用层…

雨晨 24H2 IoT 企业版 ltsc 2024 Hotpatch 极简 26100.2605

文件: 雨晨 24H2 IoT 企业版 ltsc 2024 Hotpatch 极简 26100.2605 install.esd 大小: 1970652896 字节 修改时间: 2024年12月13日, 星期五, 18:06:39 MD5: 3DCB989B62B6656B2CB34B0D88EBEE45 SHA1: C6E890223892B7A3EDA59E4881C70214DD546DB7 CRC32: 13EDFA89 与往版&#xff…