MySQL 的索引类型及其区别
索引(Index)是 MySQL 提高查询速度的关键机制,它类似于书籍的目录,可以加速数据的查找和排序。
在 MySQL 中,索引有不同的类型,根据数据结构、存储方式和功能进行分类。
1. 按照数据结构分类
索引类型 | 说明 | 适用存储引擎 |
---|---|---|
B+树索引(B-Tree Index) | 默认索引,适用于大部分查询 | InnoDB, MyISAM |
哈希索引(Hash Index) | 仅支持等值查询,不支持范围查询 | Memory |
全文索引(Fulltext Index) | 适用于全文搜索(文本查询) | MyISAM, InnoDB(MySQL 5.6+) |
R-Tree(空间索引) | 适用于地理位置(GIS)查询 | MyISAM |
2. 按照索引功能分类
索引类型 | 说明 | 适用场景 |
---|---|---|
主键索引(Primary Key Index) | 只能有一个,唯一且不能为空 | 唯一标识数据行 |
唯一索引(Unique Index) | 约束列值唯一,允许 NULL | 确保数据不重复 |
普通索引(Index) | 普通加速查询的索引 | 频繁查询的列 |
复合索引(Composite Index) | 多列联合索引,按左前缀法则匹配 | 组合查询 |
覆盖索引(Covering Index) | 索引列包含所有查询字段,避免回表 | 提高查询速度 |
前缀索引(Prefix Index) | 对长文本字段取前 N 个字符建立索引 | 适用于 TEXT 和 VARCHAR |
空间索引(Spatial Index) | 用于地理数据(GIS)查询 | POINT 、POLYGON 类型 |
全文索引(Fulltext Index) | 用于全文搜索 | 适用于大文本字段 |
3. 各种索引的详细介绍
(1)B+ 树索引(B-Tree Index)
- 结构:基于 B+ 树 组织,所有索引数据都存储在叶子节点。
- 特点:
- 适用于范围查询(BETWEEN、>、<)和排序(ORDER BY)
- 支持模糊匹配
LIKE 'abc%'
(前缀匹配) - 不支持
LIKE '%abc'
(后缀匹配)
- 适用存储引擎:InnoDB、MyISAM(默认索引)
示例:
CREATE INDEX idx_name ON employees(name);
适用查询:
SELECT * FROM employees WHERE name = 'Alice'; -- 精确查询
SELECT * FROM employees WHERE name LIKE 'Al%'; -- 前缀查询
(2)哈希索引(Hash Index)
- 结构:基于哈希表(Key-Value 映射)。
- 特点:
- 仅支持等值查询(=),不支持范围查询(BETWEEN、ORDER BY)
- 速度比 B+ 树索引快,但不适合排序和模糊匹配。
- 适用存储引擎:Memory
示例:
CREATE TABLE cache (
id INT PRIMARY KEY,
value VARCHAR(255)
) ENGINE=MEMORY;
适用查询:
SELECT * FROM cache WHERE id = 10; -- 适用于等值查询
不适用于:
SELECT * FROM cache WHERE id > 10; -- ❌ 无法使用哈希索引
(3)全文索引(Fulltext Index)
- 适用于:全文搜索,如 搜索引擎、新闻、博客等文本查询
- 支持存储引擎:
- MyISAM(MySQL 5.5+)
- InnoDB(MySQL 5.6+)
示例:
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
content TEXT,
FULLTEXT(title, content)
) ENGINE=InnoDB;
适用查询(使用 MATCH ... AGAINST
):
SELECT * FROM articles WHERE MATCH(title, content) AGAINST('MySQL 索引');
(4)主键索引(Primary Key Index)
- 特点:
- 不能为空(
NOT NULL
) - 只能有一个主键索引
- InnoDB 存储引擎使用
B+树
聚簇索引(Clustered Index)
- 不能为空(
- 适用场景:唯一标识数据行,如
id
字段
示例:
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
) ENGINE=InnoDB;
(5)唯一索引(Unique Index)
- 特点:
- 保证字段的值唯一,但允许
NULL
(多个NULL
值不冲突)
- 保证字段的值唯一,但允许
- 适用场景:邮箱、用户名等字段
示例:
CREATE UNIQUE INDEX idx_email ON users(email);
(6)普通索引(Index)
- 特点:
- 仅用于加速查询,没有唯一性约束
- 适用场景:
- 经常被
WHERE
查询的列
- 经常被
示例:
CREATE INDEX idx_name ON employees(name);
(7)复合索引(Composite Index)
- 特点:
- 多列联合索引,遵循“最左前缀原则”
- 适用场景:
- 查询涉及多个列,如
(name, age)
- 查询涉及多个列,如
示例:
CREATE INDEX idx_name_age ON employees(name, age);
查询优化:
SELECT * FROM employees WHERE name = 'Alice'; -- ✅ 可用索引
SELECT * FROM employees WHERE name = 'Alice' AND age = 30; -- ✅ 可用索引
SELECT * FROM employees WHERE age = 30; -- ❌ 无法使用索引
(8)覆盖索引(Covering Index)
- 特点:
- 查询列全部包含在索引中,避免回表查询
- 适用场景:
SELECT
查询只需要读取索引列,无需读取数据行
示例:
CREATE INDEX idx_name_age ON employees(name, age);
SELECT name, age FROM employees WHERE name = 'Alice'; -- 覆盖索引
(9)前缀索引(Prefix Index)
- 特点:
- 适用于
TEXT
、VARCHAR
长字段 - 索引前 N 个字符,节省索引空间
- 适用于
- 适用场景:
- 大文本字段索引,如
email
- 大文本字段索引,如
示例:
CREATE INDEX idx_email ON users(email(10));
总结
索引类型 | 适用查询 | 适用存储引擎 |
---|---|---|
B+ 树索引 | 范围查询、排序、LIKE 'abc%' | InnoDB, MyISAM |
哈希索引 | 等值查询 = | Memory |
全文索引 | 文本搜索 | InnoDB, MyISAM |
主键索引 | 唯一标识 | InnoDB |
唯一索引 | 唯一约束 | InnoDB, MyISAM |
复合索引 | 多字段查询 | InnoDB, MyISAM |
前缀索引 | 长字符串查询 | InnoDB, MyISAM |
在实际开发中,合理选择索引类型可以显著提升查询性能 🚀!