初始化数据
var names = [""]; for (var i = 0; i < 100; i++) { var user = { "id": i, "name": "路人甲" + i%10, "age": i%50, "bestFriend": { "name": "路人甲" + (i+1)%10 } }; db.user.insert(user); }
1.使用
1)创建
db.collection.ensureIndex(keypattern[,options]);
e.g.
//普通索引,1升序,-1降序 db.user.ensureIndex({"name": 1}); //联合索引 db.user.ensureIndex({"age": 1, "name": 1}); //内嵌文档索引 db.user.ensureIndex({"bestFriend.name": 1});
--索引名称
默认情况下,索引名为keyname1_dir1_..._keynameN_dirN,e.g. age_1_name_1。可以在options中指定索引名称。e.g.
db.user.ensureIndex({"age": 1, "name": 1}, {"name": "idx_age_name"});
2)创建索引时要考虑的问题
--会做什么样的查询,其中哪些键需要索引
--每个键的索引方向是怎样的
--如何应对扩展,有没有不同的键的排列可以使常用数据更多地保留在内存中
3)options唯一索引unique,消除重复dropDups
//唯一索引 db.user.ensureIndex({"id": 1}, {"name": "idx_id", "unique": true}); //唯一索引,存在重复,报错 db.user.ensureIndex({"name": 1, "age": 1}, {"name": "idx_name_age", "unique": true}); //唯一索引,存在重复,保留发现的第一个文档,删除其它有重复值的文档 db.user.ensureIndex({"name": 1, "age": 1}, {"name": "idx_name_age", "unique": true, "dropDups": true});
4)options后台创建索引background
db.user.ensureIndex({"name": 1, "age": 1}, {"background": true});
可以在创建索引的时候正常处理请求。否则,数据库将会阻塞建立索引期间的所有请求。
5)删除索引
db.runCommand({"dropIndexes": "user", "index": "idx_name_age"});
2.索引管理
索引的元数据信息存储在每个数据库的system.indexes集合中。这是一个保留集合,不能对其插入或者删除文档。操作只能通过ensureIndex和dropIndexes进行。
除此之外,每个数据库的system.namespaces集合也包含有索引的名字。
3.explain和hint
1)explain:用于获取查询的相关信息
db.user.find().explain(); { "cursor" : "BasicCursor", "isMultiKey" : false, "n" : 50, "nscannedObjects" : 50, "nscanned" : 50, "nscannedObjectsAllPlans" : 50, "nscannedAllPlans" : 50, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 0, "nChunkSkips" : 0, "millis" : 0, "indexBounds" : { }, "server" : "SIYUAN-PC:27017" } db.user.find({"name": "路人甲"}).explain(); { "cursor" : "BtreeCursor name_1_age_1", "isMultiKey" : false, "n" : 0, "nscannedObjects" : 0, "nscanned" : 0, "nscannedObjectsAllPlans" : 0, "nscannedAllPlans" : 0, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 0, "nChunkSkips" : 0, "millis" : 0, "indexBounds" : { "name" : [ [ "路人甲", "路人甲" ] ], "age" : [ [ { "$minElement" : 1 }, { "$maxElement" : 1 } ] ] }, "server" : "SIYUAN-PC:27017" }
--cursor:查询是否使用索引
--n:返回文档的数量
--nscanned:数据库查找了多少个文档
--millis:数据库执行查询的时间
更多字段解析请查看 http://docs.mongodb.org/manual/reference/method/cursor.explain/
2)hint:强制使用某个索引
//hint中指定的索引必须存在,否则会报错 db.user.find().hint({"name": 1}).explain(); Fri Mar 14 17:22:16.882 error: { "$err" : "bad hint", "code" : 10113 } at src/mongo/shell/query.js:128 db.user.find().hint({"name": 1, "age": 1}).explain(); { "cursor" : "BtreeCursor name_1_age_1", "isMultiKey" : false, "n" : 50, "nscannedObjects" : 50, "nscanned" : 50, "nscannedObjectsAllPlans" : 50, "nscannedAllPlans" : 50, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 0, "nChunkSkips" : 0, "millis" : 0, "indexBounds" : { "name" : [ [ { "$minElement" : 1 }, { "$maxElement" : 1 } ] ], "age" : [ [ { "$minElement" : 1 }, { "$maxElement" : 1 } ] ] }, "server" : "SIYUAN-PC:27017" }
4.地理空间索引
地理空间索引对应的键的值必须是某种形式的一对值:一个包含两个元素的数组或是包含两个键的内嵌文档,e.g.
"gps": [100, 100] "gps": {"x": 50, "y": 50} "gps": {"latitude": -50, "longitude": -50}
默认情况下,地理空间索引值的范围是-180~180,可以通过ensureIndex的选项来指定范围,e.g.
db.shop.insert({"name": "真功夫", "gps": [100, 100], "categories": ["餐饮", "外卖"]}); db.shop.insert({"name": "KFC", "gps": {"x": 50, "y": 50}, "categories": ["餐饮", "外卖"]}); db.shop.insert({"name": "小肥羊", "gps": {"latitude": -50, "longitude": -50}, "categories": ["餐饮", "火锅"]}); //创建索引 db.shop.ensureIndex({"gps": "2d"}); //报错, db.shop.insert({"name": "沃尔玛", "gps": [200, -50], "categories": ["超市"]}); //创建索引 db.runCommand({"dropIndexes": "shop", "index": "gps_2d"}); db.shop.ensureIndex({"gps": "2d"}, {"min": -1800, "max": 1800}); //报错, db.shop.insert({"name": "沃尔玛", "gps": [200, -50], "categories": ["超市"]});
--查询:由近及远排序
db.shop.find({"gps": {"$near": [40, 40]}}); db.runCommand({"geoNear": "shop", near: [40, 40]});
--查找指定方位形状内的文档
//矩形 db.shop.find({"gps": {"$within": {"$box": [[40, 40], [60, 60]]}}}); //圆 db.shop.find({"gps": {"$within": {"$center": [[40, 40], 20]}}});
相关推荐
- **索引键长度限制**:从 MongoDB 2.6 版本开始,如果索引字段值超出索引键长度限制,MongoDB 不会创建该索引。这防止了因过长的键值导致的资源浪费。 - **插入文档限制**:如果插入文档的索引字段值超过限制,...
在 MongoDB 中,索引管理是优化查询性能的关键环节。以下是对 MongoDB 索引管理的深入探讨: 1. **查看索引** MongoDB 提供了多种方法来查看已创建的索引。通过 `getIndexes()` 方法,你可以获取到指定集合上的...
MongoDB是一种流行的NoSQL数据库,它的索引机制与传统的关系型数据库类似,旨在提升查询和排序的速度。在MongoDB中,索引对于优化查询性能至关重要,尤其在处理大量数据时。下面将详细介绍MongoDB中不同类型的索引...
SpringBoot MongoDB 索引冲突分析及解决方法 SpringBoot MongoDB 索引冲突分析及解决方法是 SpringBoot 应用程序中 MongoDB 索引冲突的解决方法。该方法主要通过spring-data-mongo 实现基于 MongoDB 的 ORM-...
MongoDB索引是数据库性能优化的关键工具,它们类似于书籍的目录,可以帮助快速定位到所需的数据,从而大大提高查询效率。在没有索引的情况下,MongoDB必须遍历整个集合来找到匹配的文档,这在数据量大的时候会导致...
#### MongoDB索引 - **介绍**:索引能够显著提高查询性能,MongoDB支持单字段索引、复合索引、唯一索引等多种类型的索引。 - **后台创建索引**:可以在运行时创建索引,而无需停止服务。 - **索引类型**: - **单...
MongoDB 数据库索引介绍 MongoDB 数据库索引是提高查询性能和减少查询时间的重要手段。索引可以告诉 MongoDB 如何高效地检索数据,以便快速地找到所需的数据。在本文中,我们将深入探讨 MongoDB 数据库索引的基础...
MongoDB的索引是数据库性能优化的关键因素,与MySQL、Oracle等关系型数据库中的索引原理相似,但具有自身的特性和限制。MongoDB的索引建立在Collection(表)级别,采用B-树数据结构来加速查询和排序操作。 1. 默认...
本篇文章将详细探讨MongoDB中的索引管理以及高级索引概念。 1. **查看索引** MongoDB 提供了两种方法来查看集合上的索引。`db.COLLECTION_NAME.getIndexes()` 方法返回集合上所有索引的详细信息,而 `db.system....
索引是 MongoDB 中的关键概念,它们能够显著提升查询性能。本篇资料主要涵盖了 MongoDB 的索引使用和查询分析,以下是对这些知识点的详细解释: 1. **explain操作**:`explain` 是 MongoDB 提供的一个命令,用于...
在 MongoDB 中,索引的创建对于优化查询效率至关重要。以下是关于MongoDB创建索引的一些详细知识点: 1. **创建索引的方法**: MongoDB 使用 `ensureIndex()` 方法来创建索引。尽管在较新的版本中,`createIndex()...
索引是提升查询性能的关键工具,本文将详细介绍MongoDB中的索引基础知识、唯一索引、索引参数以及如何通过`explain`分析查询速度。 一、索引基础 在MongoDB中,索引是一种特殊的数据结构,它们对集合中的一列或多...
MongoDB是一个基于文档的NoSQL数据库,由C++语言编写,旨在为大量分布式数据提供高性能、高可用...6. **索引**:支持多种类型的索引,以优化查询性能。 7. **灵活的聚合框架**:MongoDB的聚合框架允许用户执行复杂的数
在MongoDB中,索引扮演着至关重要的角色,它类似于传统的关系型数据库,通过B-Tree数据结构加速数据查找和排序。 ### 一、索引简介 MongoDB 的索引可以通过`ensureIndex()`函数创建,指定一个或多个字段来提升查询...
MongoDB数据库
1. 普通索引 1. 单列索引 2. 多列索引 3. 子文档索引 2. 唯一索引 3. 稀疏索引 4. 哈希索引 5. 重建索引 6. 删除索引 7. 查看索引