- MongoDB官方文档中文版
- MongoDB中文手册说明
- MongoDB简介
- 安装 MongoDB
- The mongo Shell
- MongoDB CRUD 操作
- 聚合
- 数据模型
- 事务
- 索引
- 安全
- 安全检查列表
- 启用访问控制
- 身份验证
- 基于角色的访问控制
- TLS / SSL(传输加密)
- 静态加密
- 客户端字段级加密
- 审计
- 网络和配置强化
- 实现字段级别修订
- 安全参考
- 附录
- 变更流
- 复制
- 分片
- 分片键
- 哈希分片
- 范围分片
- 区
- 管理分片区
- 按位置细分数据
- 用于更改SLA或SLO的分层硬件
- 按应用或客户细分数据
- 仅插入工作负载的分布式本地写入
- 管理分片区
- 使用块进行数据分区
- 在分片集群中拆分数据块
- 管理
- 存储
- 存储引擎
- 日志记录
- 管理日志记录
- GridFS
- FAQ:MongoDB 存储
- 存储引擎
- 参考
- 运算符
- 查询与映射运算符
- 更新运算符
- 聚合管道阶段
- 聚合管道操作符
- $abs (aggregation)
- $acos (aggregation)
- $acosh (aggregation)
- $add (aggregation)
- $addToSet (aggregation)
- $allElementsTrue (aggregation)
- $and (aggregation)
- $anyElementTrue (aggregation)
- $arrayElemAt (aggregation)
- $arrayToObject (aggregation)
- $asin (aggregation)
- $asinh (aggregation)
- $atan (aggregation)
- $atan2 (aggregation)
- $atanh (aggregation)
- $avg (aggregation)
- $ceil (aggregation)
- $cmp (aggregation)
- $concat (aggregation)
- $concatArrays (aggregation)
- $cond (aggregation)
- $convert (aggregation)
- $cos (aggregation)
- $dateFromParts (aggregation)
- $dateToParts (aggregation)
- $dateFromString (aggregation)
- $literal (aggregation)
- 查询修饰符
- 数据库命令
- 聚合命令
- 地理空间命令
- 查询和写操作命令
- 查询计划缓存命令
- 认证命令
- 用户管理命令
- 角色管理命令
- 复制命令
- 分片命令
- 会话命令
- 管理命令
- 诊断命令
- 免费监控命令
- 系统事件审计命令
- mongo Shell 方法
- 集合方法
- db.collection.aggregate()
- db.collection.bulkWrite()
- db.collection.copyTo()
- db.collection.count()
- db.collection.countDocuments()
- db.collection.estimatedDocumentCount()
- db.collection.createIndex()
- db.collection.createIndexes()
- db.collection.dataSize()
- db.collection.deleteOne()
- db.collection.deleteMany()
- db.collection.distinct()
- db.collection.drop()
- db.collection.dropIndex()
- db.collection.dropIndexes()
- db.collection.ensureIndex()
- db.collection.explain()
- db.collection.find()
- db.collection.findAndModify()
- db.collection.findOne()
- db.collection.findOneAndDelete()
- db.collection.findOneAndReplace()
- db.collection.findOneAndUpdate()
- db.collection.getIndexes()
- db.collection.getShardDistribution()
- db.collection.getShardVersion()
- db.collection.insert()
- db.collection.insertOne()
- db.collection.insertMany()
- db.collection.isCapped()
- db.collection.latencyStats()
- db.collection.mapReduce()
- db.collection.reIndex()
- db.collection.remove()
- db.collection.renameCollection()
- db.collection.replaceOne()
- db.collection.save()
- db.collection.stats()
- db.collection.storageSize()
- db.collection.totalIndexSize()
- db.collection.totalSize()
- db.collection.update()
- db.collection.updateOne()
- db.collection.updateMany()
- db.collection.watch()
- db.collection.validate()
- 词汇表
- 默认的MongoDB端口
- 默认的MongoDB读/写关注
- 服务器会话
- MongoDB驱动
- FAQ
- 联系我们
- 更多资料
- [快学Mongo]
- [Mongo问题讨论区]
- [Mongo 驱动使用手册]
- 本书使用 GitBook 发布
创建索引来支持查询
创建索引来支持查询
在本页面
当索引包含查询扫描的所有字段时,索引就支持查询。查询扫描的是索引而不是集合。创建支持查询的索引可以极大地提高查询性能。
本文档描述创建支持查询的索引的策略。
如果所有查询使用相同的单键,则创建单键索引
如果只查询给定集合中的单个键,则只需为该集合创建一个单键索引。例如,您可以在product集合中创建category索引:
db.products.createIndex( { "category": 1 } )
创建复合索引来支持几个不同的查询
如果有时只查询一个键,而有时又查询该键和第二个键的组合,那么创建复合索引比创建单键索引更有效。MongoDB将对两个查询使用复合索引。例如,您可以在category
和两者上创建索引item
。
db.products.createIndex( { "category": 1, "item": 1 } )
这允许您两个选择。您可以只查询category
,也可以与category
组合查询item
。多个字段上的单个复合索引可以支持所有搜索这些字段的“前缀”子集的查询。
例子
以下是一个集合的索引:
{ x: 1, y: 1, z: 1 }
以下索引可以支持查询:
{ x: 1 }
{ x: 1, y: 1 }
在某些情况下,前缀索引可能提供更好的查询性能:例如,如果' z '是一个大数组。
{x: 1, y: 1, z: 1}
索引也可以支持与以下索引相同的许多查询:
{ x: 1, z: 1 }
此外,{x: 1, z: 1}
还有其他用途。给定以下查询:
db.collection.find( { x: 5 } ).sort( { z: 1} )
{x: 1, z: 1}
索引同时支持查询和排序操作,而{x: 1, y: 1, z: 1}
索引只支持查询。有关排序的更多信息,请参见使用索引对查询结果排序。
从2.6版本开始,MongoDB可以使用索引交集来完成查询。是创建支持查询的复合索引,还是依赖索引交集,这取决于系统的具体情况。更多细节请参见索引交集和复合索引。
索引的使用和排序
若要使用索引进行字符串比较,操作还必须指定相同的排序规则。也就是说,如果索引指定了不同的排序规则,则具有排序规则的索引不能支持对索引字段执行字符串比较的操作。
例如,集合' myColl '在字符串字段' category '上有一个索引,其排序区域设置为' fr'。
db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )
下面的查询操作指定了与索引相同的排序规则,可以使用索引:
db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )
但是,以下查询操作,默认使用“simple”二进制排序器,不能使用索引:
db.myColl.find( { category: "cafe" } )
对于索引前缀键不是字符串、数组和嵌入文档的复合索引,指定不同排序规则的操作仍然可以使用索引来支持对索引前缀键的比较。
例如,集合' myColl '在数值字段score
和price
以及字符串字段category
上有一个复合索引;索引是用collation locale "fr" 创建的,用于字符串比较:
db.myColl.createIndex(
{ score: 1, price: 1, category: 1 },
{ collation: { locale: "fr" } } )
以下使用 "simple" 二进制排序来进行字符串比较的操作可以使用索引:
db.myColl.find( { score: 5 } ).sort( { price: 1 } )
db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )
下面的操作使用 "simple"二进制排序对索引的category
字段进行字符串比较,可以使用索引来完成查询的score: 5
部分:
db.myColl.find( { score: 5, category: "cafe" } )
Copyright © 上海锦木信息技术有限公司 all right reserved,由 MongoDB汉化小组 提供技术支持文件修订时间: 2020-10-11 20:53:05