MySQL 各索引类型(NORMAL、FULLTEXT、SPATIAL、UNIQUE)、索引方法(BTREE、HASH)的区别
MySQL 索引类型与索引方法详解
索引类型
1. NORMAL (普通索引)
- 最基本的索引类型,没有特殊限制
- 仅用于加速查询,不强制唯一性
- 创建语法:CREATE INDEX index_name ON table_name(column_name)
- 适用场景:常用于查询条件中的列,但不需要唯一性约束
2. UNIQUE (唯一索引)
- 与普通索引类似,但要求索引列的值必须唯一
- 允许NULL值(但NULL可以出现多次,因为NULL不等于NULL)
- 创建语法:CREATE UNIQUE INDEX index_name ON table_name(column_name)
- 适用场景:需要确保数据唯一性的列,如用户名、邮箱等
3. FULLTEXT (全文索引)
- 专门用于全文搜索的索引类型
- 仅适用于MyISAM和InnoDB存储引擎(MySQL 5.6+)
- 只能创建在CHAR、VARCHAR或TEXT类型的列上
- 使用特殊的全文搜索语法:MATCH(column) AGAINST('keyword')
- 创建语法:CREATE FULLTEXT INDEX index_name ON table_name(column_name)
- 适用场景:文章内容搜索、产品描述搜索等文本搜索需求
4. SPATIAL (空间索引)
- 用于地理空间数据类型(GEOMETRY, POINT, LINESTRING, POLYGON等)
- 仅适用于MyISAM存储引擎(MySQL 5.7+的InnoDB也支持)
- 使用R-Tree数据结构
- 创建语法:CREATE SPATIAL INDEX index_name ON table_name(column_name)
- 适用场景:地理位置查询、地图应用等
索引方法(索引实现方式)
1. BTREE
- 默认的索引方法,使用B+树数据结构
- 支持范围查询(>, <, BETWEEN等)
- 支持排序(ORDER BY)
- 支持最左前缀匹配(对于复合索引)
- 几乎所有存储引擎都支持BTREE索引
- 适用场景:绝大多数常规查询场景
2. HASH
- 使用哈希表数据结构
- 仅支持等值查询(=, <=>),不支持范围查询
- 查询速度非常快(O(1)时间复杂度)
- 仅Memory/Heap存储引擎显式支持HASH索引
- InnoDB有自适应的哈希索引,但用户无法直接创建
- 适用场景:等值查询且数据不经常变更的场景
对比总结
| 特性 | BTREE | HASH | 
|---|---|---|
| 查询类型支持 | 等值、范围、排序 | 仅等值查询 | 
| 查询复杂度 | O(log n) | O(1) | 
| 存储引擎支持 | 几乎所有引擎 | 主要Memory/Heap引擎 | 
| 内存使用 | 中等 | 较高 | 
| 适用场景 | 通用场景 | 精确匹配查询场景 | 
使用建议
- 大多数情况下使用默认的BTREE索引即可
- 需要唯一约束时使用UNIQUE索引
- 全文搜索需求使用FULLTEXT索引(考虑使用专业的搜索引擎如Elasticsearch可能更好)
- 地理位置应用使用SPATIAL索引
- HASH索引仅在Memory引擎且明确只需要等值查询时使用
- 复合索引注意最左前缀原则
示例代码
-- 普通BTREE索引
CREATE INDEX idx_name ON users(name);
-- 唯一索引
CREATE UNIQUE INDEX idx_email ON users(email);
-- 全文索引
CREATE FULLTEXT INDEX idx_content ON articles(content);
-- 空间索引
CREATE SPATIAL INDEX idx_location ON maps(geom);
-- Memory引擎的HASH索引
CREATE TABLE memory_table (
    id INT,
    name VARCHAR(100),
    INDEX USING HASH (name)
) ENGINE=MEMORY;
本文来自博客园,作者:VipSoft 转载请注明原文链接:https://www.cnblogs.com/vipsoft/p/18961420
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号