MongoDB索引
时间:2022-07-25
本文章向大家介绍MongoDB索引,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
MongoDB索引
- 优点:索引建的好,可以提高查询效率几个数量级
- 缺点:索引建的越多,在插入,更新,删除的时候产生额外开销越大。
使用上的限制
- 索引不能被以下的查询使用: 1.正则表达式及非操作符,如 nin, not, 等。 2.算术运算符,如
MongoDB索引分类
- _id默认的单字段唯一索引
- 单字段索引:建立在集合单一字段上的索引
- 复合索引:建立在集合多个字段上的索引
- Multikey索引:如果一个字段是一个数组,在这个字段上面创建索引。Mongodb会自己决定,是否要把这个索引建成Multikey Index。
- 地理空间索引:基于坐标平面查找的索引(使用场景较为特殊,暂不探讨)
- 文本索引:支持文档内的字符串查找
- hash索引:Hash索引对key进行hash计算然后创建索引,该索引只支持等于查询,不支持区间查询。
单字段索引
创建索引的api,3.0之后使用createIndex,ensureIndex已经废弃 * 对于单字段索引,排序的顺序是升序还是降序无关紧要
文档字段索引
db.records.createIndex( { userid: 1 } )
//下列查询语句可以使用到该索引
db.records.find( { userid: 2 } )
db.records.find( { userid: { $gt: 10 } } )
子文档字段索引
db.people.createIndex( { "address.zipcode": 1 } )
子文档索引
//示例数据
{
_id: ObjectId(...),
metro: {
city: "New York",
state: "NY"
},
name: "Giant Factory"
}
//创建索引
db.factories.createIndex( { metro: 1 } )
//下列查询会用到该索引
db.factories.find( { metro: { city: "New York", state: "NY" } } )
//该查询不会用到子文档索引,因为子文档字段顺序不匹配
db.factories.find( { metro: { state: "NY", city: "New York" } } )
复合索引
//创建复合索引
db.events.createIndex( { "username" : 1, "date" : -1 } )
//下面2个查询将使用上面的索引(一升一降)
db.events.find().sort( { username: 1, date: -1 } )
db.events.find().sort( { username: -1, date: 1 } )
//下面这个查询将使用不到上面的索引
db.events.find().sort( { username: 1, date: 1 } )
- 如果选择了如何复合索引,实际上可以支持三种查询
{ "item": 1, "location": 1, "stock": 1 }
- { "item": 1}
- { "item": 1, "location": 1}
- { "item": 1, "location": 1, "stock": 1 }
MultiKey索引
//创建MultiKey索引
db.inventory.createIndex( { ratings: 1 } )
//精确匹配查找ratings数组为5,9
db.inventory.find( { ratings: [ 5, 9 ] } )
//找到数据:
{ _id : 5, type : "food" , item : "bbb" ,ratings : [ 5 , 9 ] }
文本索引
//在comments字段上建立文本索引
db.reviews.createIndex( { comments: "text" } )
//在subject和comments字段上建立文本索引
db.reviews.createIndex(
{
subject: "text",
comments: "text"
}
)
//在文档内所有字符串类型的字段上建立文本索引
db.collection.createIndex( { "$**": "text" } )
哈希索引
//在字段a上建立hash索引
db.active.createIndex( { a: "hashed" } )
喜欢 (4)or分享 (0)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 「性能提升」扩展 Spring Cache 支持多级缓存
- 如何以源码形式运行Nacos Server
- Spring Boot 2.4 配置文件将加载机制大变化
- OpenGL ES 多目标渲染(MRT)
- R包:gtable包用于处理ggplot2图像
- Sight——杀手级提升Laravel开发速度的组件现在开源了!
- 面试官带你学Android——面试中Handler 这些必备知识点你都知道吗?
- leetcode哈希表之前K个高频元素
- Kali之U盘启动加密与持久化存储制作流程
- Gentoo发行版系统基础使用记录
- Ubuntu-20.04-LTS桌面版与服务器版基础初始配置
- Snap容器基础入门使用
- zabbix入门学习
- 突击并发编程JUC系列-ReentrantReadWriteLock
- Qt音视频开发33-ffmpeg安卓版