zoukankan      html  css  js  c++  java
  • MongoDB数据库的索引操作(转)

    Mongodb数据库的索引操作很简单,只需要把作为条件的字段设置为索引即可

    > use user
    switched to db user
    > show collections
    system.indexes
    u_info
    u_setting
    > db.system.indexes.find();   这是默认的索引(默认为_id为索引)
    { "name" : "_id_", "ns" : "user.u_info", "key" : { "_id" : ObjectId("000000000000000000000000") } }
    { "name" : "_id_", "ns" : "user.u_setting", "key" : { "_id" : ObjectId("000000000000000000000000") } }
    >
    > db.u_info.insert({uid:1,name:"Falcon.C",address:"Beijing"});   
    > db.u_info.insert({uid:2,name:"sexMan",address:"Wuhan"});   
    > db.u_info.find();
    { "_id" : ObjectId("4b9cf280c84d7f20576c4df2"), "uid" : 1, "name" : "Falcon.C", "address" : "Beijing" }
    { "_id" : ObjectId("4b9cf284c84d7f20576c4df3"), "uid" : 2, "name" : "sexMan", "address" : "Wuhan" }

    插入了2条记录,我们来把uid设置为索引字段:

    > db.u_info.ensureIndex({uid:1});
    > db.u_info.ensureIndex({name:1});
    > db.system.indexes.find();
    { "name" : "_id_", "ns" : "user.u_info", "key" : { "_id" : ObjectId("000000000000000000000000") } }
    { "name" : "_id_", "ns" : "user.u_setting", "key" : { "_id" : ObjectId("000000000000000000000000") } }
    { "ns" : "user.u_info", "key" : { "uid" : 1 }, "name" : "uid_1" }
    { "ns" : "user.u_info", "key" : { "name" : 1 }, "name" : "name_1" }
    >

    这时我们看到多了刚才我们设置的那个字段,这样在查询的时候,如果查询条件有uid字段或name字段,则走索引来进行查询

    有索引:

    > db.u_info.find({name:"Falcon.C"});
    { "_id" : ObjectId("4b9cf280c84d7f20576c4df2"), "uid" : 1, "name" : "Falcon.C", "address" : "Beijing" }
    > db.u_info.find({name:"Falcon.C"}).explain();
    {
             "cursor" : "BtreeCursor name_1",
             "startKey" : {
                     "name" : "Falcon.C"
             },
             "endKey" : {
                     "name" : "Falcon.C"
             },
             "nscanned" : 1,
             "n" : 1,
             "millis" : 0,
             "allPlans" : [
                     {
                             "cursor" : "BtreeCursor name_1",
                             "startKey" : {
                                     "name" : "Falcon.C"
                             },
                             "endKey" : {
                                     "name" : "Falcon.C"
                             }
                     }
             ]
    }

    删除索引后:

    > db.system.indexes.find();                  
    { "name" : "_id_", "ns" : "user.u_info", "key" : { "_id" : ObjectId("000000000000000000000000") } }
    { "name" : "_id_", "ns" : "user.u_setting", "key" : { "_id" : ObjectId("000000000000000000000000") } }
    { "ns" : "user.u_info", "key" : { "uid" : 1 }, "name" : "uid_1" }
    { "ns" : "user.u_info", "key" : { "name" : 1 }, "name" : "name_1" }
    > db.u_info.dropIndex("name_1")
    { "nIndexesWas" : 3, "ok" : 1 }
    > db.u_info.find({name:"Falcon.C"}).explain();
    {
             "cursor" : "BasicCursor",
             "startKey" : {

             },
             "endKey" : {

             },
             "nscanned" : 2,
             "n" : 1,
             "millis" : 0,
             "allPlans" : [
                     {
                             "cursor" : "BasicCursor",
                             "startKey" : {

                             },
                             "endKey" : {

                             }
                     }
             ]
    }
    > db.system.indexes.find();                  
    { "name" : "_id_", "ns" : "user.u_info", "key" : { "_id" : ObjectId("000000000000000000000000") } }
    { "name" : "_id_", "ns" : "user.u_setting", "key" : { "_id" : ObjectId("000000000000000000000000") } }
    { "ns" : "user.u_info", "key" : { "uid" : 1 }, "name" : "uid_1" }

    通过以上可以看出,查询的条件中有索引时,查询走BtreeCursor 的索引,而没有索引时走BasicCursor


    通常需要索引的字段是:
    1.唯一键 _id 是默认被设置为索引的
    2.需要被查找的字段应该建立索引,比如在find()里面的字段
    3.需要被排序的字段应该建立索引。比如在sort()里面的字段

    以上就是MongoDB

    的索引操作

  • 相关阅读:
    【POJ】[1703]Find them, Catch them
    【杭电】[2717]Catch That Cow
    【杭电】[2717]Catch That Cow
    【杭电】[1716]排列2
    【杭电】[1716]排列2
    【杭电】[2084]数塔
    【杭电】[2084]数塔
    【杭电】[1003]Max Sum
    【杭电】[1003]Max Sum
    [leetcode]117. Populating Next Right Pointers in Each NodeII用next填充同层相邻节点
  • 原文地址:https://www.cnblogs.com/DxSoft/p/1857364.html
Copyright © 2011-2022 走看看