什么是索引_mysql索引基础概念

索引是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 BYGROUP BY 的列,可避免临时文件排序。
  • 作为 JOIN 关联条件的外键列。
  • 数据量大(比如 >1 万行)、查询频次远高于修改频次的表。