当前位置: 首页 > news >正文

一篇文章告诉你什么是索引?

什么是索引?

索引的定义是帮助存储引擎快速获取数据的一种数据结构,形象地说,索引就是数据的目录。

索引的分类

可以从四个角度来分类索引:

分类角度索引类型
数据结构B+Tree索引、Hash索引、Full-text索引
物理存储聚簇索引(主键索引)、二级索引(辅助索引)
字段特性主键索引、唯一索引、普通索引、前缀索引
字段个数单列索引、联合索引

按数据结构分类

InnoDB存储引擎在不同场景下选择不同的列作为索引:

  • 有主键:使用主键作为聚簇索引的索引键

  • 无主键:选择第一个不包含NULL值的唯一列

  • 都没有:自动生成隐式自增id列

B+Tree索引查询过程示例:

查询过程自顶向下逐层查找,经历3个节点即3次I/O操作。

二级索引与回表:

  • 二级索引的叶子节点存放的是主键值,而非实际数据

  • 使用二级索引查询需要先查二级索引获得主键值,再查主键索引获取完整数据,这个过程叫"回表"

  • 如果查询的数据能在二级索引中直接获取,则称为"覆盖索引",无需回表

为什么MySQL InnoDB选择B+Tree?

对比项B+Tree优势
vs B树非叶子节点不存数据,单节点数据量更小,I/O次数更少;叶子节点双向链表适合范围查询
vs 二叉树高度维持在3~4层,千万级数据只需3~4次I/O
vs HashHash不适合范围查询,B+Tree适用范围更广

按物理存储分类

类型叶子节点存储内容
聚簇索引(主键索引)实际数据
二级索引(辅助索引)主键值

按字段特性分类

1. 主键索引

2. 唯一索引

3. 普通索引

4. 前缀索引(对字符类型字段的前几个字符建立索引)

按字段个数分类

联合索引

联合索引的B+Tree先按第一个字段排序,在第一个字段相同的情况下再按第二个字段排序,以此类推。

最左匹配原则:使用联合索引时,需按照最左优先的方式进行索引匹配,否则索引会失效。

联合索引范围查询的特殊情况:

查询条件索引使用情况
a > 1 and b = 2只有a用到索引,b用不到(>会停止匹配)
a >= 1 and b = 2a和b都用到了索引(>=不会停止匹配)
a BETWEEN 2 AND 8 AND b = 2a和b都用到了索引
name like 'j%' and age = 22name和age都用到了索引

索引下推(MySQL 5.6+)

在没有索引下推时,二级索引查询需要先回表再判断条件。使用索引下推后,可以在联合索引遍历过程中先对索引中包含的字段做判断,直接过滤不满足条件的记录,减少回表次数。执行计划中出现Using index condition即表示使用了索引下推。

索引区分度

区分度 = 字段不同值的个数 ÷ 表的总行数

建立联合索引时,应把区分度大的字段排在前面。

联合索引用于排序

什么时候需要/不需要创建索引?

适用索引的场景

  • 字段有唯一性限制(如商品编码)

  • 经常用于WHERE查询条件的字段

  • 经常用于GROUP BY和ORDER BY的字段

不需要创建索引的场景

  • WHERE、GROUP BY、ORDER BY里用不到的字段

  • 字段中存在大量重复数据(如性别字段)

  • 表数据太少

  • 经常更新的字段

优化索引的方法

1. 前缀索引优化

使用字符串字段的前几个字符建立索引,可减小索引字段大小,提高查询速度。但无法用于ORDER BY和覆盖索引。

2. 覆盖索引优化

索引的叶子节点上包含查询所需的所有字段,可避免回表操作,减少I/O。

3. 主键索引最好是自增的

自增主键的好处:

  • 每次插入新数据是追加操作,不需要移动已有数据

  • 避免页分裂,提高插入效率

  • 减少内存碎片,提高查询效率

4. 索引最好设置为NOT NULL

  • NULL会使优化器在选择索引时更加复杂

  • NULL会占用物理空间(需要NULL值列表)

5. 防止索引失效

常见索引失效的情况:

  • 使用左模糊或左右模糊匹配(like %xxlike %xx%

  • 对索引列做了计算、函数、类型转换操作

  • 违反联合索引的最左匹配原则

  • OR条件中只有部分列是索引列

执行计划关键指标

字段说明
possible_keys可能用到的索引
key实际使用的索引(NULL表示未使用索引)
key_len索引长度
rows扫描的数据行数
type数据扫描类型(性能从低到高:All → index → range → ref → eq_ref → const)

Extra字段重要指标:

  • Using filesort:需要文件排序,效率低

  • Using temporary:使用临时表,效率低

  • Using index:使用了覆盖索引,效率高

总结

问题答案
什么是索引?帮助存储引擎快速获取数据的数据结构
常用索引类型?B+Tree、Hash、Full-text;聚簇、二级;主键、唯一、普通、前缀;单列、联合
为什么用B+Tree?查询效率高,I/O次数少,适合范围查询
什么是回表?使用二级索引查询后,再查主键索引获取完整数据
什么是覆盖索引?查询所需数据都能在索引中直接获取,无需回表
最左匹配原则?联合索引按最左优先方式匹配,遇到>、<会停止匹配(>=、<=、BETWEEN、like前缀不会停止)
主键为什么推荐自增?避免页分裂,提高插入效率和空间利用率
索引失效常见情况?like左模糊、索引列计算/函数/类型转换、违反最左匹配、OR条件不全为索引列
http://www.cnnetsun.cn/news/2523911.html

相关文章:

  • Windows热键冲突终极解决方案:Hotkey Detective快速定位“热键小偷“的完整指南
  • 如何永久保存微信聊天记录:WeChatMsg完全解决方案指南
  • OBS多平台推流插件终极指南:3分钟实现一键同步直播到多个平台
  • Faster-Whisper-GUI简繁体字幕转换机制深度解析与优化策略
  • 终极Navicat密码恢复指南:3分钟快速找回遗忘的数据库连接密码
  • 校园考勤数据实战:ETL 全流程 + BI 可视化从 0 到 1 搭建
  • 5分钟掌握ncmdumpGUI:轻松转换网易云音乐NCM文件为MP3
  • 我开源了一个AI智囊团:200+专家实时群聊,自动拆解需求组建团队,这可能是目前最实用的AI协作平台
  • 零基础转行工业AI视觉全攻略|从入门学习、项目积累、求职就业到副业接单完整路径
  • 抖音下载神器:三步速成法,轻松批量下载无水印视频
  • 如何高效管理Windows右键菜单:专业工具完全指南
  • 内外网隔开
  • 【云计算学习之路】学习Centos7系统:服务搭建(NFS)
  • 歌词滚动姬:3分钟上手!零基础制作专业LRC歌词的秘诀
  • Jenga框架双引擎设计:视频生成效率优化解析
  • W4A8双精度量化技术:深度学习模型高效部署方案
  • 量子计算基础:时间演化与测量原理详解
  • HR刚发裁员通知书让我滚蛋,甲方大客户指名道姓我负责二期项目。看着老板咬牙切齿给我开出双倍返聘薪水,我笑着把离职证明拍在了他脸上
  • GPU测试配置文件config.txt命令详解与应用
  • Veritas项目:CNF与LLM结合的Verilog代码生成框架
  • 终极免费在线3D模型浏览器:从零开始构建你的专业可视化平台
  • WinAsar:掌握Electron asar文件管理的可视化利器
  • MiGPT:如何让你的小爱音箱从“人工智障“升级为“AI学霸“
  • Unity 3D空间智能适配:Fit It 3D实现物理占位与视觉节奏统一
  • Unity Android构建支持安装失败的根源与解决方案
  • Windows 11安卓子系统完整指南:三步实现跨平台应用体验
  • 如何用开源歌词滚动姬3步制作专业LRC歌词:完全免费跨平台指南
  • JAMBA混合架构:长上下文低延迟推理的新范式
  • 终极Windows远程桌面解锁方案:RDP Wrapper Library完整指南
  • 编写行业前沿资讯精准筛选程序,过滤冗余信息,推送岗位相关创新行业动态。