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