我们收到了很多关于索引的问题。这一部分解答了其中的一小部分。有几点要记住。
第一,MongoDB索引和MySQL索引非常相似并且对于MySQL的索引优化有很多也适用于MongoDB。
第二,更重要的是,这些索引的建议对你的应用提高也是有限的。
对于应用的最佳索引策略应该基于很多的重要因素。包含了你期望查询的类型,
数据读取与写入的比率,甚至于你服务器的空闲内存。意思就是,
需要对线上的产品做很多的测试剖析工作,才能调整出最佳的索引策略。
没有什么好的方法可以替代实际经验的。
注意: 如果你是个新手,建议阅读 read this introductory article first.
索引策略
下面有些索引的基本法则
创建的索引要匹配查询。
如果你仅仅要查询单个字段。索引这个字段即可。如
db.posts.find({ slug : 'state-of-mongodb-2010' })
这个例子中,唯一索引是最佳的
db.posts.ensureIndex({ slug: 1 }, {unique: true});
然而,一般都查询多个键并且排序结果。这种情况,组合索引是最佳的,例子如下
db.comments.find({ tags : 'mongodb'}).sort({ created_at : -1 });
创建的索引如下
db.comments.ensureIndex({tags : 1, created_at : -1});
要注意的是如果我们按照升序排序created_at。索引效率就低下了。
每个查询一个索引。
有的时候查询多个键,需要多个索引。在MongoDB中,这么做没问题。
如果你有个查询要匹配多个键,并且你想更有效地使用索引,请使用组合索引。
要确定所有的索引都在RAM中。
Shell中提供了一个查看索引大小的命令,如下:
db.comments.totalIndexSize();
65443
如果你的查询有点迟缓,你应该查看下索引是否都存入到RAM中了。
一个实例,如果你运行在4GB的RAM机器并且有3GB的索引,那么索引可能并不能全存在RAM中。
你需要添加RAM以及/或者校验实际的索引使用量。
要小心单键索引的低选择性。
假使你有个字段叫做'status',就有两个值new和processed。
如果在status上创建索引那么这就是个低选择性的索引。
意味着,查询中没有什么优势并且还占大量的空间。
一个更好一点的策略,当然依赖具体查询需求,可以创建组合索引包括这个低选择性的字段。
举例来说,你可以创建一个组合索引在status和created_at字段上。
另一个选择,当然也依赖你的需求,可以分离collection, 一个状态一个。
当然这些建议一定要进行测试,选择最优的方案。
使用explain.
MongoDB提供了一个explain命令,
用来查看查询的过程并且可以查看是否使用缩影。explain可以在驱动中使用,也可以在SHELL中使用:
db.comments.find({ tags : 'mongodb'}).sort({ created_at : -1 }).explain();
返回了很多有用的信息。包含了检索的条数,消耗的毫秒数,优化器尝试的索引以及最终所使用的索引。
如果你从来没有使用过explain,请开始使用吧。
理解explain的 输出.
explain输出主要有三个字段:
- cursor: 游标不是 BasicCursor就是 BtreeCursor. 第二种意味着使用了索引。
- nscanned: 扫描document的行数。
- n: 查询返回的行数。你希望n的值和nsanned值接近。要避免做collection的扫描,
- 也就是访问所有的document。
- millis: 查询完成的毫秒数。这个对于比较索引和非索引性能非常有用。
要关注应用读/写( read/write) 比率
这个很重要,因为,添加索引意味着添加,更新,删除操作变慢。
如果你的应用是偏向于读取,使用索引是非常好的事情。
但是如果你的应用偏向于写,那么创建索引就要小心了。增加索引都很影响写入的性能。
一般来说, 不要随便添加索引。索引应该按照你的查询来添加。
添加索引的理由总是很多的, 以及要进行大量的测试选择合适的索引策略。
索引特性
组合索引有许多特性要记住。
下面的例子都假想在 a, b, c上创建组合索引。因此创建索引语句如下
db.foo.ensureIndex({a: 1, b: 1, c: 1})
1. 排序的列一定要在索引的最后。
好的:
- find(a=1).sort(a)
- find(a=1).sort(b)
- find(a=1, b=2).sort(c)
不好的:
- find(a=1).sort(c)
- 即使c是索引的最后一列,a列是所使用的最后一列,因此你只能通过a或者b列进行排序。
2,3 ,4在1.6+已经不适用了。推荐使用1.6+以上版本。
5. MongoDB's $ne 或者$nin 操作在索因伤是无效的。
- 当要排除很少的documents。最好的方法就是在MongoDB查询出结果,在服务端进行排除。
相关推荐
同时,对于静态或已知的字段,通常建议使用传统的、明确的索引,以实现更高效的存储和查询。 总的来说,MongoDB的通配符索引为处理动态结构和复杂查询提供了便利,特别是在数据模式难以预知或频繁变化的场景下。...
1. **索引**:MongoDB支持多种类型的索引,包括通用辅助索引、唯一索引、复合索引和地理空间索引,可以实现快速查询。这使得数据检索效率得到提升。 2. **聚合**:MongoDB内置了MapReduce和其他聚合工具,允许用户...
MongoDB是一种流行的开源、...对于初学者,建议从安装开始,逐步学习数据插入、查询、更新和删除,然后探索索引、聚合、事务等进阶主题。随着对MongoDB的熟练掌握,你将能够利用其强大功能构建高效、可扩展的应用程序。
10. 性能优化:根据你的具体需求,可以调整MongoDB的性能设置,如内存使用、索引策略和复制集配置。 MongoDB 7.0.0版本可能引入了新的特性、改进和修复,因此在升级前,建议阅读官方文档,了解新版本的详细信息和...
3. 高性能:MongoDB支持索引、查询优化和内存映射文件,能快速处理大量读写操作。在32位系统上,虽然内存限制可能会影响性能,但通过合理配置和数据管理,仍然可以实现高效运行。 4. 高可用性:MongoDB支持复制集,...
MongoDB是一款高性能、开源、无...对于新项目,建议使用最新稳定版本的MongoDB,以获得更好的性能、安全性和社区支持。然而,如果你的项目已经基于旧版本并且运行良好,没有升级需求,那么保持现状可能是更明智的选择。
书中还提供了MongoDB官方文档的链接,用户可以通过这些资源来获取更多关于MongoDB架构、操作最佳实践以及MongoDB OpsManager和CloudManager等工具的使用帮助。 本书主要针对那些自己管理一切的用户,但MongoDB官方...
为了确保 MongoDB 系统的高性能,需要考虑多个关键维度,包括硬件、应用程序模式、 schema 设计和索引、磁盘 I/O、 Amazon EC2 和性能基准测试等。 硬件 在 MongoDB 中,硬件是影响性能的重要因素。选择合适的硬件...
数据结构设计是数据库设计的重要一环,这部分内容提供了关于如何在MongoDB中合理设计数据模型的建议和最佳实践。 ### **38. 设计概览(Design Overview)** 设计概览从整体角度介绍了MongoDB的设计理念和架构特点,...
2. 硬件:尽管MongoDB可以在各种硬件配置上运行,但为了获得最佳性能,建议至少有足够的内存来容纳数据库工作集,并且硬盘应具备良好的I/O性能,SSD是更好的选择。 3. 软件:对于Linux,确保系统已安装必要的库(如...
在文档的最后部分,还包含了一个关于MongoDB的常见问题解答(FAQ),这些问题通常来自用户反馈,包括关于MongoDB基础、应用程序开发、mongo shell、并发处理、分片、复制及副本集、存储、索引和诊断等多方面的问题和...
- **索引类型**:介绍了MongoDB支持的几种索引类型及其特点。 #### 索引概念 - **单字段索引**:讲解了如何为单个字段创建索引。 - **复合索引**:说明了如何为多个字段创建复合索引。 - **唯一索引**:讨论了唯一...
9. **性能调优**:提供性能监控、日志分析、硬件选择和配置建议,帮助优化MongoDB实例的运行效率。 10. **应用程序接口API**:探讨MongoDB的驱动程序,包括MongoDB的官方驱动和社区驱动,以及如何在各种编程语言中...
1. **官方文档**: 强烈建议读者参考MongoDB官方网站提供的详尽文档。 2. **论坛和邮件列表**: 可以加入MongoDB的社区论坛和邮件列表,与其他开发者交流经验。 3. **培训和认证**: 提供了关于MongoDB培训课程和认证...
为了获得更好的性能和兼容性,建议在64位的操作系统上安装64位的MongoDB版本。MongoDB支持多平台运行,用户可以在其官方网站下载对应操作系统的安装包或压缩包。在安装过程中,需要设置数据目录和日志文件目录,并...
10. **自动化运维**:MongoDB 4.2在自动化运维方面也有所提升,比如自动故障检测和恢复,以及更智能的自调整索引构建策略。 在下载MongoDB 4.2.6资源时,通常会包含服务器二进制文件、安装指南、配置文件示例、许可...