MySQL索引类型

MySQL 中常见的索引类型可以从多个角度划分,面试和实战中常考的是 按数据结构分类 和 按功能/逻辑分类。下面给你一个清晰、系统的整理。

一、按数据结构分类(最核心)

索引类型 说明 适用场景

B+Tree 索引 MySQL 默认索引结构,InnoDB 主要使用 等值查询、范围查询、排序、分组

Hash 索引 基于哈希表,等值查询极快 Memory 引擎常用,不支持范围查询

R-Tree 索引 空间索引,用于地理数据 GIS 地理位置

Full-text 索引 全文索引 文本内容搜索

✅ InnoDB 默认使用 B+Tree

二、按逻辑/功能分类(最常被问)

1️⃣ 普通索引(INDEX)

• 最基本的索引

• 无唯一性限制

CREATE INDEX idx_name ON user(name);

2️⃣ 唯一索引(UNIQUE INDEX)

• 索引列值必须唯一

• 允许 NULL(多个 NULL 不算重复)

CREATE UNIQUE INDEX uk_email ON user(email);

✅ 常用于:邮箱、手机号、业务唯一键

3️⃣ 主键索引(PRIMARY KEY)

• 特殊的唯一索引

• 不允许 NULL

• 一张表只能有一个主键

PRIMARY KEY (id)

✅ InnoDB 中主键即聚簇索引

4️⃣ 组合索引(复合索引 / 联合索引)

• 多个列组成的索引

• 遵循 最左前缀原则

CREATE INDEX idx_a_b ON t(a, b);

✅ 适合多条件查询

❌ (b) 单独查询无法使用该索引

5️⃣ 前缀索引

• 对字段前 N 个字符建索引

• 节省空间

CREATE INDEX idx_title ON article(title(20));

✅ 常用于 TEXT / VARCHAR

❌ 不能用前缀索引做覆盖索引

6️⃣ 全文索引(FULLTEXT)

• 用于关键词搜索

• 替代 LIKE '%xxx%'

CREATE FULLTEXT INDEX ft_content ON article(content);

✅ 支持自然语言 / 布尔搜索

三、按存储方式分类(InnoDB 特有)

1️⃣ 聚簇索引(Clustered Index)

• InnoDB 主键索引

• 数据行存储在叶子节点

• 一张表只有一个

✅ 主键查询最快

❌ 主键应尽量短、自增

2️⃣ 非聚簇索引(Secondary Index)

• 普通索引、唯一索引、组合索引

• 叶子节点存 主键值

✅ 需要回表查询完整数据

四、特殊索引类型

类型 说明

覆盖索引 索引包含查询所需全部字段,无需回表

函数索引 MySQL 8.0 支持对表达式建索引

降序索引 MySQL 8.0 支持 DESC

-- MySQL 8.0

CREATE INDEX idx_time ON log(create_time DESC);

五、索引类型对比总结

类型 是否默认 是否唯一 是否聚簇

PRIMARY KEY ✅ ✅ ✅

UNIQUE ❌ ✅ ❌

INDEX ❌ ❌ ❌

FULLTEXT ❌ ❌ ❌

六、面试高频一句话总结 ✅

MySQL 默认使用 B+Tree 索引,InnoDB 中主键是聚簇索引,普通索引是非聚簇索引;常见类型包括普通索引、唯一索引、主键索引、组合索引和全文索引。

相关推荐
有想法的py工程师1 小时前
PostgreSQL 设置唯一主键的生产事故复盘与最佳实践
数据库·oracle
或与且与或非1 小时前
postgresql+rabbitmq集群搭建方案
数据库·postgresql·rabbitmq
AllData公司负责人1 小时前
亲测丝滑,体验跃迁|AllData通过集成开源项目Cube-Studio,降低机器学习落地门槛
java·大数据·数据库·人工智能·机器学习·开源·cube-studio
zhz52141 小时前
Docker 部署 MongoDB / MySQL / PostgreSQL 安全加固实录:TLS 双向认证、双因素鉴别与审计
mysql·mongodb·docker·postgresql·等保
KaMeidebaby2 小时前
卡梅德生物技术快报|抗体的制备与纯化:分子实验实操:番茄 sHSP 重组表达与抗体的制备与纯化工艺
前端·数据库·人工智能·其他·算法·百度·新浪微博
幻灭行度2 小时前
Redis ACL 实现多账号权限隔离
数据库·redis·oracle
Kurisu5752 小时前
深度解析:Go 语言 GMP 调度器模型与内核线程探测
java·数据库·golang
Lao A(zhou liang)的菜园2 小时前
作为Oracle DBA,如何快速处理HANG类故障?
数据库·oracle·dba
tongyiixiaohuang2 小时前
MySQL与钉钉数据同步的灵活高效方案详解
android·mysql·钉钉