前言
MongoDB 是开发人员和企业级用户中非关系型数据库(NoSQL)的一种。 其负载顶峰的性能和灵活的数据建模是其最大的优点之一。为了简单化,MongoDB 数据库使用了诸如 “集合” 和“文档” 等术语。 集合是非结构化的数据读写机制,可以像其他面向对象语言一样使用。这篇文章将着重介绍 MongoDB 中如何使用索引尽可能地提高性能。
索引的作用
简单地说,索引就是一种数据结构。 最常见的索引类型是 B 树(也称为 B- 树)。 可以将 B 树想象为一种分层数据结构,每一层用来存储文档的键值 - 并按照计算机算法的一定规则进行排序。 它的核心思想在于,提高数据存储和引用时搜索的效率。
MongoDB 中,索引有如下作用:
- 权衡查询性能和写性能;
- 提高查询性能;
- 防止使用大的全表扫描。
创建索引
创建索引的命令是 db.collection.createIndex( keys, options )
,其中 keys 指定要创建索引的字段,options 指定了额外选项,如是否唯一、是否稀疏等。
示例代码:
db.collection.createIndex( { name: 1 } );
我们可以使用 explain() 函数对我们的查询进行分析,以了解它们如何调用索引。
示例代码:
db.collection.find( { name: "Tom" } ).explain();
通过从 MongoDB shell 提供的输出,我们可以简要了解使用索引的详情信息,如:是否执行了索引扫描,查找条目统计信息等。
索引类型
1. 单字段索引
MongoDB 中最基本的索引类型是单字段索引,它基于一个字段来创建一组键值对,我们可以使用该索引类型来满足进行指定字段排序、限制查询数据集数量等需求。
示例代码:
db.collection.createIndex( { name: 1 } );
2. 联合索引
如果一个查询语句使用多个字段查询,我们可以使用复合索引来避免全表扫描。复合索引基于多个字段,它们在索引中相对顺序对结果有影响。您应该优先考虑选择最可能过滤结果的字段顺序,优化查询性能。
示例代码:
db.collection.createIndex( { name:1, age:1 } );
3. 多键索引
如果索引字段的值是一个数组,则创建的索引就是一个多键索引。多键索引能够提高查找数组和嵌入式文档的效率,但是这种索引的条目数量有可能是很大的。数组中的每个值都会存到索引中,如果该数组中的值重复,索引中会留下多个条目。
示例代码:
db.collection.createIndex( { tags: 1 } );
4. 父子文档索引
在 MongoDB 中,我们也可以以树形的方式组织数据集。 MongoDB 支持一种被称为级联索引技术的技术,它基于树形文档层次结构中具有父级-子级关系的键。 父子索引作用与普通索引同样。我们可以基于父级的键值和子级的键值来查找数据集。
示例代码:
db.collection.createIndex( { parentID: 1, childID: 1 } );
索引的使用注意点
- 不要过度索引,建议在开始阶段先创建一个可行的索引,随着数据集的不断增长,再根据表现和需求创建额外的索引。
- 索引会与更新、插入、删除等操作同时发生,因此在修改数据时,需要更新索引,如果需要大量的写操作,粗粒度的索引会更有效。
- 索引使得查询有时只需要访问 B 树的一小部分,但是,如果结果数据集太大,就可能是低效的,这时需要使用复合索引、索引重建等技术来优化查询。
- 如果使用过多的复合索引,可能会导致 MongoDB 服务器缓存任一索引字段的数据变得困难,推荐选择索引,以优化常见的查询场景。
总结
本文介绍了 MongoDB 中使用索引提高性能的方法。索引在数据集中起着非常重要的作用,能帮助避免性能问题和数据扫描等操作,但是如果过度使用,可能会导致性能问题和存储空间浪费。我们需要仔细分析我们的数据集和业务,以选择恰当的索引,以获得更好的性能和更高的可靠性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/649e3db448841e9894ac5785