mysql有哪些索引类型,是数据库开发、运维人员做查询优化时必须掌握的基础内容,InnoDB引擎下可按数据结构、字段数量、字段唯一性、存储方式划分出主键索引、普通索引、唯一索引、组合索引、全文索引、空间索引等类别,不同索引在查询加速、写入开销、占用空间、适用查询语句上差异明显,你需要结合where过滤、排序、分组、联表查询的实际SQL特征选型,该分类体系对应MySQL官方参考手册MySQL8.0ReferenceManual中的索引章节定义,边界限制为:MyISAM引擎支持的索引能力和InnoDB不完全一致,例如MyISAM主键是非聚簇索引,如果你使用MyISAM,不能直接套用InnoDB聚簇索引的相关结论。
mysql有哪些索引类型:按核心维度分类
主键索引属于聚簇索引,InnoDB会把整张表的数据行按照主键的值组织成B+树,叶子节点直接存储完整行数据,一张InnoDB表只能拥有一个主键索引,建表时如果没有显式指定主键,InnoDB会优先选择非空唯一索引作为聚簇索引,都不存在时自动生成隐藏的ROWID作为聚簇索引,主键索引适合等值查询、范围查询,定位数据时不需要二次回表。
普通索引也叫二级索引,基于B+树实现,叶子节点存储主键值,查询命中普通索引后,如果需要的字段不在索引内,就要执行回表,也就是拿着索引里的主键值再去聚簇索引读取完整行,普通索引不强制字段唯一,允许重复值、NULL值,适合高频where条件过滤场景。
唯一索引同样是B+树二级索引,核心约束是索引列的值不能重复,允许多个NULL,数据库写入时会自动校验唯一性,除了加速查询,还承担数据完整性约束,业务上手机号、订单编号这类天然唯一的字段,适合创建唯一索引,它的写入校验开销略高于普通索引。
组合索引也叫联合索引,把多个字段合并建立在同一棵B+树,遵循最左前缀匹配原则,也就是查询条件必须从索引最左侧字段开始依次匹配,才能有效命中索引,比如索引(a,b,c),wherea=1可以命中,whereb=2无法直接命中,适合多字段联合过滤、排序的SQL。
全文索引基于倒排索引结构,用于文本内容的关键词检索,适合长文本字段的模糊匹配,替代like%keyword%这类无法走B+树索引的查询,MySQL8.0支持InnoDB引擎创建全文索引;空间索引针对几何类型数据,用于GIS地理空间查询,基于R树结构,适合经纬度、几何图形检索业务。
| 索引类型 | 底层结构 | 核心特点 | 典型适用场景 |
|---|---|---|---|
| 主键索引 | B+树聚簇索引 | 叶子存完整行,单表唯一 | 主键等值、范围查询 |
| 普通索引 | B+树二级索引 | 叶子存主键,允许重复值 | 常规where过滤 |
| 唯一索引 | B+树二级索引 | 值不可重复,带唯一性约束 | 唯一业务字段校验+查询加速 |
| 组合索引 | B+树二级索引 | 多字段联合,遵守最左前缀 | 多条件联合查询、排序分组 |
| 全文索引 | 倒排索引 | 文本关键词检索 | 长文本内容搜索 |
| 空间索引 | R树 | 几何数据检索 | GIS空间位置查询 |
mysql有哪些索引类型:选型与使用要点
你在选型时要权衡写入代价,每新增一类索引,insert、update、delete操作都需要同步维护对应的B+树,索引数量过多会拖慢写操作,占用额外磁盘空间,不要给低区分度字段建索引,比如性别这类只有少量取值的字段,索引过滤收益很低。
覆盖索引是组合索引延伸的实用思路,当索引已经包含SQL需要查询的全部字段,就不需要回表,能大幅降低查询IO,你可以通过explain执行计划,查看Extra字段是否出现Usingindex,判断是否命中覆盖索引。
索引不是越多越好。
需要区分InnoDB和其他引擎的差异,MyISAM所有索引都是非聚簇索引,主键索引叶子节点存储数据行的物理地址,和InnoDB聚簇索引机制不同,如果你迁移表引擎,原有索引的查询行为会发生变化,建议迁移后重新执行explain校验执行计划,避免原有优化方案失效。