MySQL 索引存储结构

索引是优化数据库查询最重要的方式之一,它是在 MySQL 的存储引擎层中实现的,所以
每一种存储引擎对应的索引不一定相同。我们可以通过下面这张表格,看看不同的存储引擎
分别支持哪种索引类型:

B+Tree 索引和 Hash 索引是我们比较常用的两个索引数据存储结构,B+Tree 索引是通过
B+ 树实现的,是有序排列存储,所以在排序和范围查找方面都比较有优势
Hash 索引相对简单些,只有 Memory 存储引擎支持 Hash 索引。Hash 索引适合 key
value 键值对查询,无论表数据多大,查询数据的复杂度都是 O(1),且直接通过 Hash 索
引查询的性能比其它索引都要优越。
在创建表时,无论使用 InnoDB 还是 MyISAM 存储引擎,默认都会创建一个主键索引,而
创建的主键索引默认使用的是 B+Tree 索引。不过虽然这两个存储引擎都支持 B+Tree 索
引,但它们在具体的数据存储结构方面却有所不同。
InnoDB 默认创建的主键索引是聚族索引(Clustered Index),其它索引都属于辅助索引
(Secondary Index),也被称为二级索引或非聚族索引。接下来我们通过一个简单的例子,说明下这两种索引在存储数据中的具体实现。
首先创建一张商品表,如下:

然后新增了以下几行数据,如下:

如果我们使用的是 MyISAM 存储引擎,由于 MyISAM 使用的是辅助索引,索引中每一个
叶子节点仅仅记录的是每行数据的物理地址,即行指针,如下图所示:

如果我们使用的是 InnoDB 存储引擎,由于 InnoDB 使用的是聚族索引,聚族索引中的叶
子节点则记录了主键值、事务 id、用于事务和 MVVC 的回流指针以及所有的剩余列,如下
图所示:

基于上面的图示,如果我们需要根据商品编码查询商品,我们就需要将商品编码 serial_no
列作为一个索引列。此时创建的索引是一个辅助索引,与 MyISAM 存储引擎的主键索引的
存储方式是一致的,但叶子节点存储的就不是行指针了,而是主键值,并以此来作为指向行
的指针。这样的好处就是当行发生移动或者数据分裂时,不用再维护索引的变更。
如果我们使用主键索引查询商品,则会按照 B+ 树的索引找到对应的叶子节点,直接获取到
行数据:

复制代码
select * from merchandise where id=7

如果我们使用商品编码查询商品,即使用辅助索引进行查询,则会先检索辅助索引中的 B+
树的 serial_no,找到对应的叶子节点,获取主键值,然后再通过聚族索引中的 B+ 树检索
到对应的叶子节点,然后获取整行数据。这个过程叫做回表。
在了解了索引的实现原理后,我们再来详细了解下平时建立和使用索引时,都有哪些调优方
法呢?


系列阅读

  1. 电商系统的分布式事务调优
  2. 数字化-落地路径与数据中台
  3. 可复用架构:如何实现高层次的复用?
相关推荐
2301_8002561128 分钟前
第九章:空间网络模型(空间网络查询、数据模型、Connected、with Recursive、pgRouting)
网络·数据库·算法·postgresql·oracle
霖霖总总1 小时前
[小技巧19]MySQL 权限管理全指南:用户、角色、授权与安全实践
数据库·mysql·安全
heartbeat..6 小时前
Spring AOP 全面详解(通俗易懂 + 核心知识点 + 完整案例)
java·数据库·spring·aop
麦聪聊数据8 小时前
MySQL并发与锁:从“防止超卖”到排查“死锁”
数据库·sql·mysql
AC赳赳老秦9 小时前
DeepSeek 私有化部署避坑指南:敏感数据本地化处理与合规性检测详解
大数据·开发语言·数据库·人工智能·自动化·php·deepseek
myzshare9 小时前
实战分享:我是如何用SSM框架开发出一个完整项目的
java·mysql·spring cloud·微信小程序
YMatrix 官方技术社区10 小时前
YMatrix 存储引擎解密:MARS3 存储引擎如何超越传统行存、列存实现“时序+分析“场景性能大幅提升?
开发语言·数据库·时序数据库·数据库架构·智慧工厂·存储引擎·ymatrix
辞砚技术录10 小时前
MySQL面试题——索引2nd
数据库·mysql·面试
linweidong11 小时前
C++thread pool(线程池)设计应关注哪些扩展性问题?
java·数据库·c++
墨笔之风11 小时前
java后端根据双数据源进行不同的接口查询
java·开发语言·mysql·postgres