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自动创建:对频繁访问的索引页动态构建哈希索引(加速等值查询)。

发表评论
所有评论