简述MongoDB索引类型 ?

参考回答

MongoDB 提供了多种类型的索引,用于优化不同场景的查询性能。主要的索引类型包括:

  1. 单字段索引:针对单个字段创建的索引,最基础、常用的索引类型。
  2. 复合索引:在多个字段上创建的索引,用于优化多字段查询。
  3. 多键索引:针对数组字段的索引,为数组中每个元素创建单独的索引。
  4. 全文索引:用于文本搜索,支持复杂的字符串匹配。
  5. 地理空间索引:支持地理位置查询,比如附近地点搜索。
  6. 哈希索引:使用字段的哈希值创建索引,适合等值查询。
  7. TTL 索引:用于设置文档的过期时间,自动清理旧数据。

合理选择和设计索引类型可以显著提高查询性能。


详细讲解与拓展

1. 单字段索引

  • 针对单个字段创建的索引,用于优化单字段查询或排序。
  • 语法
    db.collection.createIndex({ field: 1 }) // 升序索引
    db.collection.createIndex({ field: -1 }) // 降序索引
    
    JavaScript
  • 例子:对 age 字段创建索引:
    db.users.createIndex({ age: 1 })
    
    JavaScript

2. 复合索引

  • 在多个字段上创建的索引,用于优化涉及多个字段的查询。
  • 查询时必须满足前缀规则,即查询条件应包含索引字段的前缀。
  • 语法
    db.collection.createIndex({ field1: 1, field2: -1 })
    
    JavaScript
  • 例子:对 nameage 字段创建索引:
    db.users.createIndex({ name: 1, age: -1 })
    
    JavaScript

3. 多键索引

  • 针对数组字段的索引,数组中每个元素都会单独创建索引。
  • 适用于查询数组字段中包含特定值的场景。
  • 语法
    db.collection.createIndex({ arrayField: 1 })
    
    JavaScript
  • 例子:对 tags 数组字段创建索引:
    db.products.createIndex({ tags: 1 })
    
    JavaScript

    查询 `tags` 包含 `”mongodb”` 的文档:

    db.products.find({ tags: "mongodb" })
    
    JavaScript

4. 全文索引

  • 用于文本搜索,支持复杂的字符串匹配和多语言搜索。
  • 语法
    db.collection.createIndex({ field: "text" })
    
    JavaScript
  • 例子:对 description 字段创建全文索引:
    db.articles.createIndex({ description: "text" })
    
    JavaScript

    查询包含 `”mongodb”` 的文档:

    db.articles.find({ text: {search: "mongodb" } })
    
    JavaScript

5. 地理空间索引

  • 用于地理位置数据查询,比如附近地点搜索。
  • 支持两种类型的地理空间索引:
    • 2d 索引:支持平面地理数据。
    • 2dsphere 索引:支持球面地理数据(更精确)。
  • 语法
    db.collection.createIndex({ location: "2dsphere" })
    
    JavaScript
  • 例子:存储地理位置并查询附近点:
    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
          }
      }
    })
    
    JavaScript

6. 哈希索引

  • 使用字段的哈希值创建索引,适合用于等值查询。
  • 语法
    db.collection.createIndex({ field: "hashed" })
    
    JavaScript
  • 例子:对 userId 字段创建哈希索引:
    db.users.createIndex({ userId: "hashed" })
    
    JavaScript

7. TTL 索引

  • Time-To-Live 索引,用于设置文档的过期时间,适合存储临时数据。
  • 语法
    db.collection.createIndex({ field: 1 }, { expireAfterSeconds: <seconds> })
    
    JavaScript
  • 例子:对 createdAt 字段创建 TTL 索引,使文档在 10 分钟后过期:
    db.sessions.createIndex({ createdAt: 1 }, { expireAfterSeconds: 600 })
    
    JavaScript

索引优化建议

  1. 选择合适的索引类型:根据查询模式选择单字段索引、复合索引或其他特殊索引。
  2. 避免过多索引:索引会占用额外的存储空间,并影响写入性能。
  3. 使用索引覆盖查询:将查询字段和返回字段包含在索引中,避免访问文档。
  4. 定期监控索引使用情况:通过 explain 方法检查索引是否被正确使用。

总结

MongoDB 提供了多种索引类型,包括单字段索引、复合索引、多键索引、全文索引、地理空间索引、哈希索引和 TTL 索引。每种索引都有特定的应用场景和适用条件。在实际开发中,合理选择和设计索引类型,可以显著提升查询性能,同时平衡系统的存储和写入开销。

发表评论

后才能评论