MYSQL 主键索引和辅助索引

本文探讨了InnoDB和MYISAM两种存储引擎下主键索引与辅助索引的区别。在InnoDB中,主键索引的叶子节点直接存储数据,辅助索引存储主键ID;而在MYISAM中,无论是主键还是辅助索引,都存储数据的指针。这影响了查询效率和数据存储的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如上图User表,id为主键,name为普通字段。

如果将id和name设置为索引,id是主键索引,name为普通索引,也叫做辅助索引。他们之间有什么区别呢?

InnoDB 存储引擎情况下

在InnoDB存储引擎的B+树的数据结构下,主键索引下跟着的是数据信息,而辅助索引下跟着的是主键的id。

如图所示:

使用主键索引查询的时候,可直接取到数据。

使用主键索引查询的时候,要先得到主键索引值,再根据索引值去匹配数据。

MYISAM 存储引擎情况下

MYISAM 的索引是非聚集索引,索引信息和数据信息在不同的文件下,无论是主键索引还是辅助索引下跟着的都是数据的指引地址,根据数据的指引地址去数据信息文件搜索所需数据。

 

### MySQL 中非主键索引的 B+Tree 实现原理及底层结构 在 MySQL 的存储引擎中,无论是 MyISAM 还是 InnoDB,都广泛采用了 B+Tree 数据结构作为索引的核心实现方式[^2]。下面详细介绍非主键索引(Secondary Index)基于 B+Tree 的实现及其底层逻辑。 #### 1. 非主键索引的特点 非主键索引也被称为辅助索引或次级索引,在 InnoDB 存储引擎下,它与主键索引有显著区别。由于 InnoDB 使用的是聚簇索引(Clustered Index),表中的数据按照主键顺序物理存储,而非主键索引则通过指向主键的方式间接访问实际记录[^3]。 - **叶子节点的内容** 对于非主键索引来说,其叶子节点不仅包含索引列的值,还额外保存了对应主键的值。这种设计使得当查询命中非主键索引,能够快速定位到对应的主键位置并进一步获取完整的行数据[^4]。 #### 2. B+Tree 的基本特性 B+Tree 是一种多路平衡查找树,具有如下特点: - 所有的关键字均存放在叶子节点上; - 非叶子节点仅用于引导搜索方向,不存储真实的数据项; - 叶子节点之间存在链表连接,便于范围扫描操作; 这些特征决定了 B+Tree 特别适合数据库系统的应用场景——频繁地进行随机读写大范围检索操作[^5]。 #### 3. InnoDB 下非主键索引的工作机制 假设有一个名为 `users` 的表格,定义了一个整数类型的字段 `age` 并为其创建了非主键索引,则该索引的实际布局大致如下: ```plaintext | age | primary_key | --------------------- | 20 | 10 | | 25 | 15 | | 30 | 20 | ... ``` 这里每条记录由两部分组成:一是索引列本身 (`age`) ,二是关联的主键值 (`primary_key`) 。一旦用户发起针对年龄字段的查询请求 (e.g., SELECT * FROM users WHERE age=25),系统会先利用上述索引来找到匹配条件的第一笔资料的位置,接着再依据所得到的那个主键主键索引里做第二次查找以取出最终的结果集。 此过程通常被描述为“回表”,即除了第一次使用非主键索引外还需要再次回到主键索引完成整个取数流程。如果能减少甚至避免这种情况的发生(比如只选取那些已经存在于非主键索引里的信息), 就可以有效提升性能表现. #### 4. 性能考量 为了优化涉及非主键索引的操作效率, 开发者应当注意以下几点建议: - 如果可能的话尽量覆盖查询(Covering Query): 让所有需要用到的信息都能直接从某个单一索引内部获得而无需多次跳转. - 合理设置复合索引: 当多个过滤条件经常一起出现的候考虑建立联合索引可能会带来更好的效果. --- ### 示例代码展示如何查看当前库内的索引情况 以下是几个常用的 SQL 命令可以帮助开发者理解现有表上的各种索引配置: ```sql -- 查看某张表的所有索引详情 SHOW INDEX FROM table_name; -- 获取更详细的元数据统计关于特定索引 SELECT * FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_NAME='table_name'; ``` 以上命令适用于大多数标准版 MySQL 安装环境之中. ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

丢了尾巴的猴子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值