索引与书架、新华字典的爱恨情仇

简介: 在MySQL中,索引是提升查询速度的关键技术。根据存储类型,索引分为聚簇索引和非聚簇索引。聚簇索引将数据按索引顺序存储在磁盘上,查询主键时效率极高;非聚簇索引则通过索引项指向实际数据位置,适用于多条件查询。本文详细解释这两种索引的工作原理及应用场景,并介绍InnoDB和MyISAM存储引擎的实现方式。

在MySQL的索引世界中,性能优化一直是开发者们关注的焦点。而索引,作为提升查询速度的关键技术之一,是非常重要的。索引根据存储类型可以分为聚簇索引(聚集)与非聚簇索引(非聚集),它们决定了数据在磁盘上的存储方式和查询时的访问路径。本文将带你深入了解这两种索引类型,用最简单的语言解释它们的工作原理和应用场景。

聚簇索引:


添加图片注释,不超过 140 字(可选)


想象一下,你有一个书架,上面按照书名的字母顺序排列了所有的书籍。当你想找到某本书时,你只需要按照字母顺序查找,很快就能找到。这个书架就相当于数据库中的聚簇索引。

在聚簇索引中,数据实际上就是按照索引的顺序存储在磁盘上的。也就是主键与数据在一起并存储在磁盘上。类似书本就是数据、书名类似主键,它们在一起并放置在书架上。当然这里的主键更准确应该是书的编号。

工作原理:


添加图片注释,不超过 140 字(可选)

聚集索引的叶子节点直接存储表的实际数据行,也就是数据行的物理存储顺序与索引的逻辑顺序是一致的。因此,当你通过主键进行查询时,MySQL可以直接定位到数据行所在的物理位置,大大提高了查询效率。

  1. 关键字(Keys):用于维护树中数据顺序的标识符。
  2. 子节点指针(Child Pointers):指针指向节点的子节点。在B+树中,每个非叶子节点的子节点指针数量总是比关键字的数量多一个。

非聚簇索引:

再想象一下,你有一个目录,类似的里面记录了书架上每本书的位置哪一排、哪一层。当你想找到某本书时,你先查找目录,找到书的实际位置,然后去书架上取书。这个笔记本就相当于数据库中的非聚簇索引。

其实还有个例子也非常形象,就是新华字典。


添加图片注释,不超过 140 字(可选)


新华字典是按照拼音或部首来组织汉字的,每个字都有一个对应的索引项,告诉你这个字在字典中的具体页码。当你想要查找一个字时,你可以先查看字典的目录,找到这个字的页码,然后直接翻到那一页查找。在这个过程中,索引项并不包含字的完整解释,只是提供了一个指向字典正文中字的位置的“指针”。

在MySQL中,非聚簇索引就是这样的“新华字典”,它的叶子节点存储的是索引列的值和对应数据行的指针,而不是数据行本身。


工作原理:


添加图片注释,不超过 140 字(可选)


非聚集索引的叶子节点不直接存储数据行,而是存储索引键值和指向数据行位置的逻辑指针。当你通过非聚簇索引进行查询时,MySQL首先在索引中找到匹配的索引项,然后根据索引项中的指针去数据表中获取完整的数据行。这个过程通常被称为“回表”。

MySQL是如何实现聚簇/非聚簇索引的?

存储引擎


添加图片注释,不超过 140 字(可选)


聚簇索引和非聚簇索引的实现依赖于存储引擎。不同的存储引擎有不同的实现方式。最常用的存储引擎是InnoDB和MyISAM,它们分别实现了聚簇索引和非聚簇索引。当然除了最常用的存储引擎外MySQL还支持其它的存储引擎。

数据结构


添加图片注释,不超过 140 字(可选)


  • InnoDB存储引擎

InnoDB是MySQL默认的存储引擎之一,它使用B+树作为索引结构。InnoDB的聚簇索引(Clustered Index)实际上是表数据本身,它的叶节点包含了行数据。

  • MyISAM存储引擎

MyISAM是MySQL的另一个存储引擎,它同样使用B+树作为索引结构。MyISAM的索引文件和数据文件是分开的,索引仅包含指向数据的指针。



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
10月前
|
缓存 JSON API
1688 商品详情 API 接口实战指南
1688开放平台alibaba.item.get接口,用于获取商品全量信息,支持选品、ERP同步等场景。需企业认证、申请权限并配置IP白名单。通过AppKey/Secret生成签名,调用时指定item_id等参数,返回商品标题、价格、SKU、图片等字段。默认5次/秒调用频次,建议按需请求、本地缓存、异步处理以提升效率。
|
7月前
|
存储 监控 数据处理
浏览器自动化能干嘛?三个零门槛实操案例
本文介绍零代码浏览器自动化工具如何解放重复劳动:教培老师作业归档、个人账单统计、打印店接单等场景,仅需拖拽配置即可实现全自动操作。无需编程,识别按钮、提取数据、处理文件、自动回复一气呵成,每天轻松省下数小时。(239字)
|
监控 Java Spring
AOP 切面编程
AOP(面向切面编程)通过动态代理在不修改源码的前提下,对方法进行增强。核心概念包括连接点、通知、切入点、切面和目标对象。常用于日志记录、权限校验、性能监控等场景,结合Spring AOP与@Aspect、@Pointcut等注解,实现灵活的横切逻辑管理。
2705 6
AOP 切面编程
|
人工智能 边缘计算 自然语言处理
CodeBuddy全新升级:体验Craft智能体的对话式编程革命
本文介绍了腾讯云代码助手CodeBuddy及其核心功能Craft智能体,展示了其在软件开发中的创新应用。Craft智能体通过自然语言理解、上下文感知的代码补全和多轮对话式调试等功能,显著提升了开发效率。文章详细解析了Craft的技术架构、实战应用、高级功能探索、最佳实践、性能优化策略以及与其他工具的集成。此外,还探讨了Craft在安全性与合规性、企业级定制、多模态编程支持、团队协作模式、边缘计算场景支持等方面的创新实践。Craft智能体代表了软件开发范式的重要转变,通过将自然语言理解与代码生成能力结合,降低
1428 1
|
人工智能 搜索推荐 数据挖掘
小红书电商 API 开启小红书店铺电商内容营销新范式
小红书电商 API 为商家提供自动化运营与内容营销新范式,支持商品管理、批量发布 UGC、数据分析等功能,提升效率、降低成本,助力品牌实现精准营销与用户深度互动。
|
安全 Java
synchronized修饰普通方法和静态方法的区别
在Java多线程中,`synchronized`关键字用于同步机制,确保线程安全。修饰普通方法时,同步基于对象实例,仅同步访问同一对象的方法调用,不同对象间互不影响。修饰静态方法时,则基于类级别,所有对象访问同一静态方法时会互相阻塞。前者适合保护对象状态,后者适用于类级资源同步。需注意,修饰静态方法可能会影响并发性能。实际应用中应根据需求选择适当的同步策略,以平衡程序正确性和效率。
|
安全 Java
【Java并发】【ArrayBlockingQueue】适合初学体质的ArrayBlockingQueue入门
什么是ArrayBlockingQueue ArrayBlockingQueue是 Java 并发编程中一个基于数组实现的有界阻塞队列,属于 java.util.concurrent 包,实现了 Bl...
444 6
【Java并发】【ArrayBlockingQueue】适合初学体质的ArrayBlockingQueue入门
|
图形学 开发者
透视与正交之外的奇妙视界:深入解析Unity游戏开发中的相机与视角控制艺术,探索打造沉浸式玩家体验的奥秘与技巧
【8月更文挑战第31天】在Unity中,相机不仅是玩家观察游戏世界的窗口,更是塑造氛围和引导注意力的关键工具。通过灵活运用相机系统,开发者能大幅提升游戏的艺术表现力和沉浸感。本文将探讨如何实现多种相机控制,包括第三人称跟随和第一人称视角,并提供实用代码示例。
1082 1
|
Java 数据库连接 数据库
Mybatis JDBC No enum constant org.apache.ibatis.type.JdbcType.TEXT异常处理
Mybatis JDBC No enum constant org.apache.ibatis.type.JdbcType.TEXT异常处理
1142 0
|
机器学习/深度学习 人工智能 安全
通义千问开源的QwQ模型,一个会思考的AI,阿里云百炼邀您第一时间体验
Qwen团队推出新成员QwQ-32B-Preview,专注于增强AI推理能力。通过深入探索和试验,该模型在数学和编程领域展现了卓越的理解力,但仍在学习和完善中。目前,QwQ-32B-Preview已上线阿里云百炼平台,提供免费体验。
5223 0