Mysql:二级索引

二级索引 也叫辅助索引非聚簇索引,是建立在主键索引之外的索引。

假设有一张用户表:

复制代码
CREATE TABLE users (
    id BIGINT PRIMARY KEY,
    name VARCHAR(50),
    age INT
);

如果创建:

复制代码
CREATE INDEX idx_name ON users(name);

那么 idx_name 就是二级索引。

二级索引存放什么

在 InnoDB 中,二级索引的叶子节点通常存放:

复制代码
索引字段值 + 主键值

大致结构如下:

复制代码
name = 'Tom'  →  id = 1001
name = 'Jack' →  id = 1002

它通常不直接保存完整的一行数据。

查询过程

执行:

复制代码
SELECT * FROM users
WHERE name = 'Tom';

查询过程是:

复制代码
二级索引 idx_name
        ↓
找到 name = 'Tom' 对应的主键 id
        ↓
回到主键索引中查找完整数据
        ↓
得到整行记录

这个过程叫做回表

二级索引的作用

1. 加快非主键字段查询

如果没有 idx_name,数据库可能需要扫描整张表:

复制代码
逐行检查 name 是否等于 'Tom'

有二级索引后,可以快速定位符合条件的记录。

2. 支持排序和范围查询

例如:

复制代码
SELECT * FROM users
WHERE age BETWEEN 20 AND 30
ORDER BY age;

建立:

复制代码
CREATE INDEX idx_age ON users(age);

后,数据库可以利用索引快速定位范围,并按索引顺序扫描。

3. 加快关联查询

例如:

复制代码
SELECT *
FROM orders
WHERE user_id = 1001;

orders.user_id 建立二级索引,可以提高根据用户查订单的效率,也有利于表连接操作。

4. 实现覆盖索引,避免回表

如果查询需要的字段都在二级索引中:

复制代码
CREATE INDEX idx_name_age ON users(name, age);

SELECT name, age
FROM users
WHERE name = 'Tom';

二级索引中已经包含 nameage,数据库可以直接从索引返回结果,不需要再查询主键索引。这叫覆盖索引

二级索引和主键索引的区别

对比项 主键索引 二级索引
一张表数量 通常只能有一个 可以有多个
是否要求唯一 必须唯一、不能为 NULL 普通二级索引不要求
叶子节点 保存完整行数据 保存索引列和主键值
查询后是否可能回表 通常不需要 可能需要
主要用途 唯一标识和定位记录 加速其他字段的查询

一句话总结:

二级索引就是为非主键字段建立的 B+ 树目录,用来快速找到对应的主键,再通过主键索引获取完整记录。

相关推荐
Lyra_Infra15 小时前
从 MySQL 到达梦:一次信创隔离环境里的数据库迁移踩坑实录
数据库·后端·mysql
数据工匠老o15 小时前
sysbench/TPC-C/自定义脚本:数据库压测工具对比与实战流程
数据库·测试
数安3000天16 小时前
数据分类分级产品有哪四类技术路线?
大数据·数据库
泡茶喝茶写代码16 小时前
量化数据开发实战系列(第 25 篇):基金基础接口实战:基金列表、ETF-LOF 分类、基金概况、净值数据
java·数据库·人工智能·python·mysql
张小姐的猫16 小时前
【AI大模型接入SDK】 —— 数据管理 & 与Session模块进行联动
数据结构·数据库·c++·人工智能·python·chatgpt
IvorySQL16 小时前
PostgreSQL 日报|大模型破解在线校验和(9 月 15 日)
数据库·人工智能·postgresql
Leon-Ning Liu17 小时前
Oracle 19c ASMB 进程 PGA 内存泄漏排查实战 (Bug 38610635)
数据库·oracle
步行cgn17 小时前
Spring 注入 null 和空字符串详解
数据库·spring·oracle
worilb17 小时前
Win下使用同一套MySQL创建第二个独立实例
mysql
Allen_LVyingbo17 小时前
医疗人工智能项目全生命周期管理系统:监管知识建模、工程实现与实证评估(下)
大数据·数据库·人工智能·python·自然语言处理·自动化