持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
$lookup
MongoDB 5.0 版本新功能,解释结果包括使用$lookup 管道阶段。包含这些执行的统计信息。必须在executionStages或allPlansExecution模式中执行。
'$lookup': {
from: <string>,
as: <string>,
localField: <string>,
foreignField: <string>
},
totalDocsExamined: <long>,
totalKeysExamined: <long>,
collectionScans: <long>,
indexesUsed: [ <string_1>, <string_2>, ..., <string_n> ],
nReturned: <long>,
executionTimeMillisEstimate: <long>
| key | 描述 |
|---|---|
totalDocsExamined | 扫描文档数 |
totalKeysExamined | 扫描索引键数 |
collectionScans | 查询执行期间发生集合扫描的次数 |
indexesUsed | 查询使用的索引名称 |
nReturned | 符合条件的文档数 |
executinoTimeMillisEstimate | 查询执行的预估时间,单位:毫秒 |
Stage状态
| 状态 | 描述 |
|---|---|
COLLSCAN | 全表扫描 |
IXSCAN | 索引扫描 |
FETCH | 根据索引索引扫描指定文档 |
SHARD_MERGE | 讲各个分片数据进行合并 |
SORT | 在内存中进行了排序 |
LIMIT | 使用$limit 限制返回数 |
SKIP | 使用$skip 跳过 |
IDHACK | _id 查询 |
SHARDING_FILTER | mongos分片查询 |
COUNTSCAN | count 不使用index 进行count |
COUNT_SCAN | count 使用index 进行count |
SUBPLA | 未使用到索引的$or 查询 |
TEXT | 使用全文检索查询 |
PROJECTION | 限制字段返回 |
执行计划的结果中尽量不要出现以下stage:
COLLSCAN- 无索引的
SORT - 不合理的
SKIP SUBPLA未用到索引的$orCOUNTSCAN不使用索引的的计数
覆盖查询
由于所有出现在查询中的字段是索引的一部分,Mongodb无需通过文档扫描匹配查询的结果,因为扫描索引比扫描文档要快的多。而解释结果只有IXSCAN,而不是包含后续的FETCH ,并且totalDocsExamined = 0 。
- 所有的查询字段是索引的一部分
- 所有的查询返回字段在同一个索引中
索引交集
Mongodb 可以使用多个索引的交集来完成查询。通常,每个索引交集涉及到两个索引。结果将包含一个AND_SORTED阶段或者一个AND_HASH 阶段。
例如:
{
stage : 'AND_SORTED',
inputStages : [
{
stage : 'IXSCAN',
...
},
{
stage : 'IXSCAN',
...
}
]
}
$or
如果查询中使用了$or 表达式,并包含索引。结果将返回一个OR 阶段
{
stage: 'OR',
inputStages: [
{
stage: 'IXSCAN',
...
},
{
stage : 'IXSCAN',
...
},
...
]
}