阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > 索引的创建、查看与删除

索引的创建、查看与删除

作者:陈川 阅读数:5678人阅读 分类: MongoDB

索引的创建

在MongoDB中,索引是提高查询性能的关键。创建索引的基本语法是db.collection.createIndex()。例如,在用户集合上为username字段创建升序索引:

db.users.createIndex({ username: 1 })

复合索引可以包含多个字段,查询时会按照索引字段的顺序进行匹配:

db.orders.createIndex({ customerId: 1, orderDate: -1 })

MongoDB支持多种索引类型:

  • 唯一索引:确保字段值唯一
  • 文本索引:支持文本搜索
  • 地理空间索引:支持地理位置查询
  • 哈希索引:用于分片键

创建唯一索引的示例:

db.products.createIndex({ sku: 1 }, { unique: true })

TTL索引可以自动删除过期文档:

db.logs.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 })

索引的查看

查看集合所有索引使用getIndexes()方法:

db.orders.getIndexes()

输出结果会显示索引名称、键、类型等信息:

[
  {
    "v": 2,
    "key": { "_id": 1 },
    "name": "_id_"
  },
  {
    "v": 2,
    "key": { "customerId": 1, "orderDate": -1 },
    "name": "customerId_1_orderDate_-1"
  }
]

使用totalIndexSize()查看索引占用的空间:

db.orders.totalIndexSize()

$indexStats操作符可以获取索引使用统计:

db.orders.aggregate([ { $indexStats: { } } ])

索引的删除

删除单个索引使用dropIndex()方法:

db.products.dropIndex("sku_1")

删除所有索引(除_id索引外)使用dropIndexes()

db.customers.dropIndexes()

重建索引可以优化索引性能:

db.orders.reIndex()

在分片集群中删除索引需要连接到mongos:

// 连接到mongos
shardConn = new Mongo("mongos.example.com:27017")
shardConn.getDB("mydb").orders.dropIndex("customerId_1")

索引管理实践

监控索引使用情况很重要,可以通过explain()分析查询:

db.orders.find({ customerId: 123 }).explain("executionStats")

定期检查未使用的索引:

db.orders.aggregate([
  { $indexStats: {} },
  { $match: { "accesses.ops": { $lt: 100 } } }
])

部分索引只包含满足条件的文档:

db.users.createIndex(
  { active: 1 },
  { partialFilterExpression: { active: true } }
)

隐藏索引可以在不删除的情况下测试性能影响:

db.orders.hideIndex("customerId_1_orderDate_-1")
db.orders.unhideIndex("customerId_1_orderDate_-1")

索引性能优化

覆盖查询可以直接从索引返回结果:

db.users.createIndex({ name: 1, email: 1 })
db.users.find({ name: "张三" }, { _id: 0, email: 1 })

索引交集允许MongoDB组合多个索引:

db.products.createIndex({ category: 1 })
db.products.createIndex({ price: 1 })
db.products.find({ category: "电子", price: { $gt: 1000 } })

索引排序方向影响复合索引效率:

// 适合排序方向与查询方向一致的场景
db.logs.createIndex({ timestamp: -1 })
db.logs.find().sort({ timestamp: -1 })

索引前缀可以利用复合索引的部分字段:

db.orders.createIndex({ status: 1, orderDate: 1 })
// 可以使用status字段的索引
db.orders.find({ status: "shipped" })

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌