MySQL索引是数据库中用于提升数据检索速度的重要机制。合理使用索引可以显著提高查询效率,但也可能增加写操作的开销。下面介绍常见的索引类型及其作用。
1. 普通索引(INDEX)
作用:最基本的索引类型,用于加快数据查询速度,不保证字段的唯一性。
适合用在经常出现在WHERE、JOIN或ORDER BY条件中的列上。
创建方式:CREATE INDEX idx_name ON table(column); 可重复值,无约束限制2. 唯一索引(UNIQUE INDEX)
作用:确保索引列中的值是唯一的,允许有一个NULL值。
常用于防止数据重复,比如邮箱、身份证号等需要唯一性的字段。
创建方式:CREATE UNIQUE INDEX idx_email ON users(email); 插入重复值会报错3. 主键索引(PRIMARY KEY)
作用:一种特殊的唯一索引,不允许NULL值,每张表只能有一个主键。
用于唯一标识表中的每一行记录,通常自动创建聚簇索引(InnoDB引擎)。
定义主键时自动创建索引 强烈建议每个表都设置主键4. 聚簇索引(Clustered Index)
作用:决定数据在磁盘上的物理存储顺序,InnoDB通过主键构建聚簇索引。
查询时直接读取数据页,效率高。如果没有显式定义主键,InnoDB会选择第一个非空唯一索引,否则自动生成隐藏的ROWID。
一张表只有一个聚簇索引 范围查询和排序性能较好5. 非聚簇索引(Secondary Index / 辅助索引)
作用:索引结构中保存的是主键值,查到索引后需回表查找完整数据。
适用于非主键字段的查询,如状态、类别等常用筛选字段。
也叫二级索引 查询需要“回表”操作6. 覆盖索引(Covering Index)
作用:查询所需字段全部包含在索引中,无需回表,提升性能。
例如对(name, age)建联合索引,查询SELECT name, age FROM users WHERE name='Tom' 可直接从索引获取数据。
减少I/O操作 推荐在高频查询中使用7. 联合索引(Composite Index)
作用:多个字段组合成一个索引,遵循最左前缀匹配原则。
例如对(a,b,c)建联合索引,则(a)、(a,b)、(a,b,c)能命中,但(b)、(c)不能。
注意字段顺序 避免冗余单列索引8. 全文索引(FULLTEXT)
作用:用于大文本字段(如文章内容)的关键词搜索,支持自然语言和布尔模式。
适用于LIKE无法满足的复杂文本检索场景。
MyISAM和InnoDB都支持(MySQL 5.6+) 使用MATCH() ... AGAINST()语法查询9. 空间索引(SPATIAL)
作用:用于地理空间数据类型(如POINT、GEOMETRY),支持空间关系查询。
仅MyISAM和InnoDB支持 常用于地图类应用基本上就这些常见索引类型。选择合适的索引能极大提升查询性能,但也要注意不要过度创建,因为索引会占用存储空间并影响INSERT、UPDATE、DELETE的速度。
