|
MySQL 索引类型详解 索引是提升查询性能的核心手段。MySQL 支持多种索引类型,适用于不同场景。 1. B+Tree 索引(最常用)- 存储引擎:InnoDB(默认)、MyISAM
- 结构:B+ 树,数据存储在叶子节点,支持范围查询。
- 适用场景:
- 等值查询(=)
- 范围查询(>, <, BETWEEN)
- 排序(ORDER BY)
- 分组(GROUP BY)
示例:
-- 创建普通索引CREATE INDEX idx_name ON user(name);-- 创建联合索引(最左前缀原则)CREATE INDEX idx_name_age ON user(name, age);
✅ InnoDB 的主键索引是聚簇索引(Clustered Index),数据行直接存储在主键 B+ 树的叶子节点。
2. 哈希索引(Hash Index)- 存储引擎:MEMORY(默认)、InnoDB 支持自适应哈希索引
- 结构:哈希表,O(1) 查找
- 优点:等值查询极快
- 缺点:
- 不支持范围查询
- 不支持排序、模糊查询(LIKE 'abc%' 可以,LIKE '%abc' 不行)
- 哈希冲突影响性能
示例:
-- MEMORY 引擎自动使用哈希索引CREATE TABLE temp ( id INT PRIMARY KEY, name VARCHAR(50)) ENGINE=MEMORY;
⚠️ InnoDB 不支持用户创建哈希索引,但会自动为热点数据创建自适应哈希索引(AHI)。
3. 全文索引(Full-Text Index)- 适用场景:文本内容搜索(如文章标题、内容)
- 支持引擎:InnoDB、MyISAM
- 语法:
CREATE FULLTEXT INDEX idx_content ON article(content);-- 查询SELECT * FROM article WHERE MATCH(content) AGAINST('ThinkPHP' IN NATURAL LANGUAGE MODE);
✅ 适合博客、新闻等系统的关键词搜索。
4. 空间索引(R-Tree)- 适用场景:地理空间数据(如经纬度)
- 支持引擎:MyISAM、InnoDB(MySQL 5.7+)
- 类型:POINT, LINESTRING, POLYGON
- 示例:
CREATE TABLE location ( id INT PRIMARY KEY, coord POINT NOT NULL);CREATE SPATIAL INDEX idx_coord ON location(coord);
5. 前缀索引(Prefix Index)- 场景:对长字符串字段(如 VARCHAR(255))只索引前 N 个字符
- 优点:节省空间,加快索引速度
- 缺点:可能降低选择性,影响性能
示例:
-- 只对 email 前 10 个字符建索引CREATE INDEX idx_email ON user(email(10));
🔍 选择性 = DISTINCT(前缀) / 总行数,越高越好。
6. 覆盖索引(Covering Index)- 定义:查询的字段全部包含在索引中,无需回表
- 性能极佳:避免了磁盘 I/O
示例:
-- 联合索引CREATE INDEX idx_name_age_status ON user(name, age, status);-- 查询只用索引字段,无需访问数据行SELECT name, age FROM user WHERE name = '张三' AND age > 20;
✅ “索引即数据”,是优化的高级技巧。
|