mysql索引分类
MySQL索引可以从数据结构、物理存储和逻辑功能三个维度进行分类。以下是详细的分类说明:
一、按数据结构分类(核心分类)
B+Tree索引
适用引擎:InnoDB、MyISAM(默认索引类型)
特点:
多路平衡搜索树,支持高效的范围查询(
>
、<
、BETWEEN
)和排序(ORDER BY
)。所有数据存储在叶子节点,非叶子节点只存键值(减少I/O)。
叶子节点通过指针形成链表,便于顺序扫描。
CREATE INDEX idx_name ON users(name);
Hash索引
适用引擎:Memory引擎(InnoDB支持自适应哈希索引,但用户无法显式创建)。
特点:
基于哈希表实现,仅支持精确等值查询(
=
、IN
)。不支持范围查询或排序(哈希值无序)。
查询复杂度接近O(1),但哈希冲突会影响性能。
CREATE TABLE memory_table (...) ENGINE=MEMORY;
Full-Text索引(全文索引)
适用引擎:InnoDB(≥5.6)、MyISAM
特点:
用于全文搜索(
MATCH AGAINST
),支持关键词检索。底层使用倒排索引(Inverted Index)结构。
CREATE FULLTEXT INDEX idx_content ON articles(content);
R-Tree索引(空间索引)
适用引擎:MyISAM(InnoDB≥5.7支持)
特点:
用于地理空间数据(
GEOMETRY
类型),支持GIS查询(如ST_Contains()
)。CREATE SPATIAL INDEX idx_location ON maps(coordinates);
二、按物理存储分类(InnoDB特有)
聚簇索引(Clustered Index)
特点:
数据行物理存储顺序与索引键值顺序一致(索引即数据文件)。
一个表只能有一个聚簇索引(通常为主键)。
范围查询效率高(相邻数据物理连续)。
生成规则:
若定义了主键,则主键为聚簇索引。
若无主键,则选第一个
UNIQUE NOT NULL
列。两者皆无,则隐式生成6字节
ROWID
作为聚簇索引非聚簇索引(Secondary Index / 辅助索引)
特点:
索引节点仅存储索引列值 + 主键值(非数据行物理地址)。
查询非索引列时需回表(通过主键值到聚簇索引中查找数据)。
三、按逻辑功能分类
主键索引(PRIMARY KEY)
特点:
唯一且非空,表只能有一个主键索引(即聚簇索引)。
自动创建聚簇索引(InnoDB)。
ALTER TABLE users ADD PRIMARY KEY (id);
唯一索引(UNIQUE)
特点:
索引列值必须唯一(允许
NULL
,但NULL
可重复)。避免数据重复,非聚簇索引(除非被用作聚簇索引)。
CREATE UNIQUE INDEX idx_email ON users(email);
普通索引(INDEX / KEY)
特点:
无唯一性约束,仅加速查询。
最基础的B+Tree索引类型。
CREATE INDEX idx_age ON users(age);
联合索引(Composite Index)
特点:
基于多个列创建的索引(最多16列)。
遵循最左前缀原则(查询条件需包含最左列)。
CREATE INDEX idx_name_age ON users(name, age); -- 有效查询: WHERE name='Alice' / WHERE name='Alice' AND age=30 -- 无效查询: WHERE age=30(跳过最左列name)
前缀索引(Prefix Index)
特点:
对文本列前
N
个字符创建索引(节约空间)。牺牲部分选择性(可能增加冲突)。
CREATE INDEX idx_city_prefix ON users(city(10)); -- 仅索引前10字
四、其他特殊索引
覆盖索引(Covering Index)
逻辑概念:索引包含查询所需的所有列,避免回表。
自适应哈希索引(Adaptive Hash Index)
InnoDB自动创建:对频繁访问的索引页动态构建哈希索引(加速等值查询)。