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 BYJOIN 等场景更友好。
  • 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 样例
相关推荐
发际线还在1 小时前
互联网大厂Java三轮面试全流程实战问答与解析
java·数据库·分布式·面试·并发·系统设计·大厂
小王不爱笑1321 小时前
MyBatis 执行流程源码级深度解析:从 Mapper 接口到 SQL 执行的全链路逻辑
数据库·sql·mybatis
Seven971 小时前
MySQL语句执行深度剖析:从连接到执行的全过程
mysql
山峰哥2 小时前
SQL优化实战:从索引策略到执行计划的极致突破
数据库·sql·性能优化·编辑器·深度优先
总要冲动一次2 小时前
离线安装 percona-xtrabackup-24
linux·数据库·mysql·centos
lcrml3 小时前
nacos2.3.0 接入pgsql或其他数据库
数据库
阿达_优阅达3 小时前
告别手工对账:xSuite 如何帮助 SAP 企业实现财务全流程自动化?
服务器·数据库·人工智能·自动化·sap·企业数字化转型·xsuite
IvorySQL3 小时前
IvorySQL v5 发布后,我们想听听大家的使用体验
数据库·postgresql·开源
Maverick063 小时前
01- Oracle核心架构:理解数据库如何运转
数据库·oracle·架构
TDengine (老段)3 小时前
TDengine IDMP 组态面板 —— 画布
大数据·数据库·物联网·时序数据库·tdengine·涛思数据