分类维度 |
索引类型 |
核心定义 |
支持引擎 |
适用场景 |
关键特点 / 注意事项 |
存储结构 |
聚簇索引(Clustered) |
数据与索引物理存储绑定,索引即数据(索引叶子节点存储完整数据行) |
InnoDB(默认) |
主键查询、高频根据主键 / 聚簇键查询 |
1. 每张表仅 1 个聚簇索引;2. 优先以主键为聚簇键,无主键则选唯一非空列,否则生成隐藏 row_id;3. 主键查询效率极高 |
非聚簇索引(Non-Clustered) |
数据与索引物理分离,索引叶子节点存储数据行指针 / 主键值(间接指向数据) |
MyISAM、InnoDB(二级索引)、Memory |
非主键字段查询(如用户名、手机号查询) |
1. 每张表可多个非聚簇索引;2. 查询需 “回表”(InnoDB)或 “通过指针找数据”(MyISAM);3. 存储开销比聚簇索引小 |
|
约束特性 |
普通索引(Normal) |
无约束限制,仅用于加速查询的基础索引 |
所有支持索引的引擎 |
普通查询场景(如商品分类查询、文章列表查询) |
1. 允许重复值和 NULL;2. 无额外约束逻辑,创建 / 维护成本低 |
唯一索引(Unique) |
索引列值必须唯一(允许 NULL,且 NULL 可多个),兼具约束和加速查询功能 |
InnoDB、MyISAM、Memory |
需保证字段唯一性的场景(如手机号、邮箱、身份证号) |
1. 避免重复数据,插入重复值会报错;2. 查询效率略高于普通索引(索引树更紧凑);3. 主键索引是特殊的唯一索引(不允许 NULL) |
|
主键索引(Primary Key) |
特殊的唯一索引,不允许 NULL,默认作为 InnoDB 的聚簇键 |
所有支持索引的引擎 |
表的唯一标识(如 user_id、order_id) |
1. 每张表仅 1 个主键索引;2. InnoDB 中自动作为聚簇索引,MyISAM 中为普通唯一非聚簇索引;3. 优先用自增 INT/BIGINT 作为主键 |
|
字段数量 |
单列索引(Single-Column) |
仅基于单个字段创建的索引 |
所有支持索引的引擎 |
单字段查询(如按手机号查用户、按状态查订单) |
1. 创建简单、维护成本低;2. 仅能加速该字段的查询条件 |
组合索引(Composite/Multi-Column) |
基于多个字段组合创建的索引(字段顺序影响索引效率) |
InnoDB、MyISAM、Memory |
多字段联合查询(如按 “用户 ID + 订单状态” 查订单、“用户名 + 手机号” 验证) |
1. 遵循 “最左前缀原则”(查询需匹配索引字段顺序);2. 可覆盖部分多字段查询,减少回表;3. 字段顺序建议:高区分度字段在前 |
|
查询功能 |
全文索引(Fulltext) |
针对文本内容的语义检索索引,支持关键词匹配(而非前缀 / 后缀模糊匹配) |
InnoDB(5.6+)、MyISAM |
文章内容搜索、商品描述搜索、评论检索 |
1. 支持 CHAR/VARCHAR/TEXT 字段;2. 忽略短词(默认 < 4 字符);3. 高并发 / 复杂检索建议用 Elasticsearch 替代 |
空间索引(Spatial) |
针对地理空间数据的索引,支持位置关系查询(如距离、包含) |
InnoDB(5.7+)、MyISAM |
附近位置查询(如 “1 公里内餐厅”)、区域筛选 |
1. 支持 POINT/LINESTRING/POLYGON 等空间类型;2. 字段不能为 NULL;3. 需用空间函数(如 ST_Distance_Sphere)查询 |
|
索引结构 |
B + 树索引(B+Tree) |
主流索引结构,所有数据存储在叶子节点,叶子节点按顺序链表连接 |
InnoDB、MyISAM、Memory(可选) |
绝大多数查询场景(等值、范围、排序、分页) |
1. 平衡树结构,查询效率稳定(O (log n));2. 支持范围查询和排序;3. InnoDB/MyISAM 默认索引结构 |
哈希索引(Hash) |
基于哈希表实现,通过字段哈希值快速定位数据,不支持范围查询 |
Memory(默认)、InnoDB(自适应哈希索引,AHI) |
高频等值查询(如缓存表、字典表) |
1. 等值查询极快,范围 / 排序查询失效;2. 不支持模糊匹配;3. InnoDB 的 AHI 为自动开启,不可手动创建 |