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