【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+树查找索引的过程:
① 把根节点所有的索引从磁盘加载到内存中(如图的15、56、77),磁盘加载到内存就是一次磁盘 IO
② 在内存中比对(比对过程可用二分查找),发现在15-56之间,注意他俩之间白色框存储的是其指向节点在磁盘中的文件地址
③ 把指向节点所有索引再次加载到内存
④ 重复直到 当定位到目标索引元素30后,直接用其data中的物理地址去访问索引所在行的磁盘地址
高版本 Mysql 在启动时就将所有的非叶子节点即冗余节点加载到内存中
聚簇索引、非聚簇索引
聚簇索引是节点聚合数据,即在存储节点的位置直接存储数据
非聚簇索引是节点只存储地址,需要通过地址间接寻址来获取实际存储的数据
一张表只允许存在一种类型的索引(聚簇索引或非聚簇索引)
- 在 Innodb 引擎下主键索引是聚簇索引,表结构文件 FRM,索引与数据文件 IBD

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

聚集索引相比于非聚集索引查找效率一般更高,直接在当前文件即可查询到数据,不用再去数据文件中查询。
聚簇索引的插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则影响性能。
对于 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 缓存

| 大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
| 大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |
相关文章:
【MySQL】数据库索引详解 | 聚簇索引 | 最左匹配原则 | 索引的优缺点
创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 🔥c系列专栏:C/C零基础到精通 🔥 给大…...
HarmonyOS 自定义进度条 Stage模型
通过onTouch监听滑动,动态改变圆角 let radius 0Entry Component struct TestPage {State flip: boolean falseState progress:number 20build() {Row() {Column() {RelativeContainer(){Rect({ width: 100%, height: 40 }).radius(10).fill("#505050"…...
Flink双流(join)
一、介绍 Join大体分类只有两种:Window Join和Interval Join Window Join有可以根据Window的类型细分出3种:Tumbling(滚动) Window Join、Sliding(滑动) Window Join、Session(会话) Widnow Join。 🌸Window 类型的join都是利用window的机制…...
使用Nginx或者Fiddler快速代理调试
1 背景问题 在分析业务系统程序问题时,存在服务系统环境是其它部门或者其它小组搭建或运维的,并且现在微服务时代,服务多且复杂,在个人机器上搭建起如此环境,要么费事费力,要么不具备充足条件。 急需有一种方法或者工具可以快速辅助调试定位分析问题。本文下面介绍代理方…...
MySQL高级特性篇(3)-全文检索的实现与优化
MySQL数据库全文检索是指对数据库中的文本字段进行高效地搜索和匹配。在MySQL数据库中,可以使用全文检索来实现快速的文本搜索功能,并且可以通过一些优化手段提高全文检索的性能。 一、MySQL全文检索的基本概念 全文检索是一种将关键字搜索与自然语言处…...
MySQL加锁策略详解
我们主要从三个方面来讨论这个问题: 啥时候加?如何加?什么时候该加什么时候不该加? 1、啥时候加 1.1 显式锁 MySQL 的加锁可以分为显式加锁和隐式加锁,显式加锁我们比较好识别的,因为他往往直接体现在 S…...
会声会影2024新功能及剪辑视频步骤教程
会声会影2024的新功能主要包括: 全新的标题动态与特效:用户可以为文字标题指定进入、中场和退出的不同动态效果,比如闪现进入、中场弹跳和淡出退出等,让文字标题更具动感。此外,还新增了多个标题特效,包括…...
Rust Vs Go:从头构建一个web服务
Go 和 Rust 之间的许多比较都强调它们在语法和初始学习曲线上的差异。然而,最终的决定性因素是重要项目的易用性。 “Rust 与 Go”争论 Rust vs Go 是一个不断出现的话题,并且已经有很多关于它的文章。部分原因是开发人员正在寻找信息来帮助他们决定下…...
几个常见的C/C++语言冷知识
当涉及到C/C语言时,有一些冷知识可能并不为人所熟知,但却可以让你更深入地理解这门古老而强大的编程语言。以下是一些有趣的C/C语言冷知识。 1. 数组的下标可以是负数 在我们日常的C语言编程中,数组是一个非常常见的数据结构。我们习惯性地使…...
低代码开发:学校低成本数字化转型的新引擎
随着科技的飞速发展,数字化转型已经成为教育行业的一大趋势。然而,对于许多学校来说,高昂的数字化改造成本成为了一道难以逾越的门槛。本文将探讨如何通过低代码开发,以低成本实现学校数字化转型,为教育行业注入新活力…...
【es6】解决箭头函数所有的问题,箭头函数的 this 指针,使用 new 操作符
箭头函数是 es6 提出的this 指针指向 定义箭头函数的全局上下文或函数上下文,是固定的call\apply\bind无法改变箭头函数的this没有 arguments 对象,但是可以访问外部作用域中的 arguments 对象没有 prototype 属性不能用作 generator 函数,不…...
2-1SDN(软件定义网络)环境测试实验(无默认控制器)-静态流表
控制器是为了更好集中控制网络的行为,当然在实际中我们可以根据需要选择是否选择控制器,或是结合ovs交换机的特点进行针对性的转发行为设置(功能需要书写代码进行软件定义),转发功能需要手工添加流表才能实现 如&#…...
飞天使-k8s知识点22-kubernetes实操7-ingress
文章目录 ingress环境准备准备service和pod验证效果 https 代理效果 ingress 在 Kubernetes 中,Ingress 是一种 API 对象,它管理外部访问集群内部服务的规则。你可以将其视为一个入口,它可以将来自集群外部的 HTTP 和 HTTPS 路由到集群内部的…...
SwiftUI 集合视图(Grid)拖放交换 Cell 的极简实现
概览 自从 SwiftUI 横空出世那天起,小伙伴们都感受到了它惊人的简单与便捷。而在本课中,我们将会用一个小“栗子”更直观的让大家体验到它无与伦比简洁的描述性特质: 如上图所示,我们在 SwiftUI 中实现了 Grid 中拖放交换 Cell 的…...
MATLAB中gtext函数用法
目录 语法 说明 示例 使用鼠标将文本添加到图窗 指定字体大小和颜色 在创建后修改文本 gtext函数的功能是使用鼠标将文本添加到图窗。 语法 gtext(str) gtext(str,Name,Value) t gtext(___) 说明 gtext(str) 在使用鼠标选择的位置插入文本 str。当将鼠标指针悬停在图…...
迁移SVN和GIT的云端数据
在新服务器搭建GIT仓库 教程很多,大致的流程是: 1. 新建linux用户密码专用于git操作 2. 新建git库的存放文件夹并在此初始化git 3. 配置git库所在目录权限 *只需要有一个库和有一个用户,与在windows上建库是一样的。不需要搭建类似gitla…...
算法--动态规划(背包问题)
这里写目录标题 总览dp问题的优化01背包问题概述算法思想算法思想中的注意点例题代码 完全背包问题概述 多重背包问题概述 分组背包问题概述 总览 dp问题的优化 要清楚:dp问题的优化一般是对dp问题的代码或者计算方程做一个等效变形 有了这个前提,我们在…...
Word 文档中的图片另存为 .jpg 格式图片
Word 文档中的图片另存为 .jpg 格式图片 1. Office 按钮 -> 另存为2. 筛选过的网页 (*.htm;*.html)3. 查看生成文件夹References 1. Office 按钮 -> 另存为 2. 筛选过的网页 (*.htm;*.html) 3. 查看生成文件夹 References [1] Yongqiang Cheng, https://yongq…...
【C++练级之路】【Lv.8】【STL】list类的模拟实现
快乐的流畅:个人主页 个人专栏:《C语言》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、结点二、迭代器2.1 成员变量与默认成员函数2.2 operator*2.3 operator->2.4 operator2.5 operator- …...
【右一的电子笔记】全导航,持续更新...
文章目录 📚计算机基础🐇高程(c)🐇python基础🐇数据结构🐇数据库系统概念🐇计算机网络🐇计算机组成原理🐇操作系统 📚大数据🐇大数据管…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

