使用索引提高mongoDB的性能 - amit


在本文中,我将尝试介绍使用 INDEXING 实现大规模性能的关键考虑因素。
MongoDB 中的索引
在任何数据库中,索引都支持查询的高效执行。如果没有它们,数据库必须扫描集合或表中的每个文档以选择与查询语句匹配的文档。如果查询存在合适的索引,则数据库可以使用该索引来限制它必须检查的文档数量。
MongoDB 提供了广泛的索引类型和功能以及特定于语言的排序顺序,以支持对数据的复杂访问模式。MongoDB 索引可以按需创建和删除以适应不断变化的应用程序需求和查询模式,并且可以在文档中的任何字段上声明,包括嵌套在数组中的字段。
 
使用复合索引
复合索引是由几个不同的字段组成的索引。例如,不是在“姓氏”上有一个索引而在“名字”上有另一个索引,如果您对两个名字进行查询,创建一个同时包含“姓氏”和“名字”的索引通常是最有效的. 复合索引仍可用于过滤仅指定姓氏的查询。
 
遵循 ESR 规则
对于复合索引,ESR 经验法则有助于决定索引中字段的顺序:

  1. 添加那些运行 Equality 查询的字段(过滤阶段或匹配阶段)
  2. 下一个要索引的字段应反映查询的排序顺序(排序阶段)
  3. 最后一个字段表示要访问的数据范围(项目阶段) 

 
尽可能使用覆盖查询
  • 覆盖查询直接从索引返回结果,而无需访问源文档,因此非常高效。
  • 对于要覆盖的查询,过滤、排序和/或返回给客户端所需的所有字段都必须存在于索引中。要确定查询是否为覆盖查询,请使用 Explain() 方法。如果explain() 输出显示totalDocsExamined 为0,这表明查询被索引覆盖。
  • 尝试实现覆盖查询时的一个常见问题是默认情况下始终返回 _id 字段。您需要从查询结果中明确排除它,或者将其添加到索引中。
  • 在分片集群中,MongoDB 内部需要访问分片键的字段。这意味着只有当分片键是索引的一部分时才可能进行覆盖查询。无论如何,这样做通常是个好主意。

请注意“消除不必要的索引” 索引是资源密集型的:即使在 MongoDB WiredTiger 存储引擎中进行压缩,它们也会消耗 RAM 和磁盘。随着字段的更新,必须维护关联的索引,从而产生额外的 CPU 和磁盘 I/O 开销。
 
利用多键索引查询数组
如果您的查询模式需要访问单个数组元素,请使用多键索引。MongoDB 为数组中的每个元素创建一个索引键,并且可以在包含标量值和嵌套文档的数组上构造。
推荐的索引伴随着样本查询,按查询形状(即具有类似谓词结构、排序和投影的查询)分组,这些查询是针对将受益于添加建议索引的集合运行的。