2020-09-29 08:31:29
MySQL数据库中的索引类型可根据存储结构、逻辑功能及物理存储方式分类,合理选择可显著提升查询性能。具体分类如下:
一、按存储结构分类根据索引底层使用的数据结构划分,常见类型包括:
B-Tree索引
MySQL中最常用的索引类型,InnoDB和MyISAM存储引擎默认使用B+树结构。
适用场景:全值匹配、范围查询(如>、<、BETWEEN)、排序(ORDER BY)和分组(GROUP BY)操作。
适用字段类型:CHAR、VARCHAR、INT等。
Hash索引
基于哈希表实现,仅支持等值查询(如=、IN),不支持范围查询或排序。
存储引擎支持:Memory存储引擎默认使用Hash索引;InnoDB对自适应哈希索引有内部支持。
Full-Text索引
用于全文搜索,支持文本内容的关键词检索(如MATCH AGAINST)。
版本支持:MyISAM早期支持,InnoDB从MySQL 5.6版本开始支持。
适用字段类型:CHAR、VARCHAR和TEXT类型。
R-Tree索引
用于空间数据类型(如GEOMETRY),支持地理坐标、多边形等空间数据的快速检索。
典型应用:GIS(地理信息系统)场景,如查询某区域内的所有点。
从应用层面定义索引的作用,开发者在建表时可明确指定:
普通索引(Index)
最基本的索引类型,允许重复值和NULL值,无任何限制。
创建语法:CREATE INDEX idx_name ON table_name(column_name);
唯一索引(Unique Index)
要求索引列的值必须唯一,但允许有NULL值(仅一个NULL可存在,视具体引擎而定)。
创建语法:CREATE UNIQUE INDEX idx_name ON table_name(column_name);
主键索引(Primary Key)
特殊的唯一索引,不允许NULL值。每张表只能有一个主键。
特点:InnoDB会自动为主键创建聚簇索引。
创建语法:CREATE TABLE table_name (id INT PRIMARY KEY, ...);
组合索引(Composite Index)
在多个列上建立的索引,遵循最左前缀原则。
示例:在(A, B, C)上建索引,则A、(A,B)、(A,B,C)查询可用,但单独B或C不可用。
优化建议:将高频查询条件放在组合索引左侧。
外键索引(Foreign Key)
用于维护表间引用完整性,通常需手动在关联字段上创建索引以提高性能。
示例:订单表中的user_id字段关联用户表,可创建外键索引加速关联查询。
根据索引记录与数据行的组织方式划分:
聚簇索引(Clustered Index)
数据行按索引顺序物理存储。InnoDB表必须有聚簇索引,默认为主键;若无主键则选第一个唯一非空索引,否则自动生成隐藏ROWID作为聚簇索引。
特点:
查询效率高(无需回表),但插入和更新可能因数据重组产生开销。
每张表仅有一个聚簇索引。
二级索引(Secondary Index)
也叫非聚簇索引,索引中保存的是主键值而非数据行地址。通过二级索引查找需回表查询主键对应的数据行。
适用场景:非主键字段的查询优化。
示例:在用户表的username字段上建二级索引,查询时需先通过索引找到主键,再回表获取完整数据。
根据查询需求:
范围查询、排序优先选B-Tree索引;等值查询可考虑Hash索引。
全文搜索需使用Full-Text索引;空间数据查询需R-Tree索引。
根据数据唯一性:
需要唯一约束时选唯一索引或主键索引;允许重复值时用普通索引。
避免过度索引:
索引会占用存储空间并影响写入性能(如INSERT、UPDATE),需权衡读写比例。
组合索引优化:
遵循最左前缀原则,将高频查询条件放在左侧,减少索引冗余。
通过合理选择索引类型,可显著提升MySQL的查询性能,同时避免不必要的资源消耗。