优化查询性能
如需排查查询速度缓慢问题,请使用查询解释获取查询执行计划和运行时执行配置文件。以下部分介绍了您可以根据执行配置文件采取哪些步骤来优化查询性能:限制结果数
使用执行树中的“返回的记录数”字段来确定查询是否返回了大量文档。考虑使用 $limit
子句限制返回的文档数量。这样可以减小通过网络返回给客户端的结果的序列化字节大小。如果 Limit
节点前面是 MajorSort
节点,查询引擎可以合并 Limit
和 MajorSort
节点,并使用 TopN 排序替换完整的内存中具体化和排序,从而降低查询的内存要求。
限制结果文档大小
考虑使用 $project
子句限制返回的文档的大小,以避免提取不必要的字段。这有助于降低处理中间结果的计算和内存成本,以及通过网络返回给客户端的结果的序列化字节大小。如果查询中引用的所有字段都包含在常规索引(而非多键索引)中,则查询也可以完全由索引扫描覆盖,从而避免需要从主存储空间中提取文档。
使用索引
请按照以下说明设置和优化索引。
确定查询是否使用了索引
您可以通过检查执行树中的叶节点来确定查询是否使用了索引。如果执行树的叶节点是 TableScan 节点,则表示查询未使用索引,而是扫描主存储空间中的文档。如果正在使用索引,执行树的叶节点将显示索引的索引 ID 和索引字段。
确定所用索引是否可以优化
如果索引可以减少查询引擎需要从主存储空间中提取的文档数量,或者其字段排序可以满足查询的排序要求,则该索引对查询很有用。
如果查询使用了索引,但查询引擎仍在提取和舍弃许多文档(如通过以下方式识别:扫描节点返回许多记录,随后过滤节点返回少量记录),则表明使用索引满足的查询谓词不具有选择性。如需创建更合适的索引,请参阅创建索引。
如果查询使用非多键索引,但查询引擎仍在对结果集执行内存中重新排序(如查询执行树中的 MajorSort 节点所标识的那样),则表明所使用的索引无法满足查询的排序要求。如需创建更合适的索引,请参阅下一部分。
创建索引
按照索引管理文档创建索引。 为确保查询可以使用索引,请按以下顺序创建包含字段的常规(非多键)索引:
- 将用于等式运算符的所有字段。为了最大限度地提高在不同查询中重复使用索引的机会,请按字段在查询的等值运算符中出现的次数降序排列字段。
- 将用于排序的所有字段(按相同顺序)。
- 将按查询限制条件的严苛程度降序排列的范围或不等式运算符中使用的字段。
- 将作为索引中查询的一部分返回的字段:在索引中包含此类字段可让索引涵盖查询,并避免必须从主存储空间中提取文档。
对于涉及过滤和排序数组字段的查询,请考虑创建多键索引。
使用查询提示
如果您已为查询创建了更合适的索引,但查询引擎未使用该索引,则可以使用查询提示来替换查询引擎的索引偏好设置。