MySQL 二级索引详解

史上最全的Mysql索引教程 索引是数据库中用来提高数据检索效率的数据结构。它类似于书籍的目录,可以帮助用户快速找到所需的数据,而不必扫描整个数据集。在数据库系统中,索引可以显著提高查询性能。所谓的存储引擎,说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。MSQL存储引擎有 MyISAM、InnoDB、Memory,其中 InnoDB 是在 MySQL 5.5 之后成为默认的存储引擎。以下是简化版的mysql的结构图,其中,索引和数据是存储在存储引擎中的。 阅读详情

在 MySQL(默认 InnoDB 存储引擎)中,二级索引(Secondary Index) 是除主键索引(聚簇索引)之外的所有索引。它是关系型数据库性能优化的核心基础设施之一。下面从定义、作用、字段设计、特点四个维度进行系统化拆解。


一、什么是二级索引?(底层结构)

InnoDB 采用 B+ Tree 组织索引,分为两类:

索引类型叶子节点存储内容数量限制
聚簇索引(主键索引)完整的行数据(所有列)每表仅 1 个
二级索引(非聚簇索引)索引列的值 + 对应行的主键值每表可建多个

📌 关键结论:二级索引不存完整行数据,只存“索引键 + 主键”。查询非索引列时,必须通过主键再去聚簇索引中找完整数据,这个过程称为 回表(Bookmark Lookup)。


二、核心作用(为什么需要它?)

作用场景说明性能收益
🔍 加速非主键查询WHERE status = ?、WHERE email = ? 等条件走索引快速定位避免全表扫描,复杂度从 O(N) 降至 O(logN)
📊 优化排序/分组ORDER BY create_time DESC、GROUP BY category_id 利用索引有序性避免 filesort 和临时表,CPU/内存开销骤降
🔗 加速 JOIN 关联关联字段建二级索引,Nested-Loop Join 效率提升 10~100 倍减少驱动表与被驱动表的匹配扫描量
️ 唯一性约束UNIQUE INDEX 保证业务唯一性(如订单号、手机号)数据库层强校验,避免并发脏数据
覆盖索引优化查询字段全部落在二级索引中(含主键),无需回表性能接近内存读取,深度分页/高频查询首选

三、设计原则:应该包含哪些字段?(实战指南)

二级索引不是“建得越多越好”,而是“建得越准越好”。遵循以下设计公式:

✅ 1. 基于查询模式反推(Query-Driven)

SQL 模式推荐索引设计
WHERE a = ? AND b = ?(a, b) 联合索引
WHERE a = ? ORDER BY b DESC(a, b) 联合索引(WHERE 列在前,ORDER BY 列在后)
WHERE a > ? AND b = ?(b, a)(等值列放左边,范围列放右边)
SELECT id, name, status FROM t WHERE type = ?(type, status, name)(覆盖索引)

✅ 2. 区分度(Selectivity)优先

-- 区分度公式:COUNT(DISTINCT col) / COUNT(*)
-- 越接近 1 越好,< 0.1 不建议单独建索引
字段类型区分度建索引建议
用户 ID、订单号、手机号高(≈1)✅ 强烈建议
状态码(0/1/2)、性别、布尔值低(<0.1)❌ 单独建无效,需联合其他字段
创建时间、更新时间中✅ 适合范围查询/排序,常放联合索引末尾

✅ 3. 严格遵循最左前缀原则

联合索引 (A, B, C) 可高效支持:

  • WHERE A = ?
  • WHERE A = ? AND B = ?
  • WHERE A = ? AND B = ? AND C = ?
  • WHERE A = ? ORDER BY B
    失效场景:WHERE B = ?、WHERE C = ?、WHERE A > ? AND B = ?(A 是范围,B 无法用索引)

✅ 4. 覆盖索引优先(避免回表)

如果查询频繁且字段固定,将 SELECT 的所有字段(除主键外)都放入二级索引,可彻底消除回表:

-- 原始查询
SELECT user_id, nickname, avatar FROM users WHERE status = 1 AND level > 5;

-- 推荐索引
CREATE INDEX idx_status_level_user_nickname_avatar ON users(status, level, user_id, nickname, avatar);

⚠️ 注意:索引总长度受 innodb_page_size 限制(默认 16KB),字段过多需权衡。


四、核心特点(对比聚簇索引)

维度二级索引聚簇索引(主键)
叶子节点内容索引列值 + 主键值完整行数据
体积大小小(仅存部分字段+主键)大(存全量数据)
查询完整行需回表(多一次 B+ 树查找)直接命中
数量限制可建多个(通常 ≤ 5~8 个)仅 1 个
写入成本高(每次 INSERT/UPDATE/DELETE 需同步维护所有二级索引)低(仅维护自身)
有序性按索引列排序按主键排序
适用场景频繁 WHERE/ORDER BY/JOIN/覆盖查询主键查询、范围扫描、数据物理组织

五、开发注意事项与避坑指南

陷阱后果正确做法
盲目建单列索引索引膨胀、写入变慢、优化器选错索引优先联合索引,用 EXPLAIN 验证执行计划
❌ 在低区分度字段建索引优化器放弃索引,走全表扫描计算区分度,<10% 考虑联合或放弃
❌ 索引顺序写反最左前缀失效,范围查询退化全表扫描等值条件列放左,范围/排序列放右
❌ 频繁 UPDATE 索引列索引页分裂、碎片化、性能断崖索引列尽量不可变(如状态可建,金额/时间慎建)
❌ 忽略写入性能索引越多,INSERT/DELETE 越慢(写放大)单表二级索引 ≤ 5 个,定期 OPTIMIZE TABLE
❌ 用 KEYS * 或全表扫描锁表、CPU 飙升、缓存污染生产禁用 KEYS,用 SCAN 或业务侧维护 Key 索引

✅ 总结:二级索引设计心法

“索引是拿空间换时间,拿写入换读取。建索引不是技术炫技,而是对业务查询模式的精准建模。”

  1. 先有查询,后有索引:不要凭空设计,基于 EXPLAIN 和慢查询日志反推。
  2. 能覆盖就不回表:高频查询优先凑覆盖索引,性能提升最明显。
  3. 联合索引守左序:等值 → 范围 → 排序/分组,顺序错则索引废。
  4. 区分度定生死:低区分度字段单独建索引 = 无效劳动。
  5. 监控与治理:定期分析 information_schema.statistics,清理无用索引,控制单表索引数 ≤ 8。

如果你提供具体的表结构、高频 SQL 或业务场景,我可以为你输出针对性的索引设计方案与 EXPLAIN 执行计划解读。

解读MySQL 索引基础 我们完全可以将索引可以看作是书本的目录,通过书本的目录查找对应的章节就会快一些,索引底层数据结构有b树、b+树、红黑树、哈希表、甚至是链表等,对于MySQL而言,无论Innodb还是MyIsam最左匹配原则算是MySQL的一个重点了,它会基于联合索引最左的字段进行排序,例如我们用字段a、b、c创建联合索引,他就会先通过a进行排序,如果a一样比较b,b再一样比较c这样,通过这样的比较机制生成一个有序的索引结构。 阅读详情

相关推荐

MySQL-索引的分类(聚簇索引、二级索引、联合索引)

在InnoDB中索引分为好几种类型,下面我们一起来看一种常见的索引类型吧。

张姐姐聊编程 2115

MySQL的索引详细介绍(全网最详细!!!)

MySQL的索引详细介绍(全网最详细!!!)

qq_55846232的博客 1万+

envi5.3处理高分二号影像数据详细过程记录

全文根据此篇文章进行数据处理: tm影像辐射定标_高分二号影像数据预处理及裁剪过程 其他参考: 学习笔记---遥感影像辐射定标与大气校正 利用ENVI自带全球DEM数据计算区域平均高程 高分二号数据处理流程(有高分二号的数据信息) GF2有多光谱和全色两个数据,MSS是多光谱的,PAN是全色的,多光谱的分辨率低,全色的高,需要把这两个数据融合,融合之前需要做定标等处理,获取经纬度。 一、多光谱影像处理 1. 辐射定标 以这个为例: 其他路径\2022.4.2...

ligous的博客 5万+

MySQL索引详解----看这一篇就够了

索引是数据库中用于加速数据检索的一种数据结构。它类似于书籍的目录,通过索引可以快速定位到数据的位置,而不需要扫描整个表。最左匹配原则是指在联合索引中,查询条件必须从索引的最左端开始,按照索引列的顺序依次匹配。如果查询条件没有从最左端开始,或者中间有列未匹配,索引将无法完全生效或部分失效。索引是MySQL中优化查询性能的重要工具。通过理解索引的结构、分类、使用方法和设计原则,可以显著提升数据库的查询效率。在实际应用中,需要根据具体的查询需求和数据特点,合理设计和使用索引。

秃头之旅 7063

TSP、MTSP问题遗传算法详细解读及python实现

写在前面 遗传算法是一种求解NPC问题的启发式算法,属于仿生进化算法族的一员。仿生进化算法是受生物行为启发而发明的智能优化算法,往往是人们发现某种生物的个体虽然行为较为简单,但生物集群通过某种原理却能表现出智能行为。于是不同的人研究不同的生物行为原理,受到启发而发明出新的仿生进化算法。比如免疫优化算法,蚁群算法,模拟退火算法等,这些算法以后也会简单介绍。 本文的主题是遗传算法,该算法也是受到生物行为启发。物竞天择,适者生存,优胜劣汰,是该优化算法的核心思想。笔者在业务中需要用到遗传算法求解TSP问题,但是网

weixin_47675950的博客 9305

Python地理空间数据库之geopandas使用详解

地理空间数据分析在许多领域中都有着广泛的应用,包括地理信息系统(GIS)、城市规划、环境科学、地质勘探等。Python GeoPandas是一个强大的库,旨在简化地理空间数据的处理和分析。本文将深入介绍GeoPandas库,包括其基本概念、功能特性、示例代码以及在实际应用中的应用场景。

Rocky006的博客 1万+

MySQL 聚集索引与二级索引详解

聚集索引是一种根据表中某列的值对数据进行物理排序的索引。在 MySQL 的 InnoDB 存储引擎中,聚集索引的结构是一个B+树,并且数据表的物理存储顺序与索引的顺序保持一致。也就是说,数据存储按照主键或唯一索引的顺序排列。InnoDB 表的主键索引就是聚集索引,如果没有定义主键,InnoDB 会选择第一个非空唯一索引作为聚集索引;如果没有找到这样的索引,InnoDB 会自动创建一个隐式的主键列作为聚集索引。二级索引,也称为非聚集索引,是指数据的物理存储顺序与索引顺序无关的一类索引。

小小程序猿 1989

dell r630 配置raid_DELL服务器RAID配置图文教程

名称解释:Disk Group:磁盘组,这里相当于是阵列,例如配置了一个RAID5,就是一个磁盘组VD(Virtual Disk): 虚拟磁盘,虚拟磁盘可以不使用阵列的全部容量,也就是说一个磁盘组可以分为多个VDPD(Physical Disk): 物理磁盘HS:Hot Spare 热备Mgmt:管理【一】创建逻辑磁盘1、按照屏幕下方的虚拟磁盘管理器提示,在VD Mgmt菜单(可以通过CTRL+P...

weixin_33253741的博客 3510

MySQL 索引详解(B+数、二级索引)

MySQL 索引详解 1.概述 1.1 简介 MySQL 官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 索引的本质:索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”,满足特定查找算法。这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法。 1.2 优缺点 1.2.1 优点 类似大学图书馆建书目索引,提高数据检索的效率,降低 数据库的IO成本(1),这也是创建索引最主要的原因 通过创建唯一索引,可以保证数据库表中每一行 数据的唯一性

BaiKnow的博客 2600

Python进阶005:修改Jupyter Notebook的工作路径

1、Jupyter Notebook简介 2、修改Jupyter Notebook的工作路径 如下三个步骤: 一、安装notebook 在CMD命令行中输入: pip install notebook 二、启动notebook jupyter notebook 启动后发现是在你的用户目录下,如下图所示,但是该目录下有很多的其他文件或文件夹,因此我想把这个环境切换到我单门创建的一个文件夹中。 三、创建notebook的配置文件 在CMD命令行中执行: jupyter notebook --genera

若北辰 1384

【社招算法经验贴】算法社招记录

总的来说,也是收获了七七八八的offer,给的涨幅40~100%,职级有的可以对标到 p7(但阿里p7是真难a,a不动)。面了一圈下来,感觉大模型也在收缩hc。尤其是多模态相关hc。凭着上学期间做过相关视觉的work和paper,社招虽然能进面试,但是hc少得可怜,多模态已死慎入。还有大模型应用算法给的涨幅,跟搜广推的涨幅差别不大。真正能几百万往上的是基座pretrain/后训练/infra,但是全靠social和conn,hc极少。

Danger的博客 976

mysql 排序后 下一条记录_什么是MySQL InnoDB 二级索引的排序?|附实例详解

概述今天主要给大家介绍了关于MySQL InnoDB 二级索引的排序的相关资料,通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值。 每个InnoDB表具有一个特殊的索引称为聚簇索引(也叫聚集索引,聚类索引,簇集索引)。如果表上定义有主键,该主键索引就是聚簇索引。如果未定义主键,MySQL取第一个唯一索引(unique)而且只含非空列(NOT NULL)作为主键,InnoDB使...

weixin_39653311的博客 149

【头歌】链栈的基本操作及应用

另外,在算法的开始和结束时,栈都应该是空的,所以匹配到最后还要判断栈是否为空,若空,则说明匹配成功,返回1。其中表达式只包含三种括号,花括号{}、中括号[]、圆括号(),即它仅由 (、)、[、]、{、}六个字符组成。预期输出: 栈中元素依次为:12 47 5 8 6 92 45 63 75 38 4 29 弹出的栈顶元素 e=29 栈空否:0(1:空 0:否) 栈顶元素 e=4 栈的长度为11 清空栈后,栈空否:1(1:空 0:否)// 若栈不空,则用e返回S的栈顶元素,并返回OK;

qq_39977056的博客 4383

MySQL 二级索引命中规则详解

例如对`WHERE age=25`的条件,若`age`字段有索引,则优先扫描索引树而非全表。例如索引`(name,age)`,查询`SELECT age FROM users WHERE name='张三'`可直接从索引获取数据,减少IO消耗。可通过`COUNT(DISTINCT col)/COUNT(*)`计算选择性,指导索引设计。假设有索引`(a,b,c)`,查询`WHERE a=1 AND b=2`能命中索引,但`WHERE b=2`无法触发。**覆盖索引的妙用****索引选择性优化**

cyqntp_250的博客 196

43、FMCW雷达高度计仿真

本文介绍了FMCW雷达高度计的波形级建模与仿真过程,重点模拟了着陆和倾斜两种飞行场景以评估其性能。通过结合高程数据和飞行轨迹构建雷达场景,使用自定义信号处理器分析IQ样本并估计高度。结果表明,该高度计在多数情况下满足性能要求,但也存在误差较大的点,提出了地面检测算法优化的潜在方向。

neovim7hacker的博客 135

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

mysql二级索引没有mvcc_MySQL事务、MVCC等若干问题详解

一、并发控制1.1 读写锁读写锁,即共享锁(shared lock)和排他锁(exclusive lock),读锁是共享的,相互之间不阻塞,多个用户在同一时刻可以同时读取同一个资源,而互不干扰;写锁则是排他的,一个写锁会阻塞其他的写锁和读锁,在同一给定时间里,只有持有锁的用户能执行写入,并防止其他用户读取正在写入的同一资源。1.2 锁粒度1.2.1 表锁表锁是MySQL中最基本的锁策略,它会锁定整...

weixin_30738065的博客 744

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

MySQL聚簇索引与二级索引详解:从回表查询到覆盖索引优化

MySQL索引是数据库性能优化的核心话题,而InnoDB的聚簇索引并非辅助目录,而是整张表的数据存储载体;二级索引则是一棵独立的B+树,叶子节点只保存索引键和主键值。理解两者之间的映射关系,才能真正看懂执行计划中的Using index、Using index condition等提示。当二级索引定位到主键后还需回聚簇索引获取完整行,这个过程称为回表查询,其代价不仅是多一次B+树遍历,更可能引入大量随机IO。实际工程中可通过覆盖索引、索引下推(ICP)、MRR等手段减少或优化回表,从而提升SQL性能。这类知

weixin_30522983的博客 164

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

MySQL 二级索引覆盖查询优化方法

当查询所需的数据全部包含在索引中时,MySQL可以直接从索引中获取结果,而无需回表查询主键索引,从而显著提升性能。例如,索引(status, create_time)可同时优化WHERE status=1和ORDER BY create_time的查询,避免额外排序操作。二级索引通常存储索引列和主键值,若查询的字段均包含在索引中,MySQL可直接通过索引返回结果,避免回表操作。例如,若索引包含列A和B,查询仅涉及这两列时,引擎无需访问主表,直接从索引树获取数据,减少磁盘I/O和CPU消耗。

lsoqvv_702的博客 225

MySQL 二级索引覆盖查询实例

当查询所需字段全部包含在二级索引中时,MySQL可直接从索引获取数据,无需回表查询主键索引,从而显著提升性能。例如订单系统中,频繁查询订单状态和用户ID,若在(status, user_id)上建立索引,查询`SELECT user_id FROM orders WHERE status=1`将直接命中索引,避免回表开销。例如,针对`SELECT a, b FROM table WHERE c=1`的查询,建立(c, a, b)的联合索引可实现覆盖查询,而(a, b, c)则无法满足。

uqinmr_898的博客 164

MySQL篇8——深度揭秘MySQL:聊聊SQL查询执行顺序与MySQL索引的那些事

mysql语句执行顺序以及聚簇索引和非聚簇索引。

m0_59624833的博客 723

MySQL 二级索引覆盖查询优化

当查询所需的数据全部包含在索引中时,MySQL可以直接从索引中获取结果,无需回表查询主键索引,从而显著提升性能。例如,对频繁查询的WHERE条件和SELECT字段建立联合索引,确保索引完全覆盖查询需求。例如,使用函数处理索引字段(如SUBSTRING(name,1,5))或隐式类型转换,会阻止索引覆盖查询。例如,将SELECT *改为仅查询索引包含的字段,或使用FORCE INDEX提示强制使用特定索引。二级索引覆盖查询是MySQL性能优化的重要手段,合理设计索引和查询语句可大幅提升效率。

ucjfin_141的博客 170
上一篇: Redis 分布式缓存实战指南:常见问题、根因分析与解决方案
下一篇: Java后端面试中,MySQL的考察重点
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

龙茶清欢

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

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

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

打赏作者

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

抵扣说明:

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

余额充值