下面详细介绍MongoDB的索引类型,包括它们的特点、适用场景、创建方法和示例查询,最后附上总结表格。
1. B树索引(B-Tree Index)
特点:
- 数据结构:B树(Balanced Tree),适合范围查询、排序和等值查询。
- 查询性能:对范围查询、排序、前缀匹配和等值查询都有良好的性能。
- 支持:等值查询(
=
)、范围查询(<
,>
,<=
,>=
)、排序、前缀查询(^
)。
适用场景:
- 适用于大多数查询,包括范围查询和排序。
- 适用于需要高效执行范围查询、排序和前缀匹配的场景。
创建方法:
db.collection.createIndex({ fieldName: 1 }); // 升序
db.collection.createIndex({ fieldName: -1 }); // 降序
2. 哈希索引(Hashed Index)
特点:
- 数据结构:哈希表,通过哈希函数映射字段值。
- 查询性能:高效的等值查询(时间复杂度为O(1)),不支持范围查询。
适用场景:
- 适用于高效的等值查询。
- 不适用于范围查询和排序。
创建方法:
db.collection.createIndex({ fieldName: "hashed" });
3. 全文索引(Full-Text Index)
特点:
- 数据结构:倒排索引,用于处理文本搜索。
- 查询性能:高效的文本搜索,支持复杂的查询条件和权重排序。
- 功能:支持全文搜索、文本匹配、查询词的排序等。
适用场景:
- 适用于需要执行复杂文本搜索的场景,如搜索引擎。
创建方法:
db.collection.createIndex({ fieldName: "text" });
示例查询:
db.collection.find({ $text: { $search: "keyword" } });
4. 地理空间索引(Geospatial Index)
特点:
- 数据结构:用于地理位置数据的索引。
- 查询性能:支持位置范围查询、地理空间数据的查询。
适用场景:
- 适用于需要处理地理位置数据的应用,如地图和位置服务。
创建方法:
db.collection.createIndex({ location: "2dsphere" }); // 用于经纬度数据
db.collection.createIndex({ location: "2d" }); // 用于平面坐标数据
示例查询:
db.collection.find({ location: { $near: { $geometry: { type: "Point", coordinates: [longitude, latitude] }, $maxDistance: 5000 } } });
5. 多键索引(Multikey Index)
特点:
- 数据结构:对数组中的每个元素进行索引。
- 查询性能:对数组字段中的每个元素进行索引,支持对数组字段的查询。
适用场景:
- 适用于存储数组数据,并对数组中的每个元素进行查询的场景。
创建方法:
db.collection.createIndex({ arrayField: 1 });
示例查询:
db.collection.find({ arrayField: 2 });
6. 复合索引(Compound Index)
特点:
- 数据结构:对多个字段创建的索引。
- 查询性能:优化对多个字段的查询,支持排序和等值查询。
适用场景:
- 适用于涉及多个字段的查询操作,如复合查询、排序和筛选。
创建方法:
db.collection.createIndex({ field1: 1, field2: -1 });
示例查询:
db.collection.find({ field1: value1, field2: value2 });
7. 唯一索引(Unique Index)
特点:
- 数据结构:保证索引字段的值唯一。
- 查询性能:可以用于确保数据的一致性和完整性。
适用场景:
- 适用于需要唯一值的字段,如用户名、电子邮件等。
创建方法:
db.collection.createIndex({ fieldName: 1 }, { unique: true });
8. 部分索引(Partial Index)
特点:
- 数据结构:只对符合特定条件的文档创建索引。
- 查询性能:可以优化特定条件下的查询。
适用场景:
- 适用于只需要对集合中部分数据创建索引的场景。
创建方法:
db.collection.createIndex(
{ fieldName: 1 },
{ partialFilterExpression: { fieldName: { $exists: true } } }
);
9. 稀疏索引(Sparse Index)
特点:
- 数据结构:只为那些包含索引字段的文档创建索引。
- 查询性能:节省空间,减少索引的大小。
适用场景:
- 适用于字段可能在某些文档中缺失的情况。
创建方法:
db.collection.createIndex({ fieldName: 1 }, { sparse: true });
11. 聚合索引(Aggregation Index)
特点:
- 数据结构:适用于聚合操作的索引。
- 查询性能:可以优化聚合管道的性能。
适用场景:
- 适用于需要高效进行聚合操作的场景。
创建方法:
- 聚合索引不是一个特定的索引类型,而是通过创建复合索引来支持聚合操作。
db.collection.createIndex({ field1: 1, field2: -1 });
总结表
索引类型 | 适用场景 | 支持的查询类型 | 主要特点 |
---|---|---|---|
B树索引 | 大多数查询场景,包括范围查询和排序 | 等值查询、范围查询、排序、前缀匹配 | 适用于大多数查询类型 |
哈希索引 | 高效的等值查询 | 等值查询 | 不支持范围查询 |
全文索引 | 复杂的文本搜索 | 全文搜索、文本匹配 | 适用于文本搜索和权重排序 |
地理空间索引 | 地理位置数据的处理 | 地理空间数据查询 | 支持位置范围查询 |
多键索引 | 数组字段的查询 | 对数组中的每个元素进行索引 | 处理数组数据 |
复合索引 | 涉及多个字段的查询操作 | 多字段组合查询、排序 | 适用于复杂的查询需求 |
唯一索引 | 保证字段值唯一 | 等值查询 | 数据唯一性保障 |
部分索引 | 仅对符合条件的文档创建索引 | 针对特定条件的查询 | 节省空间、优化性能 |
稀疏索引 | 字段可能在某些文档中缺失 | 存在性查询、部分文档索引 | 节省空间 |
TTL 索引 | 自动过期的数据管理 | 数据过期管理 | 自动删除过期文档 |
聚合索引 | 聚合操作的优化 | 聚合管道优化 | 通过复合索引优化聚合操作 |
这些索引类型可以根据你的具体需求选择和配置,以优化 MongoDB 数据库的性能和查询效率。