`

mongoDB 索引管理

 
阅读更多

1.单列索引
在字段x上创建索引,1 (ascending) or -1 (descending) 1表示升序(asc),-1表示降序(desc)
> db.data.ensureIndex({x:1})


显示表data里面的所有索引
> db.data.getIndexes()
[
        {
                "name" : "_id_",
                "ns" : "recommender.data",
                "key" : {
                        "_id" : 1
                }
        },
        {
                "_id" : ObjectId("4befb146b0e29ba1ce20e0bb"),
                "ns" : "recommender.data",
                "key" : {
                        "x" : 1
                },
                "name" : "x_1"
        }
]


查找字段x为6的值,此时已经用到索引了
> db.data.find({x:6})
{ "_id" : ObjectId("4bee804ba23d558eb6687117"), "x" : 6, "name" : "caihuafeng1" }


2.默认索引
上述1中db.data.getIndexes()显示出来的一共有2个索引,其中_id是创建表的时候自动创 建的索引,此索引是不能够删除的。

 

3.文档作为索引的键值
a.单列索引
MongoDB的官方文档上面是这样说的:
Documents as Keys


Indexed fields may be of any type, including documents:


往数据库recommender的表data中插入三条记录
> db.data.insert({name:"1616",info:{url:"
http://www.1616.net/",city:"beijing "}});
> db.data.insert({name:"hao123",info:{url:"
http://www.hao123.com/",city:"beijing "}});
> db.data.insert({name:"ll4la",info:{url:"
http://www.114la.com/",city:"dongguan "}});


对字段info创建索引
> db.data.ensureIndex({info: 1});


显示表data上的所有索引
> db.data.getIndexes();
[
        {
                "name" : "_id_",
                "ns" : "recommender.data",
                "key" : {
                        "_id" : 1
                }
        },
        {
                "_id" : ObjectId("4befb146b0e29ba1ce20e0bb"),
                "ns" : "recommender.data",
                "key" : {
                        "x" : 1
                },
                "name" : "x_1"
        },
        {
                "_id" : ObjectId("4befb76bb0e29ba1ce20e0bf"),
                "ns" : "recommender.data",
                "key" : {
                        "info" : 1
                },
                "name" : "info_1"
        }
]
查找指定的记录,此时会用到索引
> db.data.find({info: {url:"
http://www.1616.net/",city:"beijing "}});
{ "_id" : ObjectId("4befb711b0e29ba1ce20e0bc"), "name" : "1616", "info" : { "url" : "
http://www.1616.net/ ", "city" : "beijing" } }


b.组合索引
建立组合索引
> db.data.ensureIndex({"info.url":1, "info.city":1});
> db.data.getIndexes();
[
        {
                "name" : "_id_",
                "ns" : "recommender.data",
                "key" : {
                        "_id" : 1
                }
        },
        {
                "_id" : ObjectId("4befb146b0e29ba1ce20e0bb"),
                "ns" : "recommender.data",
                "key" : {
                        "x" : 1
                },
                "name" : "x_1"
        },
        {
                "_id" : ObjectId("4befb76bb0e29ba1ce20e0bf"),
                "ns" : "recommender.data",
                "key" : {
                        "info" : 1
                },
                "name" : "info_1"
        },
        {
                "_id" : ObjectId("4befb9d1b0e29ba1ce20e0c0"),
                "ns" : "recommender.data",
                "key" : {
                        "info.url" : 1,
                        "info.city" : 1
                },
                "name" : "info.url_1_info.city_1"
        }
]


下面几个操作均会用到索引
> db.data.find({"info.url": "
http://www.1616.net/ ", "info.city": "beijing"});
{ "_id" : ObjectId("4befb711b0e29ba1ce20e0bc"), "name" : "1616", "info" : { "url" : "
http://www.1616.net/ ", "city" : "beijing" } }


> db.data.find({"info.url": " http://www.1616.net/ "});
{ "_id" : ObjectId("4befb711b0e29ba1ce20e0bc"), "name" : "1616", "info" : { "url" : "
http://www.1616.net/ ", "city" : "beijing" } }


1表示升序(asc),-1表示降序(desc)
> db.data.find({"info.url": /http:*/i}).sort({"info.url": 1, "info.city": 1});
{ "_id" : ObjectId("4befb740b0e29ba1ce20e0be"), "name" : "ll4la", "info" : { "url" : "
http://www.114la.com/ ", "city" : "dongguan" } }
{ "_id" : ObjectId("4befb711b0e29ba1ce20e0bc"), "name" : "1616", "info" : { "url" : "
http://www.1616.net/ ", "city" : "beijing" } }
{ "_id" : ObjectId("4befb723b0e29ba1ce20e0bd"), "name" : "hao123", "info" : { "url" : "
http://www.hao123.com/ ", "city" : "beijing" } }


> db.data.find({"info.url": /http:*/i}).sort({"info.url": 1});
{ "_id" : ObjectId("4befb740b0e29ba1ce20e0be"), "name" : "ll4la", "info" : { "url" : "
http://www.114la.com/ ", "city" : "dongguan" } }
{ "_id" : ObjectId("4befb711b0e29ba1ce20e0bc"), "name" : "1616", "info" : { "url" : "
http://www.1616.net/ ", "city" : "beijing" } }
{ "_id" : ObjectId("4befb723b0e29ba1ce20e0bd"), "name" : "hao123", "info" : { "url" : "
http://www.hao123.com/ ", "city" : "beijing" } }


> db.data.find({"info.url": /http:*/i}).sort({"info.url": -1});
{ "_id" : ObjectId("4befb723b0e29ba1ce20e0bd"), "name" : "hao123", "info" : { "url" : "
http://www.hao123.com/ ", "city" : "beijing" } }
{ "_id" : ObjectId("4befb711b0e29ba1ce20e0bc"), "name" : "1616", "info" : { "url" : "
http://www.1616.net/ ", "city" : "beijing" } }
{ "_id" : ObjectId("4befb740b0e29ba1ce20e0be"), "name" : "ll4la", "info" : { "url" : "
http://www.114la.com/ ", "city" : "dongguan" } }


4.组合索引
注意,这里的组合索引与上述3中的b中的组合索引是有点不同的,4里面是对一 级字段建立组合索引,而上述3中是对二级字段建立组合索引。


在字段name及info上面创建组合索引
> db.data.ensureIndex({name: 1, info: -1});


当创建组合索引时,字段后面的1表示升序,-1表示降序,是用1还是用-1主要是跟排序的时候或指定范围内查询 的时候有关的,具体看下面的英文原文的说明。
When creating an index, the number associated with a key specifies the direction of the index, so it should always be 1 (ascending) or -1 (descending). Direction doesn't matter for single key indexes or for random access retrieval but is important if you are doing sorts or range queries on compound indexes.


显示所有的索引
> db.data.getIndexes();
[
        {
                "name" : "_id_",
                "ns" : "recommender.data",
                "key" : {
                        "_id" : 1
                }
        },
        {
                "_id" : ObjectId("4befb146b0e29ba1ce20e0bb"),
                "ns" : "recommender.data",
                "key" : {
                        "x" : 1
                },
                "name" : "x_1"
        },
        {
                "_id" : ObjectId("4befb76bb0e29ba1ce20e0bf"),
                "ns" : "recommender.data",
                "key" : {
                        "info" : 1
                },
                "name" : "info_1"
        },
        {
                "_id" : ObjectId("4befb9d1b0e29ba1ce20e0c0"),
                "ns" : "recommender.data",
                "key" : {
                        "info.url" : 1,
                        "info.city" : 1
                },
                "name" : "info.url_1_info.city_1"
        },
        {
                "_id" : ObjectId("4befbfcfb0e29ba1ce20e0c1"),
                "ns" : "recommender.data",
                "key" : {
                        "name" : 1,
                        "info" : -1
                },
                "name" : "name_1_info_-1"
        }
]


下面的排序将用到上面的索引
最后一行的"name" : "ll4la"实际上是"name" : "114la"(就是将数字一写成了字母l),但是我录入的时候写成了"name" : "ll4la",是我写错了,但是排序的结果是对的。
> db.data.find({"info.url": /http:*/i}).sort({name:1, info: -1});
{ "_id" : ObjectId("4befb711b0e29ba1ce20e0bc"), "name" : "1616", "info" : { "url" : "
http://www.1616.net/ ", "city" : "beijing" } }
{ "_id" : ObjectId("4befb723b0e29ba1ce20e0bd"), "name" : "hao123", "info" : { "url" : "
http://www.hao123.com/ ", "city" : "beijing" } }
{ "_id" : ObjectId("4befb740b0e29ba1ce20e0be"), "name" : "ll4la", "info" : { "url" : "
http://www.114la.com/ ", "city" : "dongguan" } }


MongoDB组合索引规则
If you have a compound index on multiple fields, you can use it to query on the beginning subset of fields. So if you have an index on


a,b,c


you can use it query on


a


a,b


a,b,c


如果用过MySQL的话,看起来是不是很熟悉,原理跟MySQL是一样的。


5.唯一索引
往表data中插入一条记录。
> db.data.insert({firstname: "cai", lastname: "huafeng"});


由于表data中只有一记录有字段firstname及lastname,其它的行均没有相应的值,也就是均为 null,为null就说明是相同的,而唯一索引是不允许有相同的值的,所以下面创建唯一组合索引时报错了。


所以建立唯一索引时,不管是对单个字段还是多个字段建立索引,则最好每一行均有此字段,否则会报错。


> db.data.find();
{ "_id" : ObjectId("4bee745a0863b1c233b8b7ea"), "name" : "caihuafeng" }
{ "_id" : ObjectId("4bee745f0863b1c233b8b7eb"), "website" : "1616.net" }
{ "_id" : ObjectId("4bee804ba23d558eb6687117"), "x" : 6, "name" : "caihuafeng1" }
{ "_id" : ObjectId("4bee804ba23d558eb6687118"), "x" : 6, "name" : "caihuafeng2" }
{ "_id" : ObjectId("4bee804ba23d558eb6687119"), "x" : 6, "name" : "caihuafeng3" }
{ "_id" : ObjectId("4bee804ba23d558eb668711a"), "x" : 6, "name" : "caihuafeng4" }
{ "_id" : ObjectId("4bee804ba23d558eb668711b"), "x" : 6, "name" : "caihuafeng5" }
{ "_id" : ObjectId("4bee804ba23d558eb668711c"), "x" : 6, "name" : "caihuafeng6" }
{ "_id" : ObjectId("4bee804ba23d558eb668711d"), "x" : 6, "name" : "caihuafeng7" }
{ "_id" : ObjectId("4bee804ba23d558eb668711e"), "x" : 6, "name" : "caihuafeng8" }
{ "_id" : ObjectId("4bee804ba23d558eb668711f"), "x" : 6, "name" : "caihuafeng9" }
{ "_id" : ObjectId("4bee804ba23d558eb6687120"), "x" : 6, "name" : "caihuafeng10" }
{ "_id" : ObjectId("4befb711b0e29ba1ce20e0bc"), "name" : "1616", "info" : { "url" : "
http://www.1616.net/ ", "city" : "beijing" } }
{ "_id" : ObjectId("4befb723b0e29ba1ce20e0bd"), "name" : "hao123", "info" : { "url" : "
http://www.hao123.com/ ", "city" : "beijing" } }
{ "_id" : ObjectId("4befb740b0e29ba1ce20e0be"), "name" : "ll4la", "info" : { "url" : "
http://www.114la.com/ ", "city" : "dongguan" } }
{ "_id" : ObjectId("4befc51ab0e29ba1ce20e0c2"), "firstname" : "cai", "lastname" : "huafeng" }


> db.data.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
E11000 duplicate key error index: recommender.data.$firstname_1_lastname_1  dup key: { : null, : null }


下面我们用另外一个表person来进行测试
> db.person.ensureIndex({firstname:1, lastname: 1},{unique: true});
> db.person.insert({firstname: 'cai', lastname: 'huafeng'});


第二次插入同样值的时候报错了,说明唯一索引生效了,其实跟MySQL里面是一样的。
> db.person.insert({firstname: 'cai', lastname: 'huafeng'});
E11000 duplicate key error index: recommender.person.$firstname_1_lastname_1  dup key: { : "cai", : "huafeng" }


6.唯一索引中的重复值处理
删除上述5中的索引,插入两行一样的记录


> db.person.dropIndexes();
{
        "nIndexesWas" : 2,
        "msg" : "non-_id indexes dropped for collection",
        "ok" : 1
}
> db.person.find();
{ "_id" : ObjectId("4befcda6b0e29ba1ce20e0cf"), "firstname" : "cai", "lastname" : "huafeng" }
> db.person.insert({firstname: 'cai', lastname: 'huafeng'});
> db.person.find();
{ "_id" : ObjectId("4befcda6b0e29ba1ce20e0cf"), "firstname" : "cai", "lastname" : "huafeng" }
{ "_id" : ObjectId("4befcef0b0e29ba1ce20e0d1"), "firstname" : "cai", "lastname" : "huafeng" }


如果现在直接在字段firstname及lastname上面创建唯一组合索 引的时候肯定会报错,我们来试一试:
> db.person.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
E11000 duplicate key error index: recommender.person.$firstname_1_lastname_1  dup key: { : "cai", : "huafeng" }


查看表person的索引,我们可以看到,新创建的索引没有生成。
> db.person.getIndexes();
[
        {
                "name" : "_id_",
                "ns" : "recommender.person",
                "key" : {
                        "_id" : 1
                }
        }
]


可以在第二个json对象加入一项dropDups: true,这样在创建唯一组合索引的时候不会报错,保留文档中第一个重复的值,其它重复的值均删除。


再次测试一下,加入dropDups选项,虽然报错了,但是唯一组合索引已经建立了。
> db.person.ensureIndex({firstname: 1, lastname: 1}, {unique: true, dropDups: true});
E11000 duplicate key error index: recommender.person.$firstname_1_lastname_1  dup key: { : "cai", : "huafeng" }
> db.person.getIndexes();
[
        {
                "name" : "_id_",
                "ns" : "recommender.person",
                "key" : {
                        "_id" : 1
                }
        },
        {
                "_id" : ObjectId("4befcfd9b0e29ba1ce20e0d3"),
                "ns" : "recommender.person",
                "key" : {
                        "firstname" : 1,
                        "lastname" : 1
                },
                "name" : "firstname_1_lastname_1",
                "unique" : true,
                "dropDups" : true
        }
]


再次查询表person中的记录,发现重复的记录已经自动删除了。
> db.person.find();
{ "_id" : ObjectId("4befcda6b0e29ba1ce20e0cf"), "firstname" : "cai", "lastname" : "huafeng" }


MongoDB官方文档的说明
A unique index cannot be created on a key that has duplicate values. If you would like to create the index anyway, keeping the first document the database indexes and deleting all subsequent documents that have duplicate values, add the dropDups option.


db.things.ensureIndex({firstname : 1}, {unique : true, dropDups : true})

 


7.删除索引
a.删除某个表中的所有索引
To delete all indexes on the specified collection:


    db.collection.dropIndexes();


b.删除某个表中的单一索引
To delete a single index:


    db.collection.dropIndex({x: 1, y: -1})

 


> db.data.dropIndex({firstname: 1, lastname: 1});
{ "nIndexesWas" : 6, "ok" : 1 }


Running directly as a command without helper:


// note: command was "deleteIndexes", not "dropIndexes", before MongoDB v1.3.2
// remove index with key pattern {y:1} from collection foo
db.runCommand({dropIndexes:'foo', index : {y:1}})
// remove all indexes:
db.runCommand({dropIndexes:'foo', index : '*'})


> db.person.ensureIndex({firstname: 1, lastname: 1});


> db.runCommand({dropIndexes:'person', index:{firstname:1, lastname:1}});
{ "nIndexesWas" : 2, "ok" : 1 }

 

 

转载自:http://blog.sina.com.cn/s/blog_5e0d59fb0100qscl.html

分享到:
评论

相关推荐

    MongoDB索引管理.pdf

    在 MongoDB 中,索引管理是优化查询性能的关键环节。以下是对 MongoDB 索引管理的深入探讨: 1. **查看索引** MongoDB 提供了多种方法来查看已创建的索引。通过 `getIndexes()` 方法,你可以获取到指定集合上的...

    MongoDB索引管理与高级索引.pdf

    本篇文章将详细探讨MongoDB中的索引管理以及高级索引概念。 1. **查看索引** MongoDB 提供了两种方法来查看集合上的索引。`db.COLLECTION_NAME.getIndexes()` 方法返回集合上所有索引的详细信息,而 `db.system....

    关于MongoDB索引管理-索引的创建、查看、删除操作详解

    在MongoDB中,索引的管理包括创建、查看和删除等操作,这些操作对于优化数据库性能至关重要。 1. **创建/重建索引** - **创建索引**:MongoDB 使用 `ensureIndex()` 方法创建新索引。例如,`db.COLLECTION_NAME....

    MongoDB学习笔记(六) MongoDB索引用法和效率分析

    MongoDB是一种流行的NoSQL数据库,它的索引机制与传统的关系型数据库类似,旨在提升查询和排序的速度。在MongoDB中,索引对于优化查询性能至关重要,尤其在处理大量数据时。下面将详细介绍MongoDB中不同类型的索引...

    MongoDB原理与实战-阿里云-张友东

    #### 五、MongoDB索引管理 **1.7 MongoDB索引原理** - **索引类型**: MongoDB支持多种索引类型,包括B-tree索引、唯一索引、复合索引等。 - **索引结构**: 索引使用B-tree结构,便于快速查找。 **1.7.1 MongoDB...

    mongodb搭建,shell操作,索引,副本集

    - **索引管理**:维护索引的健康状况,优化查询性能。 #### MongoDB复制 - **MongoDB中的复制**:通过副本集实现数据冗余和负载均衡。 - **复制原理**:主节点负责接收写入操作,其他节点作为副本进行数据同步。 - ...

    mongodb管理工具

    - 图形化管理:提供了可视化图表,如数据大小、索引性能等。 - 脚本支持:支持JavaScript脚本编写,便于自动化任务。 - 多语言:支持多种语言界面,方便全球用户使用。 2. **RockMongo** RockMongo是另一个开源...

    MongoDB索引的创建docx.pdf

    索引是数据库管理系统中的关键元素,它们能够显著提升查询性能,特别是在大型数据集上。在 MongoDB 中,索引的创建对于优化查询效率至关重要。以下是关于MongoDB创建索引的一些详细知识点: 1. **创建索引的方法**...

    MongoDB索引使用详解

    MongoDB索引是数据库性能优化的关键工具,它们类似于书籍的目录,可以帮助快速定位到所需的数据,从而大大提高查询效率。在没有索引的情况下,MongoDB必须遍历整个集合来找到匹配的文档,这在数据量大的时候会导致...

    [MongoDB权威指南].(美).霍多罗夫.(美).迪洛尔夫.(译)程显峰.扫描版

    #### 五、MongoDB索引管理 - **创建索引**:通过`createIndex()`方法创建索引,可以提高查询效率。 - **唯一索引**:确保索引字段的值是唯一的。 - **复合索引**:在一个索引中包含多个字段。 - **全文搜索索引**:...

    一款Linux、数据库、Redis、MongoDB统一管理平台.docx

    Linux、数据库、Redis、MongoDB 统一管理平台 一、Linux 统一管理平台 Linux 统一管理平台是基于 DDD(领域驱动设计)分层架构实现的,提供了 ssh 终端、文件查看和操作、脚本管理执行、进程操作、运行状态查看等...

    MongoDB命名索引和唯一索引.pdf

    总结来说,命名索引提供了更好的索引管理,让你可以为每个索引赋予有意义的名称。而唯一索引则确保了数据的唯一性,防止插入重复记录,这对于保持数据的完整性和一致性非常重要。在 MongoDB 中正确地使用这两种索引...

    RockMongo MongoDB数据库管理工具源码

    2. **易用性**:它提供了一个简洁的图形用户界面(GUI),用户可以通过浏览器访问并执行常见的数据库操作,如创建、查看、更新和删除数据,以及管理集合、索引和用户权限。 3. **安全连接**:RockMongo支持安全的SSL...

    mongodb 数据库添加TTL 索引,自动清理数据库

    MongoDB的一个核心功能是其索引机制,其中包括了时间对数据失效进行管理的TTL(Time To Live)索引。TTL索引能够让集合中的数据拥有一个固定的生命周期,当数据超过这个生命周期之后,相关文档会自动被删除,这对于...

    MongoDB入门到云上开发视频.zip

    网盘文件永久链接 目录 课时1:MongoDB数据库入门.mp4 课时2:MongoDB数据数据查询与分析.mp4 课时3:MongoDB数据库核心知识.mp4 ...课时11:MongoDB索引原理及使用.mp4 课时12:MongoDB Sharding原理与使用.mp4

    MongoDB简单索引.pdf

    MongoDB 是一种流行的开源文档数据库系统,以其灵活性和高性能而受到许多开发者的青睐。...在设计和管理MongoDB数据库时,应根据查询模式和数据特性,明智地创建和维护索引,以实现最佳的性能表现。

    MongoDB集群管理工具mongo3.zip

    mongo 是一款超酷的 MongoDB 集群管理...主要特性:非常容易管理你的 MongoDB 集群信息可以获取你配置的实时快照信息深入集群,数据库,集合和索引可以从单个 Web 界面管理所有的 MongoDB 文档 标签:mongo3

    mongoDB数据库WEB远程维护管理软件

    7. 图形化索引管理:创建、修改和删除索引,提升查询速度。 8. 集群管理:对于运行在集群环境中的MongoDB,这些工具可以提供集群状态的可视化,包括分片、复制集等。 TreeDMS-2.1.3可能是该Web管理工具的一个版本...

Global site tag (gtag.js) - Google Analytics