美文网首页
MongoDB索引

MongoDB索引

作者: sssnowyue | 来源:发表于2017-10-08 13:43 被阅读32次

    准备阶段

    插入10W条数据测试准备:
    插入10W条数据

    MongoDB性能分析函数(explain)

    性能分析函数
    cursor #查询方式   BasicCursor:顺序查找即“表扫描”
    n #最终返回文档数量
    nscanned #数据库浏览了10w个文档
    millis #总共耗时50毫秒
    

    查看索引

    db.age.getIndexes()
    
    查看索引

    命名索引

    db.age.ensureIndex({"name":1},{name:"normal_index"})
    

    删除索引

    db.age.dropIndex("name_1")
    
    删除索引

    创建索引

    单键索引

    db.age.ensureIndex({"name":1})
    
    单键索引
    创建索引性能对比:
    创建索引性能对比

    唯一索引

    重复的键值自然就不能插入
    db.age.ensureIndex({"name":1},{unique:true})
    

    稀疏索引

    没有此字段的数据不建立索引,节约磁盘
    db.age.ensureIndex({"name":1},{sparse:true/false})
    

    组合索引

    db.age.ensureIndex({"name":1,"age":1})
    db.age.ensureIndex({"age":1,"name":1})
    
    查看组合索引

    过期索引

    一段时间后会过期的索引
    在索引过期后,相应的数据会被删除
    适合存储在一段时间之后会失效的数据,比如用户的登录信息、存储的日志等。
    db.age.ensureIndex({time:1},{expireAfterSeconds:30}) #索引30秒后失效
    db.age.insert({time:new Date()}) #time必须为ISODate或者ISODate数组,不能为时间戳
    

    全文索引

    创建
    db.age.ensureIndex({key:"text"}) #key:字段名,value:固定字符串text
    
    db.age.ensureIndex({key1:"text",key2:"text"}) #在多个字段上创建全文索引
    
    db.age.ensureIndex({"$**":"text"}) #给所有字段建立全文索引
    
    查询
    db.age.find({$text:{$search:"coffee"}})
    
    db.age.find({$text:{$search:"aa bb cc"}}) #空格代表或操作,aa或bb或cc
    
    db.age.find({$text:{$search:"aa bb -cc"}}) #-号为非操作,即不包含cc的
    
    db.age.find({$text:{$search: "\"aa\" \"bb\" \"cc\""}}) #""号为与操作,aa与bb与cc
    
    查询返回相似度
    db.age.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}})
    
    db.age.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}}) #返回相似度并排序
    
    全局索引的限制:
    • 每次查询,只能指定一个$text查询
    • 不能出现在$nor查询中
    • 查询中如果包含了$text, hint(强制指定索引)不再起作用
    • MongoDB全文索引还不支持中文

    地理位置索引

    2D地理位置索引的取值范围以及表示方法 经纬度[经度,纬度]
    经纬度取值范围:经度[-180,180] 纬度[-90,90]
    1. 2D索引
    创建
    db.collection.ensureIndex({w:"2d"})
    
    插入
    db.collection.insert({w:[180,90]})
    
    查询
    (1) $near 查询距离某个点最近的点 ,默认返回最近的100个点
    db.collection.find({w:{$near:[x,y]}})
    
    (2) $geoWithin查询某个形状内的点
    #查询矩形中的点
    db.collection.find({w:{$geoWithin:{$box:[[0,0],[3,3]]}}})
    #查询圆中的点
    db.collection.find({w:{$geoWithin:{$center:[[0,0],5]}}})
    #查询多边形中的点
    db.collection.find({w:{$geoWithin:{$polygon:[[0,0],[0,1],[2,5],[6,1]]}}})
    
    (3)geoNear查询
    #2d索引不支持minDistance
    #num:返回数量
    db.runCommand({geoNear:"collection名称",near:[x, y],minDistance:10,maxDistance:10,num:1...})
    
    goNear查询

    2. 2Dsphere索引
    创建
    db.collection.ensureIndex({w:"2dsphere"})
    
    插入
    #位置格式
    {type:"Point/LineString/Polygon",coordinates:[x,y]}
    
    db.sphere.insert({name:"A",sp:{type:"Point",coordinates:[105.754484701156,41.689607057699]}})
    db.sphere.insert({name:"B",sp:{type:"Point",coordinates:[105.304045248031,41.783456183240]}})
    db.sphere.insert({name:"C",sp:{type:"Point",coordinates:[105.084318685531,41.389027478812]}})
    db.sphere.insert({name:"D",sp:{type:"Point",coordinates:[105.831388998031,41.285916385493]}})
    db.sphere.insert({name:"E",sp:{type:"Point",coordinates:[106.128706502914,42.086868474465]}})
    db.sphere.insert({name:"F",sp:{type:"Point",coordinates:[105.431074666976,42.009365053841]}})
    db.sphere.insert({name:"G",sp:{type:"Point",coordinates:[104.705977010726,41.921549795110]}})
    
    查询
    #2dsphere索引支持minDistance
    #num:返回数量
    db.runCommand({
    geoNear:"collection名称",
    near:{type:"Point/LineString/Polygon",coordinates:[x,y]},
    minDistance:10,
    maxDistance:10,
    num:1,
    ...})
    

    >>>2Dsphere索引实践>>>

    相关文章

      网友评论

          本文标题:MongoDB索引

          本文链接:https://www.haomeiwen.com/subject/izveyxtx.html