【MySQL之轨迹】MySQL索引与Explain性能分析

慢SQL优化实战:用EXPLAIN读懂执行计划,告别背八股 在数据库性能优化中,慢SQL是最常见的性能瓶颈之一。当一条查询耗时数秒甚至更长时,盲目加索引往往徒劳无功,关键在于读懂数据库的访问路径与代价估算。EXPLAIN作为MySQL和Oracle等数据库提供的执行计划分析工具,揭示了优化器如何选择索引、扫描行数以及是否产生排序或回表操作,是定位SQL性能问题的第一现场。通过理解type、key、rows、Extra等核心字段,开发者能判断是否走了索引、是否触发了filesort,并据此设计更合理的覆盖索引或调整查询逻辑。这项技能在实际工程中极具价值,尤其适用于订单 阅读详情


0. 什么是索引

索引(Index)是帮助MySQL高效获取数据的数据结构

查看表的索引:show index from <表名>

1. 索引的数据结构

B+树(B 树的优化版)

B树 与 B+树的比较
B 树
在这里插入图片描述
B+树
在这里插入图片描述
可以看到,B 树的每一个结点都要存储数据,这就导致了在同样的大小下(InnoDB 每页默认大小为 16 KB)分支点所能存储的数据变少,而B+树的分支点仅存储主键id和指针,能存放更多指针,也就使得叶子数变多,树的高度减少,IO次数随之减少,提高了效率


2. 索引分类

① 主键索引
设定为主键后,数据库会自动建立索引,InnoDB 为聚簇索引

② 唯一索引
与主键索引类似,只是主键索引的列值不能为空,而唯一索引的列值可以为空。
但由于唯一,故只能存在一个为空的

创建唯一索引
1) 建表时创建(这种方式无法指定索引名,默认索引名为字段名)
create table t_user(
	id int,
	name varchar(20),
	age int,
	unique(name)	// 为 name 创建唯一索引
);

2) 建表后创建(其中 name_index 为索引的名字,可以随意取名,但一般按照这种格式)
create unique index name_index on t_user(name)

② 单值索引(单列索引,普通索引)
为表中其他字段建立的索引为单值索引。
一个索引只包含单个列,一个表可以有多个单值索引

创建单值索引
1) 建表时创建
create table t_user(
	id int,
	name varchar(20),
	age int,
	key(name)	// 为 name 创建普通索引
);

2) 建表后创建
create index name_index on t_user(name);

作用场景
where name 和 where age 都可以用到该单值索引
但是 where name and age 无法使用该索引

④ 复合索引(联合索引、多列索引)
一个索引包含了多个列,可用于基于多个列的查询,如

创建复合索引
1) 建表时创建
create table t_user(
	id int,
	name varchar(20),
	age int,
	sex int,
	key(name, age, sex)	// 为 name, age, sex  创建联合索引
);

2) 建表后创建
create index name_age_sex_index on t_user(name, age, sex);

作用场景,遵循最左前缀原则,但 mysql 在查询过程中会动态调整查询字段的顺序以更好地利用索引
以下是在 where 后使用查询字段的顺序
基于 name, name age, name age sex 的查询,都能用上该索引
而基于 age, sex, age sex 的查询,都不能用上该索引
但基于 name sex age, sex name age 的查询。可以用上该索引,因字段顺序被动态调整了,符合最左前缀原则
删除索引
drop index <索引名> on <表名>

3. 覆盖索引

要查询的字段刚好与索引中的字段 部分相同
则 select 所需数据从索引中就可以直接得到,无需再去获取数据
这也就是不建议使用 select * 的原因


4. 聚簇索引与非聚簇索引(二级索引)

① 聚簇索引
数据和索引存储在一起,索引结构的叶子结点保存了行数据,而结点之包含索引

在 InnoDB 中,索引默认使用的是主键,如果没有主键则使用唯一键,没有唯一键则由 InnoDB 隐式生成一个主键充当索引

在 InnoDB 中,聚簇索引上创建的索引称为辅助索引,非聚簇索引都是辅助索引。辅助索引总需要二次查找(回表)。原因是辅助索引叶子结点上存储的是主键id,得到主键id后还需要进行一次聚簇索引获取到行数据

思考:为什么要记录主键id,而不记录数据地址直接找到呢?
答:在增删改时,数据的地址可能发生变化,这就导致了索引树上叶子结点的数据需要修改,而存储主键id则不会出现这种情况

② 非聚簇索引(二级索引)
数据和索引分开存储,索引结构的叶子结点指向了数据对应的位置。

MYISAM 使用的就是非聚簇索引
其主键索引和辅助键索引的结构完全一致,只是结点存储的是主键或者辅助键的区分
叶子结点存储的地址指向真实的表数据,因此索引树是独立的,辅助键索引无序依赖主键索引,故只需要一次查询(避免了回表,提升了查询效率)

③ 聚簇索引的优势
虽然使用辅助索引需要经过两次查找降低了效率,但由于索引和数据存储在一次,在读取时已经一起加载到了缓存区,下次再查找时,直接从缓存区取数据就可以了。而非聚簇索引存储的是数据的物理位置,每次取诗句都需要发生一次新的 IO 操作,效率不如聚簇索引的高
同时,非聚簇索引需要维护数据的物理位置,当发生增删操作时,数据的物理位置可能发生改变,这就需要额外维护数据的物理地址降低了效率,而聚簇索引的辅助索引存放的是主键id,没有这个问题

④ 使用聚簇索引的注意点
最好使用 int 类型的自增,由于 int 类型能进行比较方便B+树的形成,而且主键自增使得每次叶子结点都是往后面添加,而不会从中间添加导致树的结构要调整,提高效率


5. 索引失效

① 使用 LIKE 关键字: 如果 % 出现在第一个字符时,索引失效
② 使用多列索引: 不符合最左前缀原则则失效(如第一个字段不是复合索引的第一个索引的话)
③ 是同 OR 关键字: 如果前后有一个条件的列不是索引,则索引失效,必须两个列都使用了索引才可以


6. 使用 Explain 了解索引性能

Explain 执行计划包含的信息
在这里插入图片描述
① id: select 查询的序列号,表示执行 select 子句或操作表的顺序

  • id 相同时,执行顺序为由上到下
  • id 不同时,id 值越大优先级越高,越先被执行

② select_type: 查询的类型

  • SIMPLE,简单查询,不包含子查询或者 UNION
  • PRIMARY,有子查询的话,最外层标记为 PRIMARY
  • SUBQUERY,在 select 或 where 中包含的子查询
  • DERIVED,在 from 中包含的子查询
  • UNION,第二个 select 出现在 UNION 之后,标记为 UNION
  • UNION RESULT,从 UNION 获取到结果的 select

③ table: 查询的是哪张表

④ type: 上最优,下最劣,依次递减

  • system:表只有一行数据,是 const 的特例

  • const:表通过一次索引就能找到,常见于用 where 去比较主键或者唯一键的索引

  • eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见于主键或者唯一索引扫描

  • ref:非唯一性索引扫描,返回匹配某个单独值的所有行,常见与使用 where=? 时,有多个行符合这个条件,如:
    在这里插入图片描述

  • range:只检索给定范围的行,常见于在 where 钟使用了 between < > in 等查询

  • index:只遍历索引树,数据是从索引中读取的

  • all:全表扫描,数据是从磁盘中读取的,效率最低。只要没创建索引,通通是全表扫描

⑤ possible_keys: 系统推测可能会用到的索引,但不一定被用到

⑥ key: 实际上用到的索引,若使用了覆盖索引,则改索引只出现在 key 列表中

⑦ key_len: 索引中使用的字节数,长度越长,精确度越高但效率越低。所以再不损失精确度的情况下,长度越短越好(该长度是索引字段的最大可能长度,是计算出来的而并非实际是使用的长度)

⑧ ref: 显示索引的哪一列被使用了,可能是常数 const,也可能是被用于查找的索引列上的值 xx库.xx表.xx列

⑨ rows: 根据表统计信息和索引选用情况,大致估算出找到所需记录所需要读取的行数(当然是越小越好)

⑩ Extra: 不适合在其他列中显示,但十分重要的额外信息

  • Using filesort,系统对数据进行了二外的排序,而不是按照索引的排序进行的,不好!!
    常见于 复合索引+排序 中,如有复合索引 a b c,where a order by
    这时候 c 无法使该复合索引自带的排序,而需要自己排序依次
    但如果是 where a order by b, c
    那么复合最左前缀原则,可以利用到该复合索引,不会出现 Using filesort
    
  • Using temporary,使用了临时表保存中间结果,系统在对查询结果排序时使用了临时表。常见于排序 order by 于分组查询 group by 中。非常不好!!
  • Using index,表名响应的 select 操作中使用了覆盖索引直接拿到数据,没有去表的数据行,好!!
  • Using where,表明索引被用来执行索引键值的查找(使用了 where 过滤)
  • Using join buffer,使用了连接缓存
  • Impossible where,where 子句的值总是 false,没有任何作用

倘若迷茫于星河,多看几眼就好啦~(IceClean)

SQL调优实战:从索引策略到查询优化的全链路突破 在数据库性能优化的战场上,SQL调优始终是开发者手中的“核武器”。当业务系统面临百万级数据查询卡顿时,当慢查询日志堆积如山时,掌握系统化的SQL调优方法论,就如同掌握了打开性能之门的钥匙。本文将通过真实生产案例,深度拆解索引策略设计、查询优化技巧、Explain实战分析三大核心模块,带你实现从“SQL新手”到“调优专家”的跨越式成长。 阅读详情

相关推荐

SQL优化实战:从索引策略到查询性能跃升的深度解析

本文将通过真实案例拆解,从索引策略设计、查询优化方法论到Explain执行计划深度解析,系统性呈现SQL优化的完整路径。无论是刚入门的数据库工程师,还是需要突破性能瓶颈的资深开发者,都能在这里找到可落地的解决方案。

Start_mswin的博客 405

轨迹数据库的索引建立

轨迹数据库的索引建立 首先把所有的数据分成每10分钟一个文件,大约一个文件在100-200MB之间。 然后按照id顺序对每一个数据进行排序,形成时间-id索引的文件。 然后按照基站号对每10分钟的数据进行索引的建立。存储包含time,基站号,连接的人的索引数据库文件,方便查询。 这种方法如果数据量1天在30+GB的数据,需要对每10天进行一个time的索引建

破折号上面有个叹号的博客 972

别再混淆了!一张图看懂SAP特殊采购类30/40/70/80的区别与选型指南

本文深度解析SAP特殊采购类30/40/70/80的核心逻辑与业务影响,通过对比框架和真实案例帮助用户掌握其适用边界。重点介绍委外加工(类型30)、工厂间转移(类型40/70)及计划与执行分离(类型80)的配置要点与常见问题,提供选型决策树和实施检查清单,助力企业优化供应链管理。

weixin_26938645的博客 453

MySQL之查询

SQL简介 全称:结构化查询语言 SQL的组成 》DML ---->数据操作语言 》DDL ---->数据定义语言 》DQL ---->数据查询语言 》DCL ---->数据控制语言 DQL语句: 语法: select <列名|表达式|函数|常量> from <表名> [where <查询条件表达式>] [order by <排...

轨道如同轨迹的博客 289

ncl泰勒图(均方根误差、标准差、相关系数)

ncl泰勒图(均方根误差、标准差、相关系数)

weixin_61281699的博客 8006

手把手教你实现阿克曼ROS小车的运动控制

本文详细介绍了如何从零开始实现阿克曼ROS小车的运动控制。内容涵盖硬件搭建、STM32底层PID速度与舵机控制、ROS层阿克曼运动学模型解析,以及上下位机通信协议设计。通过手把手的代码示例和调试步骤,帮助机器人爱好者与开发者掌握将高级速度指令转化为小车具体动作的全流程,实现流畅的阿克曼转向控制。

weixin_29193259的博客 199

mysql存储运动轨迹_看MySQL的发展轨迹

[原文:http://mingxinzhicheng.blog.51cto.com/15/8935]MySQL从开发人员手中的“玩具”变为如今的“世界上最流行的开源数据库”,其中的过程伴随着产品版本升级, 以及一些新功能(特别是企业数据库功能)的增加。现在,随着MySQL 5.0被完美地开发出来,已经很少有人将MySQL称为“玩具数据库”了。MySQL的丰富功能满足了许多用户的需求,Oracle最...

weixin_35068573的博客 523

探索数据库领域 SQL 的 JSON 数据处理技巧

在当今数字化时代,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,被广泛应用于各种领域,如 Web 应用、移动应用、大数据处理等。数据库作为数据存储和管理的核心,需要具备处理 JSON 数据的能力。本文章的目的在于深入探索 SQL 语言在数据库中处理 JSON 数据的技巧,涵盖从基础的 JSON 数据查询到复杂的 JSON 数据操作,帮助读者全面了解和掌握 SQL 处理 JSON 数据的方法。

2502_91592937的博客 924

MySQL存储SDPose-Wholebody分析结果的最佳实践

本文介绍了如何在星图GPU平台上自动化部署SDPose-Wholebody镜像,实现高效的人体姿态分析。该方案通过优化MySQL数据库设计来存储和处理133个身体关键点数据,典型应用于健身动作分析、舞蹈教学等需要精确姿态评估的场景,显著提升数据分析效率。

weixin_35414484的博客 85

2024 年 9 月青少年软编等考 C 语言三级真题解析

2024 年 9 月青少年软编等考 C 语言三级真题解析。

发布少儿编程考级的真题和优秀竞赛题解析,以及一些讲义。 1739

抓包工具:Fiddler下载、安装、使用 教程

文章目录抓包工具:Fiddler下载、安装、使用 教程一、Fiddler 下载二、Fiddler 安装三、Fiddler 使用3、Statistics 请求的性能数据分析4、Inspectors 查看数据内容5、AutoResponder 允许拦截指定规则的请求6、Composer 自定义请求发送服务器7、Filters 请求过滤规则8、Timeline 请求响应时间9、Fiddler 设置解密HTTPS的网络数据10、Fiddler 内置命令与断点 抓包工具:Fiddler下载、安装、使用 教程 Fidd

Sumarua的博客 17万+

在MySQL中当有多个索引时 你知道MySQL是如何选择索引的吗 ???

MySQL 中一张表可以支持多个索引,在 SQL 语句也并不主动指定使用的索引,具体使用哪个索引是由 MySQL 自己来选择的。

代码小疯子 7825

【Python】秋招机考 —— 2025/8/27 华为 AI 方向

2025 华为 AI 秋招机考题目包含15道单选题、5道多选题和2道机器学习编程题,涵盖核心算法与数学知识。单选题考察了Softmax激活、Transformer位置编码、Jacobi迭代、大模型幻觉现象、特征向量、K-means聚类、矩阵秩、实对称矩阵性质、SVD分解、概率论等知识点。多选题涉及高斯-赛德尔迭代和朴素贝叶斯分类器。

一杯水果茶!足矣~ 840

SQL查询优化实战:从Explain分析到索引策略的深度解析

你是否遇到过这样的场景:一个看似简单的SQL查询在生产环境执行时却耗时数秒,甚至导致数据库连接池耗尽?当业务量从日均千次跃升至百万级时,那些曾经高效的查询语句突然成为系统瓶颈。本文将通过真实案例解析,带你掌握SQL查询优化的核心方法论,从Explain执行计划解读到索引策略设计,系统性提升数据库查询性能。

Start_mswin的博客 648

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【PHP开发900个实用技巧】186.数据库查询优化: Explain计划、索引的魔法!

摘要: 本文深入剖析数据库查询优化的两大核心技术——Explain执行计划与索引优化。通过真实案例演示,揭示无索引查询导致性能骤降的痛点,提供组合索引、最左前缀原则等解决方案,可使查询速度提升千倍。详解Explain执行计划的关键指标解读技巧,指出全表扫描等危险信号。针对索引失效的常见陷阱(如函数操作、模糊查询、OR条件),给出SQL重构方案。最后通过百万级数据表的优化实战,展示从诊断到索引手术的完整流程,实现查询耗时从1.8秒到0.015秒的蜕变。掌握这些核心技能,可有效解决90%的数据库性能瓶颈,显著提

1010

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

MySQL 8.0 覆盖索引实战:3种失效场景分析与5个优化案例

本文深入探讨MySQL 8.0覆盖索引的实战应用,分析3种典型失效场景(如SELECT *全列读取、函数操作索引绕过、最左前缀原则违反),并通过5个真实业务优化案例展示如何有效利用覆盖索引提升查询性能。特别强调避免回表操作和合理设计联合索引的重要性,帮助开发者充分发挥覆盖索引的I/O效率和MRR优化优势。

clt3617的博客 477

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

MySQL索引介绍

MySQL的索引是一种特殊的数据结构,它可以快速定位到需要查找的数据,提高查询效率。在这篇文章中,我们将介绍MySQL索引的类别、管理和使用方法,以及索引实现的原理。

CharlesKai 的博客 569

数据库工程:Explain对比与慢查询优化实战‌

用Explain一看才发现,这条SQL的执行计划里type是ALL全表扫描,引擎要遍历260万行数据之后还要做笛卡尔积关联,相当于把整个表从头到尾翻了几十遍。小李花了不到20分钟调整了两个索引,改了一行SQL的关联顺序,重新执行之后对账程序只用了1.2秒就跑完了,整个系统的负载瞬间从100%降到了8%。很多一线开发人员每天都在和慢查询打交道,却从来没有真正看懂过Explain的执行计划,调优全靠瞎蒙,要么乱加一堆索引拖垮写入性能,要么直接申请升级硬件,花了几十万的成本却解决不了根本问题。90%的线上慢故障,

Start_mswin的博客 405

Java:96-MySQL高级

- 查看错误日志文件路径-- 慢查询日志文件路径-- bin log 日志文件 需要在 my.cnf 中配置log-bin=/var/log/mysql-bin/bin.log #最好只加上mysql-bin(代表开启)#否则可能需要很多配置(使得启动不了),我们只需要打开即可server-id=2 -- 记得唯一(主从之间唯一)-- 如果不加或者有相同的,那么同步的操作执行不了,比如如果不加,那么执行STOP SLAVE;就会报错-- 如果相同,那么对应的连接为NO(I/O线程那里)

qq_59609098的博客 785

MySQL高级(原理、sql优化及锁)

1.MySQL架构组成 1.2 MySQL逻辑架构 学习 MySQL 就好比盖房子,如果想把房子盖的特别高,地基一定要稳,基础一定要牢固。学习 MySQL 数据库前要先了解它的体系结构,这是学好 MySQL 数据库的前提。 1.2.1 MySQL架构体系介绍 MySQL 由连接池、SQL 接口、解析器、优化器、缓存、存储引擎等组成,可以分为四层,即连接层、 服务层、引擎层和文件系统层。 MySQL 的基础架构图 1. 连接层 最上面是一些客户端和连接服务, 不是MySQL特...

qq_45441466的博客 377

菜鸟的mysql高级进阶以及mysql数据库优化

菜鸟的mysql进阶说明一、mysql的存储引擎二、事务的ACID原则三、数据库设计的三大范式 说明 一直想学习一下mysql进阶的相关知识,刚好趁着前段时间redis学完,可以学习一下mysql的进阶,简单了解了一下进阶的相关知识,还挺多的,感觉之前的mysql学的好像只是简单入门而已。本文会持续更新,不断地扩充 本文仅为记录学习轨迹,如有侵权,联系删除 一、mysql的存储引擎 引擎 MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水

最强菜鸟 5431

Mysql索引优化实战:从 320ms 到 130ms 的慢 SQL 改造

执行计划分析核心:重点关注 type(扫描方式)、key(索引是否生效)、rows(扫描行数)、Extra(临时表 / 排序 / 索引下推),这 4 个字段能快速定位瓶颈;复合索引设计原则:「过滤性优先→JOIN 字段→排序字段→查询字段」,遵循最左前缀匹配,避免范围条件后置;索引失效高频场景:函数操作、隐式转换、范围条件后的字段复用、模糊查询(% 开头)、OR 条件未全命中索引,需针对性规避;优化落地逻辑。

Java架构师之路的博客 424

【Mysql】索引优化实战:从 320ms 到 130ms 的慢 SQL 改造

执行计划分析核心:重点关注 type(扫描方式)、key(索引是否生效)、rows(扫描行数)、Extra(临时表 / 排序 / 索引下推),这 4 个字段能快速定位瓶颈;复合索引设计原则:「过滤性优先→JOIN 字段→排序字段→查询字段」,遵循最左前缀匹配,避免范围条件后置;索引失效高频场景:函数操作、隐式转换、范围条件后的字段复用、模糊查询(% 开头)、OR 条件未全命中索引,需针对性规避;优化落地逻辑。

stone_tmp的博客 383

Mysql架构揭秘:索引底层原理

本文深入解析了MySQL索引的核心原理与实现机制。文章通过图书馆查找书籍的类比,生动阐述了索引对查询性能的影响。重点剖析了索引数据结构从二叉查找树到B+树的演进过程,详细对比了B树与B+树的区别,解释了MySQL选择B+树作为默认索引结构的原因(更低的树高度、高效的磁盘I/O和范围查询)。同时指出索引的代价(存储开销和写入性能影响),并给出实践建议:应针对高频查询列建立索引,避免滥用,合理设计联合索引,定期分析执行计划。文章强调理解索引底层原理对数据库优化决策的重要性。

2403_87729201的博客 494
上一篇: HTTP 学习小结
下一篇: 【MySQL之轨迹】MySQL索引优化实战(1)单表索引优化过程
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒冰小澈IceClean

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值