本系列基于对的学习笔记
索引查询
覆盖索引查询
概念
所有的查询字段都是索引的一部分;所有的查询返回字段在同一个索引中。
由于索引存在于 RAM 中,因而从索引中获取数据要比扫描文档更快。
示例
例如有一个索引:
> db.users.ensureIndex({gender:1,user_name:1})
该索引会覆盖下面的查询:
db.users.find({gender:"M"},{user_name:1,_id:0})
由于默认会有_id被查出来,因此不排除_id就不会使用覆盖索引
高级索引
对数组建立索引
对数组字段创建索引时,内部会对数组中每个字段依次建立索引,可以直接检索字段
示例
tags字段是一个数组
{
"address": {
"city": "chengdu",
"province": "sichuan",
"pincode": "123"
},
"tags": [
"music",
"cricket",
"blogs"
],
"name": "clound"
}
建立了以下索引:
db.users.ensureIndex({"tags":1})
检索字段时直接搜索也能用到索引:
> db.users.find({tags:"cricket"}) # 索引会加快这个命令的搜索速度
可以使用explain命令查看索引使用情况(和mysql类似)
> db.users.find({tags:"cricket"}).explain()
索引子文档字段
为子文档的字段建立索引:
db.users.ensureIndex({"address.city":1,"address.province":1,"address.pincode":1})
创建了索引后,使用子文档检索会命中索引:
db.users.find({"address.city":"chengdu"})
> db.users.find({"address.city":"chengdu","address.province":"sichuan"}) # 按照顺序也能命中索引
原子操作
概念
所谓原子操作,就是要么执行成功,要么执行失败, 执行成功完成既定任务,执行失败还原执行前的状态。
常见原子操作
操作 | 使用 | 含义 |
---|---|---|
$set | { $set : { field : value } } | 用来指定一个键并更新键值,若键不存在则创建 |
$unset | { $unset : { field : 1} } | 用来删除一个键 |
$inc | { $inc : { field : value } } | $inc 可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作 |
$push | { $push : { field : value } } | 把 value 追加到 field 里面去,field 一定要是数组类型才行,如果 field 不存在,会新增一个数组类型加进去 |
$pushAll | { $pushAll : { field : value_array } } | 同 $push ,只是一次可以追加多个值到一个数组字段内 |
$pull | { $pull : { field : _value } } | 从数组 field 内删除一个等于 value 值 |
$addToSet | { $addToSet : { field : value } } | 增加一个值到数组内,而且只有当这个值不在数组内才增加 |
$pop | { $pop : { field : 1 } } | 删除数组的第一个或最后一个元素 |
$rename | { $rename : { old_field_name : new_field_name } } | 修改字段名称 |
$bit | {$bit : { field : {and : 5}}} | 位操作,integer 类型 |
查询分析
explain
explain() 操作提供了查询信息,使用索引及查询统计等。有利于我们对索引的优化
hint()
强制命中索引,语法:
db.worker.find({age:30},{age:1,_id:0}).hint({age:1,salary:1})
db.createUser({user:“hexiaojiao”,pwd:“jiao”,roles:[“root”]})