mysql索引

MySQL 索引入门(InnoDB 视角)

1. 为什么要使用索引

使用索引的核心目标是提升查询性能,主要有以下几点:

  1. 减少磁盘 I/O(使用高效数据结构,更快定位目标页)
  2. 减少扫描行数(降低 CPU 过滤成本)
  3. 支持高效排序 / 分组 / 范围查询

2. 索引的代价与注意点

索引有明显收益,但也有代价:

  1. 占用额外存储空间(需要保存额外索引结构)
  2. INSERT / UPDATE / DELETE 变慢(需要维护索引)
  3. 索引过多会增加优化器决策与维护成本

注意:表上有索引,不代表 SQL 一定会用索引。比如小表(几百行)全表扫描可能更优。


3. InnoDB 存储引擎(MySQL 默认)

3.1 使用的数据结构

InnoDB 使用 B+Tree 。其存储单位是页(Page) ,默认页大小通常为 16KB,本质是由页组成的多叉树。

  1. 非叶子节点:存储 键值 + 子页指针,用于导航
  2. 叶子节点:存储真正数据项
    • 聚簇索引叶子页:存整行记录
    • 二级索引叶子页:存索引列 + 主键值
  3. 叶子页之间有双向链表:支持范围查询和顺序扫描

3.2 对比其他数据结构

  • B 树 vs B+ 树 :B+ 树是 B 树的改进版本,针对范围查询、ORDER BY、JOIN 等场景更友好。
  • MySQL 常用 B+ 树;MongoDB 常见实现与场景不同,偏文档模型与点查负载,具体取决于引擎实现与业务模式。

3.3 InnoDB 索引模型

  1. 聚簇索引(Clustered Index)

    • 叶子节点存整行数据
    • 表数据本身按该索引组织
    • 可理解为:主键 B+Tree 与数据组织在一起
  2. 二级索引(Secondary Index)

    • 叶子节点存 二级索引列值 + 主键值
    • 不存整行
    • 二级索引查整行时,先拿主键再去聚簇索引取行,这一步叫回表
    • 减少回表通常是优化重点

4. MySQL 常见索引类型

  1. PRIMARY KEY(主键索引)
  2. UNIQUE(唯一索引)
  3. INDEX(普通索引)
  4. 复合索引(联合索引)

5. 常见索引声明样例

sql 复制代码
-- 0) 示例表
CREATE TABLE users (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  email VARCHAR(100) NOT NULL,
  phone VARCHAR(20),
  age INT,
  status TINYINT,
  created_at DATETIME,
  first_name VARCHAR(50),
  last_name VARCHAR(50)
);

-- 1) 主键索引(PRIMARY KEY)
-- 方式A:建表时声明(上面 id 已声明)
-- 方式B:后加主键
ALTER TABLE users ADD PRIMARY KEY (id);

-- 2) 唯一索引(UNIQUE)
-- 单列唯一
CREATE UNIQUE INDEX uk_users_email ON users(email);

-- 联合唯一(例如姓名组合唯一)
CREATE UNIQUE INDEX uk_users_name ON users(first_name, last_name);

-- 3) 普通索引(INDEX)
-- 单列普通索引
CREATE INDEX idx_users_age ON users(age);

-- 4) 联合索引 / 复合索引
-- 常见查询:where status=? and created_at>=? order by created_at desc
CREATE INDEX idx_users_status_created ON users(status, created_at);

-- 5) 删除索引
DROP INDEX idx_users_age ON users;

-- 6) 查看索引
SHOW INDEX FROM users;

6. 小结

本文只讲索引,总结为一下段落:

  • 为什么需要索引
  • 索引优缺点
  • InnoDB 的 B+Tree 与存储结构
  • 聚簇索引与二级索引
  • 常见索引类型与建索引 SQL 样例
相关推荐
云祺vinchin8 分钟前
中小企业备份软件选型从恢复需求到总体成本评估
数据库·数据备份·中小企业备份·容灾备份软件
Zenova EdgeOS28 分钟前
Go 工业边缘错误处理实战:用 errors 构建可追溯错误链
开发语言·数据库·golang
KKKlucifer31 分钟前
国内数据安全服务的产品智能化转型:大模型赋能下的技术能力重构分析
大数据·数据库·重构
字节跳动开源1 小时前
OpenViking 上线原生 3D 内容理解模型
数据库·开源
CCIE-Yasuo4 小时前
网络安全-学习数据库-Mysql-2
数据库·学习·mysql
这个DBA有点耶4 小时前
内核级AI与多模融合:AI数据库在海外场景的落地要点
数据库·人工智能·架构
涛思数据(TDengine)4 小时前
从工业本体到 AI 原生:TDengine 出席 2026 QCon 分享工业数据基础设施路径
大数据·数据库·人工智能·tdengine·工业
Jesse_EC4 小时前
换乘次数最少的路径 SQL 查询详解与实战经验——从 WITH RECURSIVE 到 pgRouting
数据库·postgresql
工控丫丫4 小时前
帆软看板中经常使用的公式函数及经常搭的组合
前端·javascript·数据库
这个DBA有点耶5 小时前
云数据库半夜卡顿,CPU才30%?深挖云盘IOPS突发限制与内核挂起机制
数据库·mysql·云原生