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 样例
相关推荐
2601_9495936512 小时前
深入解析CANN-acl应用层接口:构建高效的AI应用开发框架
数据库·人工智能
javachen__12 小时前
mysql新老项目版本选择
数据库·mysql
Dxy123931021612 小时前
MySQL如何高效查询表数据量:从基础到进阶的优化指南
数据库·mysql
Dying.Light12 小时前
MySQL相关问题
数据库·mysql
蜡笔小炘13 小时前
LVS -- 利用防火墙标签(FireWall Mark)解决轮询错误
服务器·数据库·lvs
韩立学长13 小时前
基于Springboot泉州旅游攻略平台d5h5zz02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
Re.不晚13 小时前
MySQL进阶之战——索引、事务与锁、高可用架构的三重奏
数据库·mysql·架构
老邓计算机毕设14 小时前
SSM智慧社区信息化服务平台4v5hv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·智慧社区、·信息化平台
麦聪聊数据14 小时前
为何通用堡垒机无法在数据库运维中实现精准风控?
数据库·sql·安全·低代码·架构