MongoDB入门(3)--MongoDB的索引
2017-05-04 21:53
330 查看
《mongodb入门》读书笔记下载:
http://download.csdn.net/detail/ch717828/9833847
创建索引(1表示升序,-1表示降序)
索引的种类
_id索引
_id索引是绝大多数集合默认建立的索引,对于每个插入数据MongoDB都会自动生成一条唯一的_id字段
单键索引
单键是最普通的索引
多键索引
在单键索引的基础上,多键索引的值有多个记录,例如数组
对于这条插入记录来讲,mongodb即为x创建了一个多键索引
复合索引
使用多个键作为索引
过期索引
在一段时间后会过期的索引,在索引过期后,相应的数据会被删除。 这适合存储一些在一段时间之后会失效的数据比如用户的登陆信息、存储的日志
观察一段时间后会发现,y的值为 new Date()的记录被自动删除,y的值为1的值没有被删除。因此
存储在过期索引字段的值必须是指定的时间类型(ISODate或者ISODate数组,不能使用时间戳)。如果制定了ISODate数组,则按照数组中的最小的时间进行删除。此外,过期索引不能是复合索引。删除时间不是精确的(删除过程由后台程序定时执行,而且删除过程也需要时间,因此存在误差)
全文索引
创建全文索引(每个数据集合只允许创建一个全文索引)
使用全文索引
地理位置索引
2D平面地理位置索引
2D球面地理位置索引
索引的名字
索引的唯一性
索引的稀疏性(稀疏性为true表示不为不存在的字段创建索引)
不可以在稀疏索引上查找不存在的记录,例:
“`
db.test_table.insert({m:1})
db.test_table.insert({n:1})
db.test_table.find({m:{exists:true}}) #查找m存在的记录
db.test_table.ensureIndex({m:1},{sparse:true}) #创建稀疏索引
db.test_table.find({m:{exists:false}}) #查找m不存在的记录,依然找出m,这是稀疏索引的问题
db.test_table.find({m:{$exists:false}}).hind(“m_1”) #可以实现查找m不存在的记录
“`
explain: 显示一次查询的详细信息
vim conf/mongod.conf
db.createUser({user:”testUser”,pwd:”testUser”,roles:[{role:”userAdmin”,db:”admin”},{role:”read”,db:”test”}]}) #创建testUser用户,对admin有userAdmin权限,对test有read权限
“`
多键索引与单键索引在使用方式上有很大区别,在单键索引的基础上,若插入的值为数组,则MongoDB为其创建一个多键索引。查询时,使用多键数组中的任意一个值均可以找到该条记录。
http://download.csdn.net/detail/ch717828/9833847
MongoDB的索引
查看索引db.test_table.getIndexes()
创建索引(1表示升序,-1表示降序)
db.test_table.ensureIndex({x:1})
索引的种类
_id索引
_id索引是绝大多数集合默认建立的索引,对于每个插入数据MongoDB都会自动生成一条唯一的_id字段
单键索引
单键是最普通的索引
db.test_table.ensureIndex({x:1})
多键索引
在单键索引的基础上,多键索引的值有多个记录,例如数组
db.test_table.insert({x:[1,2,3,4,5]})
对于这条插入记录来讲,mongodb即为x创建了一个多键索引
复合索引
使用多个键作为索引
db.test_table.ensureIndex({x:1,y:1})
过期索引
在一段时间后会过期的索引,在索引过期后,相应的数据会被删除。 这适合存储一些在一段时间之后会失效的数据比如用户的登陆信息、存储的日志
db.test_table.ensureIndex({y:1},{expireAfterSeconds:30}) db.test_table.insert({y:new Date()}) db.test_table.insert({y:1})
观察一段时间后会发现,y的值为 new Date()的记录被自动删除,y的值为1的值没有被删除。因此
存储在过期索引字段的值必须是指定的时间类型(ISODate或者ISODate数组,不能使用时间戳)。如果制定了ISODate数组,则按照数组中的最小的时间进行删除。此外,过期索引不能是复合索引。删除时间不是精确的(删除过程由后台程序定时执行,而且删除过程也需要时间,因此存在误差)
全文索引
创建全文索引(每个数据集合只允许创建一个全文索引)
db.test_table.ensureIndex({key:"text"}) db.test_table.ensureIndex({key_1:"text",key_2:"text"}) db.test_table.ensureIndex({"$**":"text"}) #$**表示在所有的字符串字段上创建一个全文索引。
使用全文索引
db.test_table.insert({"article":"abcd abcd abcd"}) db.test_table.insert({"article":"11 22 33"}) db.test_table.ensureIndex({"article":"text"}) db.test_table.find({$test:{$search:"abcd"}}) db.test_table.find({$test:{$search:"abcd 11"}}) db.test_table.find({$test:{search:"abcd -11"}}) #包含abcd但不包含11 db.test_table.find({$test:{$serach:"\"abcd\" \"11\" "}}) #即包含abcd又包含11 db.test_table.find({$test:{$search:"abcd 1234"}},{score:{$meta:"textScore"}}) #全文索引相似度
地理位置索引
2D平面地理位置索引
db.test_location.ensureIndex({"w":"2d"}) #创建2D平面地理位置索引 db.test_location.insert({w:[100,150]}) #插入记录 db.test_location.find({w:{$near:[1,1]}}) #查找距离[1,1]最近的点(默认返回前100个) db.test_location.find({w:{$near:[1,1],$maxDistance:10}}) #查找距离[1,1]距离不超过10的点 db.test_location.find({w:{$geoWithin:{$box:[[0,0],[3,3]]}}}) #查找矩形[ [0,0],[3,3] ] 内的点 db.test_location.find({w:{$geoWithin:{$center:[[0,0],5]}}}) #查找圆心[0,0]半径为5的圆内的点 db.test_location.find({w:{$geoWithin:{$polygon:[[0,0],[0,1],[2,2],[3,3]]}}}) #查找多边形[[0,0],[0,1],[2,2],[3,3]]内的点 db.runCommand({geoNear:"test_location",near:[1,2],$maxDistance:10,num:2}) #查找test_location中,距离[1,2]最大距离不超过10的2条记录
2D球面地理位置索引
索引的名字
db.test_table.ensureIndex({x:1,y:1,z:1},{name:"normal})
索引的唯一性
db.test_table.ensureIndex({m:1,n:1},{unique:true}) db.test_table.insert({m:1,n:2}) #插入成功 db.test_table.insert({m:1,n:2}) #插入失败,键冲突
索引的稀疏性(稀疏性为true表示不为不存在的字段创建索引)
db.test_table.ensureIndex({x:1},{sparse:true})
不可以在稀疏索引上查找不存在的记录,例:
“`
db.test_table.insert({m:1})
db.test_table.insert({n:1})
db.test_table.find({m:{exists:true}}) #查找m存在的记录
db.test_table.ensureIndex({m:1},{sparse:true}) #创建稀疏索引
db.test_table.find({m:{exists:false}}) #查找m不存在的记录,依然找出m,这是稀疏索引的问题
db.test_table.find({m:{$exists:false}}).hind(“m_1”) #可以实现查找m不存在的记录
“`
索引构建情况分析
mongostat: 查看mongodb运行状态的程序./bin/mongostat --hlep #查看mongostat帮助 ./bin/mongostat -h 127.0.0.1:12345 #查看当前系统的运行情况(如查看每秒有多少写入)
explain: 显示一次查询的详细信息
db.test_table.find({x:1}).explain();
MongoDB安全
开启MongoDB的鉴权vim conf/mongod.conf
port = 12345 dbpath = data logpath = log/mongod.log fork = true author = true ``` 使用createUser创建用户
db.createUser({user:”testUser”,pwd:”testUser”,roles:[{role:”userAdmin”,db:”admin”},{role:”read”,db:”test”}]}) #创建testUser用户,对admin有userAdmin权限,对test有read权限
“`
问题
多键索引的作用多键索引与单键索引在使用方式上有很大区别,在单键索引的基础上,若插入的值为数组,则MongoDB为其创建一个多键索引。查询时,使用多键数组中的任意一个值均可以找到该条记录。
相关文章推荐
- MongoDB 复合索引
- MongoDB-JAVA-Driver 3.2版本常用代码全整理(4) - 地理空间索引
- 使用NOSQL的MongoDB建立索引时需要注意的几点建议和Explain优化分析
- mongodb 索引
- mongodb 建立索引提示异常:WiredTigerIndex::insert: key too large to index, failing 1483
- MongoDB 索引
- 8天学通MongoDB——第四天 索引操作
- MongoDB索引
- mongodb中在嵌套子文档的文档上面建立索引
- Solr与MongoDB集成,实时增量索引
- mongodb学习(索引详解)
- 索引构建情况分析、mongoDB安全(四)
- mongodb 索引问题的介绍
- mongodb 索引建立问题
- mongoDB查询、索引与聚合
- Mongodb 创建索引
- MongoDB性能——索引
- 使用NOSQL的MongoDB建立索引时需要注意的几点建议和Explain优化分析
- 【MongoDB学习笔记20】MongoDB的索引
- Mongodb索引的优化