简述MongoDB索引类型 ?
参考回答
MongoDB 提供了多种类型的索引,用于优化不同场景的查询性能。主要的索引类型包括:
- 单字段索引:针对单个字段创建的索引,最基础、常用的索引类型。
- 复合索引:在多个字段上创建的索引,用于优化多字段查询。
- 多键索引:针对数组字段的索引,为数组中每个元素创建单独的索引。
- 全文索引:用于文本搜索,支持复杂的字符串匹配。
- 地理空间索引:支持地理位置查询,比如附近地点搜索。
- 哈希索引:使用字段的哈希值创建索引,适合等值查询。
- TTL 索引:用于设置文档的过期时间,自动清理旧数据。
合理选择和设计索引类型可以显著提高查询性能。
详细讲解与拓展
1. 单字段索引
- 针对单个字段创建的索引,用于优化单字段查询或排序。
- 语法:
db.collection.createIndex({ field: 1 }) // 升序索引 db.collection.createIndex({ field: -1 }) // 降序索引 - 例子:对
age字段创建索引:db.users.createIndex({ age: 1 })
2. 复合索引
- 在多个字段上创建的索引,用于优化涉及多个字段的查询。
- 查询时必须满足前缀规则,即查询条件应包含索引字段的前缀。
- 语法:
db.collection.createIndex({ field1: 1, field2: -1 }) - 例子:对
name和age字段创建索引:db.users.createIndex({ name: 1, age: -1 })
3. 多键索引
- 针对数组字段的索引,数组中每个元素都会单独创建索引。
- 适用于查询数组字段中包含特定值的场景。
- 语法:
db.collection.createIndex({ arrayField: 1 }) - 例子:对
tags数组字段创建索引:db.products.createIndex({ tags: 1 })查询 `tags` 包含 `”mongodb”` 的文档:
db.products.find({ tags: "mongodb" })
4. 全文索引
- 用于文本搜索,支持复杂的字符串匹配和多语言搜索。
- 语法:
db.collection.createIndex({ field: "text" }) - 例子:对
description字段创建全文索引:db.articles.createIndex({ description: "text" })查询包含 `”mongodb”` 的文档:
db.articles.find({ text: {search: "mongodb" } })
5. 地理空间索引
- 用于地理位置数据查询,比如附近地点搜索。
- 支持两种类型的地理空间索引:
- 2d 索引:支持平面地理数据。
- 2dsphere 索引:支持球面地理数据(更精确)。
- 语法:
db.collection.createIndex({ location: "2dsphere" }) - 例子:存储地理位置并查询附近点:
db.places.insert({ name: "Park", location: { type: "Point", coordinates: [40.7128, -74.0060] } }) db.places.createIndex({ location: "2dsphere" }) db.places.find({ location: { near: {geometry: { type: "Point", coordinates: [40.7128, -74.0060] }, $maxDistance: 1000 } } })
6. 哈希索引
- 使用字段的哈希值创建索引,适合用于等值查询。
- 语法:
db.collection.createIndex({ field: "hashed" }) - 例子:对
userId字段创建哈希索引:db.users.createIndex({ userId: "hashed" })
7. TTL 索引
- Time-To-Live 索引,用于设置文档的过期时间,适合存储临时数据。
- 语法:
db.collection.createIndex({ field: 1 }, { expireAfterSeconds: <seconds> }) - 例子:对
createdAt字段创建 TTL 索引,使文档在 10 分钟后过期:db.sessions.createIndex({ createdAt: 1 }, { expireAfterSeconds: 600 })
索引优化建议
- 选择合适的索引类型:根据查询模式选择单字段索引、复合索引或其他特殊索引。
- 避免过多索引:索引会占用额外的存储空间,并影响写入性能。
- 使用索引覆盖查询:将查询字段和返回字段包含在索引中,避免访问文档。
- 定期监控索引使用情况:通过
explain方法检查索引是否被正确使用。
总结
MongoDB 提供了多种索引类型,包括单字段索引、复合索引、多键索引、全文索引、地理空间索引、哈希索引和 TTL 索引。每种索引都有特定的应用场景和适用条件。在实际开发中,合理选择和设计索引类型,可以显著提升查询性能,同时平衡系统的存储和写入开销。