Mongo索引学习笔记
索引使用场景
优:加快查询速度
劣:增删改会产生额外的开销、占用空间
tips: 返回集合中一半以上的数据,全表扫描的效率高
索引基础
基础操作
查看索引:db.test.getIndexes()
创建索引:db.test.ensureIndex({"username":1},{"background":true,"name":"index_test_name"}) //已有大量数据时可后台执行不阻塞
删除索引: db.test.dropIndex({"username":1})
查看索引大小: db.test.totalIndexSize()
属性
索引顺序:
1为正序,-1为逆序
在复合索引中需注意顺序(id:1, age:-1)
索引属性:
唯一性
db.test.ensureIndex({x:1,y:1},{unique:true})
稀疏性
db.test.ensureIndexx({},{sparse:true/false})
不稀疏(默认):
1. 可插入不存在索引字段的数据,null;
2. 可筛选不存在字段: db.test.find({m:{$exist:ture}})
稀疏:
优化分析方法
explain
获知系统如何处理请求
cursor 返回游标类型(BasicCursor或BtreeCursor)
nscanned 被扫描的文档数量
n 返回的文档数
millis 耗时(毫秒)
indexBounds 所使用的索引
hint
强制使用某个索引
db.test.find({"age":20}).hint({"name":1,"age":1}) // .hint(name_1_age_1)
profile
设置日志级别,记录慢查询
Tips
- 查询条件顺序自动调整
- 能为前缀式的正则表达式命中索引(/^z/)
- 对需要大量sort的键建立索引,避免全部数据加载到内存
- $ne、$nin 不会使用索引
索引种类
_id索引
默认生成唯一字段
单键索引
值为一个单一的值
db.test.ensureIndex({x:1})
多键索引
值具有多个记录,如数组、内嵌文档
db.test.insert({x:[1,2,3,4]})
每一个索引字段最多包含一个数组
Y: {_id:1, a:[1,2], b:1, category:"A array"} 与 {_id:2, a:1, b:[1,2], category:"B array"}
N: {_id:3, a:[1,2], b:[1,2], category:"AB both array"}
查询
//数组查询
数组中包含: db.fruitshop.find({"fruits":"apple"})
包含多个: db.fruitshop.find({"fruits":{"$all":["apple", "banana"]}})
精确匹配: db.fruitshop.find({"fruits":["apple","orange","pear"]}) //顺序与数量一致
特定位置元素查询: db.fruitshop.find({"fruits.1":"orange"})
查询数组长度: db.fruitshop.find({"fruits":{"$size":3}}) //size不能和其他操作符连用,如'$gt'等
返回固定长度: db.fruitshop.find({"fruits":{"$slice":2}}) //前2个
db.fruitshop.find({"fruits":{"$slice":-1}}) //后1个
db.fruitshop.find({"fruits":{"$slice":[3,6]}}) //第4~7个,无数据则返回[]
//内嵌文档
完全匹配: db.staff.find({"name":{"first":"joe","middle":"bush"}}) //顺序与数量一致
键值对查询: db.staff.find({"name.first":"joe","name.middle":"bush"}) //点表示法,在插入时键名不能包含点(约束)
多层内嵌: elemMatch db.blogs.find({"comment":{"$elemMatch":{"author":"joe", "score":{"$gte":3}}}}) //内嵌文档中匹配author和score条件
where db.fruitshop.find({"$where":function(){}}) //性能低,每个文档转换成一个javascript对象放入函数执行
复合索引
多个条件,从左到右执行
{a:1,b:1,c:1} => {a:1},{a:1,b:1},{a:1,b:1,c:1}
db.test.ensureIndex({x:1,y:1})
过期索引
一段时间后过期,删除相应数据(用户的登录信息、存储的日志)
db.test.ensureIndex({time:1},{expireAfterSeconds:30})
限制
字段类型必须是ISODate或者ISODate数组(数组中最小的时间)
不能是复合索引(不能指定两个过期时间)
删除时间不精确(后台进程60s跑一次)
全文索引
字符串或者字符串数组可搜索
//建立索引
db.test.ensureIndex({title:"text"})
db.test.ensureIndex({key1:"text",key2:"text"}) //对多个字段创建全文索引
db.test.ensureIndex({$**:"text"}) //对所有字段建全文索引
//查找
不需要指定字段名称: db.test.find({"$text":{"$search":"coffee"}}) //每个数据集合只允许创建一个全文索引(可针对一个、多个、全部字段)
查找多个关键词(空格代表 或 操作): db.test.find({"$text":{"$search":"aa bb cc"}})
指定不包含词(-代表 非 操作): db.test.find({"$text":{"$search":"aa bb -cc"}})
与关系操作: db.test.find({"$text":{"$search":"\"aa\" \"bb\" \"cc\""}})
相似度查询: db.test.find({"$text":{"$search":"aa bb"}},{"score:{"$meta":"textScore"}"}) //score字段得分越高,相关度越高
db.test.find({"$text":{"$search":"aa bb"}},{"score":{"$meta":"textScore"}}).sort({"score":{"$meta":"textScore"}}) //score相关度排序
//限制
每次查询只能指定一个$text
有了$text则hint(强制指定索引)不起作用
中文支持不好(企业版可支持)
地理位置索引
将点的位置存储,可以按位置查找其他点
2D索引
用于存储和查找平面上的点
db.test.ensureIndex({w:"2d"})
//使用经纬度表示
取值范围 经度[-180,180] 纬度[-90,90]
db.test.insert({w:[180,90]})
//查询
使用$near查询距离某个点最近的点(默认返回100个)
db.test.find({"$near":[x,y]})
db.test.find({w:{"$near":[x,y],"$maxDistance":"z"}}) //限制返回的最远距离
使用$geoWithin查询某个形状内的点
矩形($box:[[x1,y1],[x2,y2]]) db.test.find({w:{"$geoWithin:{"$box":[[0,0],[3,3]]}}"}})
圆形($center:[[x,y],r]) db.test.find({w:{"$geoWithin":{"$center":[0,0],5}}})
多边形($polygon:[[x1,y1],[x2,y2],..) db.test.find({w:{"$geoWithin":{"$polygon":[[0,0],[0,1],[2,5],[6,1]]}}})
使用$geoNear查询,返回最大距离和平均距离等数据
相关扩展:
《地理位置索引的实现原理》
2Dsphere索引
用于存储和查找球面上的点
db.test.ensureIndex({key:"2dsphere"})
原文地址:https://segmentfault.com/a/1190000015567585
Mongo索引学习笔记的更多相关文章
- NOSQL Mongo入门学习笔记 - MongoDB的安装(一)
手上的工作不是很忙,所以来学习学习很久就像接触的MongoDb,无奈前段时间工作时间都比较多.记录在这里供以后参考 环境: Centos 7 64位 开始: 1. 在官网下载Mongo : wget ...
- Mongodb的索引--学习笔记(未完)
全文索引 建立方法: --在articles集合的key字段上创建全文索引 db.articles.ensureIndex({key:"text"}) --在articles集合的 ...
- NOSQL Mongo入门学习笔记 - C++连接Mongodb(三)
OS环境: Centos 7.1 release X86_64 编译环境: G++ 4.8.3 已经成功搭建好了Mongodb,也初步在命令行中的查询与写入数据的基本方法,现在通过C++来连接Mong ...
- NOSQL Mongo入门学习笔记 - 数据的基本插入(二)
成功运行起来mongo之后,进入了命令行模式,mongo默认会选择test数据库 1. 使用db命令打印出来当前选定的数据库: > db test 2. 使用show dbs 命令可以打印出数据 ...
- Mysql索引学习笔记
1.btree索引与hash索引 下列范围查询适用于 btree索引和hash索引: SELECT * FROM t1 WHERE key_col = 1 OR key_col IN (15,18,2 ...
- mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...
- Bootstrap~学习笔记索引
回到占占推荐博客索引 bootstrap已经用了有段时间了,感觉在使用上还是比较容易接受的,在开发人员用起来上,也还好,不用考虑它的兼容性,手机,平台,PC都可以有效的兼容. bootstrap官方a ...
- Solr学习笔记之3、Solr dataimport - 从SQLServer导入数据建立索引
Solr学习笔记之3.Solr导入SQLServer数据建立索引 一.下载MSSQLServer的JDBC驱动 下载:Microsoft JDBC Driver 4.0 for SQL Server ...
- Mysql数据库学习笔记之数据库索引(index)
什么是索引: SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间. 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物 ...
随机推荐
- java中static,super,final关键字辨析
1:static关键字 利:1)对对象的共享数据提供单独的空间存储. 2)修饰的方法可以直接被类名调用 弊:1)生命周期长. 2)访问出现限制(只能访问静态) 它可以有静态方法,静态类,静态变量 2: ...
- Codeforces Round #325D (Div. 2) (DP)
题目链接: D. Phillip and Trains 分析:dp 我们先初始化,dp[i]表示当前列第i行是否可达,r[i]表示上一个dp值,接下来从头搜到尾 如果该位置满足s[i+1]=='.'且 ...
- bzoj 2750: [HAOI2012]Road【spfa+dfs】
枚举起点做spfa,然后一条边在最短路上的条件是dis[e[i].to]==dis[u]+e[i].va,所以每次spfa完之后,dfs出a[i]表示经过i点的最短路的起点数,b[i]表示经过i点的最 ...
- P4949 最短距离(树链剖分+树状数组+基环树)
传送门 一个中午啊-- 本来打算用仙人掌搞的,后来发现直接基环树就可以了,把多出来的那条边单独记录为\((dx,dy,dw)\),剩下的树剖 然后最短路径要么直接树上跑,要么经过多出来的边,分别讨论就 ...
- Word Cloud (词云) - Matlab
今天要总结的是 Word Cloud 最后一个部分了,用 Matlab 来创建 word cloud.Matlab R2018b 已经提供 wordcloud 函数可以直接生成词云了. >> ...
- UART、I2C、SPI三种协议对比
学嵌入式需要打好基础 下面我们来学习下计算机原理里的3种常见总线协议及原理 协议:对等实体之间交换数据或通信所必须遵守规则或标准的集合 1.UART(Universal Asynchronous Re ...
- EL表达式(详解)
EL表达式 1.EL基本内容 1)语法结构 ${expression} 2)[]与.运算符 EL 提供.和[]两种运算符来存取数据. 当要存取的属性名称中包含一些特殊 ...
- flask框架路由系统
flask框架的url系统: flask框架的路由系统: flask框架的路由系统使用实例化的route方法来指定: 如: @app.route('/') route函数装饰器可以把一个函数绑定到对应 ...
- poj 3253 Fence Repair (水哈夫曼树)
题目链接: http://poj.org/problem?id=3253 题目大意: 有一根木棍,需要截成n节,每节都有固定的长度,一根长度为x的木棒结成两段,需要花费为x,问截成需要的状态需要最小的 ...
- 转-CoreText 使用教程
转自:http://www.dapps.net/dev/iphone/how-to-create-a-simple-magazine-app-with-core-text.html Core Text ...