索引是MySQL中加速数据查找的数据结构,通过排序列值并记录行位置实现快速定位;它提升查询速度但拖慢写操作、占用空间;常见类型包括主键、唯一、普通、联合和全文索引;应优先为WHERE、ORDER BY、GROUP BY及JOIN字段建立索引。

索引是 MySQL 中一种专门用来加速数据查找的数据结构,本质就像一本书的目录——不翻完整本书,也能快速定位到某一页。
索引是怎么工作的
MySQL 把表中某列(或几列)的值按特定规则排序并保存,同时记录这些值对应数据行的物理位置(比如主键 ID 或磁盘地址)。执行查询时,数据库先查索引找到匹配项的位置,再直接跳过去取数据,避免全表扫描。
例如:
- 对 username 列建了索引,执行
SELECT * FROM users WHERE username = 'alice'时,MySQL 不会逐行比对所有用户名,而是通过索引快速锁定 alice 所在的行。 - 没有索引时,4 万行的表可能要读取全部数据;有索引后,通常只需读几十个索引节点就能定位。
索引不是万能的,它有明确代价
索引提升查询速度,但会拖慢写操作,并占用额外空间:
- 每次 INSERT/UPDATE/DELETE 都要同步更新相关索引,写得越频繁,开销越明显。
- 索引本身需要存储空间,尤其对大字段(如长文本、JSON)建索引,体积可能接近原表。
- 过多索引会让优化器选择困难,反而降低查询计划质量。
常见索引类型和用途
MySQL 默认使用 B+Tree 结构,不同索引类型适用于不同场景:
- 主键索引:自动创建,唯一且非空,InnoDB 中就是聚簇索引,决定数据物理存放顺序。
- 唯一索引:保证列值不重复(允许 NULL),适合邮箱、手机号等业务唯一字段。
- 普通索引:最基础的加速查询索引,无约束,可重复、可为空。
-
联合索引:多列组合成一个索引,如
(age, created_at),遵循最左前缀原则(where age=25 可用,where created_at='2025-01-01' 则不可用)。 - 全文索引:专为文本模糊搜索设计(如 LIKE '%关键词%'),支持自然语言或布尔模式匹配。
什么时候该加索引
不是所有字段都值得建索引。优先考虑:
- 常出现在 WHERE 条件中的字段(尤其是高选择性字段,如用户ID、订单号)。
- 经常用于 ORDER BY 或 GROUP BY 的列,可避免临时文件排序。
- 作为 JOIN 关联条件的外键列。
- 数据量大(比如 >1 万行)、查询频次远高于修改频次的表。










