从6个角度分析MySQL里索引的类型有哪些

MySQL的索引站在不同的角度,有不同的分类说法,以下是从几个不同的角度对索引进行分类的概述:

基于存储结构

从索引存储时使用的数据结构来看,可以分为以下四类:

  1. B+树索引:最常用的索引类型,使用B+树来存储索引结构,一般用于范围查询和排序
  2. 哈希索引:基于哈希表的索引,适用于等值查询/精确查询,MySQL的InnoDB引擎并不支持这种索引
  3. 倒排索引(全文索引):对文本字段进行全文搜索,允许在文本数据中进行关键字搜索和模糊匹配
  4. R-树索引:多维空间树,用于处理空间数据,如地理位置和几何形状

根据叶子节点是否存储数据

如果索引叶子节点存储的是数据行,就是聚簇索引,否则就是非聚簇索引。

简单来说,某个数据表本身就可以看作是一棵使用主键搭建起来的B+树,这棵树的叶子节点放着表的所有行。而其他索引也是B+树,但是叶子节点放的是主键

这里引入了一个回表的概念,如果查询数据的时候用到了非聚簇索引,那么数据库会先在非聚簇索引里找到主键,再根据主键去聚簇索引里查找数据行,这个数据行是存放在磁盘里的,所以触发磁盘IO后能够读取出来,这个过程性能较慢。因此实践过程中要尽量避免回表。

聚簇索引(Clustered Index)

聚簇索引是指索引结构和数据行存储在一起的索引。在InnoDB中,每个表都有一个聚簇索引,通常是主键索引。

当使用聚簇索引查询数据时,因为索引和数据行是存储在一起的,所以可以直接在索引结构中找到数据行,不需要额外的磁盘I/O去查找数据行。

聚簇索引的叶子节点包含了完整的数据行,因此查询可以直接在聚簇索引中完成,不需要回表。
非聚簇索引(Non-Clustered Index)

非聚簇索引是指索引结构和数据行分开存储的索引。在InnoDB中,除了聚簇索引之外的所有索引都是非聚簇索引。

当使用非聚簇索引查询数据时,索引结构中只包含了索引列和辅助列(如果有),而不包含完整的数据行。因此,索引结构中通常只包含主键作为书签(bookmark),用于快速定位数据行。

非聚簇索引的查询需要两步:首先在非聚簇索引中找到主键,然后使用主键在聚簇索引中查找完整的数据行。这个额外的步骤称为回表(index lookup or bookmark lookup)。
性能差异:

聚簇索引查询不需要回表,因此查询性能通常更好,因为它减少了磁盘I/O操作。

非聚簇索引查询需要回表,这意味着需要额外的磁盘I/O操作去聚簇索引中查找数据行,这会增加查询的延迟。
磁盘I/O:

对于聚簇索引,由于数据行和索引在一起,所以读取数据时只需要一次磁盘I/O。

对于非聚簇索引,需要至少两次磁盘I/O:一次是读取非聚簇索引中的主键,另一次是根据主键读取聚簇索引中的数据行。

ps:这里有点存疑 先保留

索引性质

  1. 主键索引:唯一标识表中每行的索引
  2. 普通索引:二级索引,除了主键索引外其他的索引
  3. 全文索引:用于文本搜索的索引,支持复杂查询
  4. 空间索引:用于地理空间数据的索引
  5. 前缀索引:索引的某个列,只包含该列值的前一部分

基于索引唯一性的分类

  • 唯一索引:保证索引列的值是唯一的,可以是一个列或是多个列的组合
  • 非唯一索引

基于索引包含列的数量的分类

  • 单列索引:索引只包含一个列
  • 联合索引/复合索引/多列索引:索引包含多个列

基于索引对查询优化的影响

分为覆盖索引和非覆盖索引

  • 覆盖索引:索引中包含了查询所需要的所有列,查询不需要访问表数据
  • 非覆盖索引:索引中不包含所有查询所需的列,查询可能需要回表查询

总结

一个索引可以同时覆盖索引、唯一索引、前缀索引和组合索引,要站在不同的角度去看

相关推荐
Dxy123931021623 分钟前
MySQL索引完整教程:创建、查看、修改、删除与日常管理
前端·javascript·mysql
Quincy_Freak2 小时前
信创内网数据规范实践:银河麒麟下SQLite本地数据安全管理方案
数据库·sqlite·arm·数据库管理·大数据分析·银河麒麟·aarch64
至乐活着3 小时前
MySQL索引底层原理与查询优化实战:从B+树到执行计划
mysql·b+树·查询优化·sql性能·索引原理
IT_陈寒4 小时前
闭包陷阱让我加了两天班,JavaScript你真行
前端·人工智能·后端
万联WANFLOW4 小时前
SD-WAN 控制平面高可用怎么做?SDWAN 控制器挂了,全网会发生什么
运维·网络·分布式·架构
2601_962683894 小时前
治理遗留系统中的“生肉 SQL”:一次用多模型协作优化慢查询的实战复盘
数据库·人工智能·sql
踩着两条虫4 小时前
可视化 vs 终端 vs 云端:VTJ.PRO、Claude Code、Codex 三强横评
前端·vue.js·人工智能·低代码·架构
Fabarta4 小时前
从 0 实现 ChatGPT 风格的流式对话 UI
算法·架构
酱学编程5 小时前
【从零到一实现一个 AI Agent 框架 · 第四篇】04. 任务规划:拆解复杂目标 -
服务器·网络·数据库·人工智能
易协同低代码5 小时前
通达OA核心类库TD类深度解析
后端