如何在mongodb中修复非常慢的查询

时间:2019-01-23 11:20:25

标签: mongodb

  • MongoDB Shell版本v4.0.5

:查询非常慢|花时间在获取|数据大小:一个集合中有2-3百万个文档,大约有13-15个这样的集合。

  • 系统配置

:体系结构:  x86_64 CPU操作模式:  32位,64位字节顺序:  小字节序CPU:  6个在线CPU列表:  每个核心0-5个线程:  每个插槽1个核:  6个插座:  1个NUMA节点:  1个供应商ID:  正版英特尔CPU系列:  6型号:  79步进:  1个CPU MHz:  2097.570 BogoMIPS:  4195.14系统管理程序供应商:  VMware虚拟化类型:  完整的一级缓存:  32K L1i缓存:  32K L2快取:  256K L3快取:  20480K NUMA节点0个CPU:0-5

MemTotal:16432268 kB

我已经完成了对表的索引编制,并且工作正常,但系统仍然花费大量时间:

查询:

db.vnms_vccells_5.find({auid:"<1e000097>",
        hub_ip:"10.252.0.105",sector_ip:"<1e000046>", 
        last_updated_time:{$gt:"2016-12-24 05:49:00"}})
    .explain("executionStats")

以下是查询计划器:

{
    "queryPlanner": {
        "plannerVersion": 1,
        "namespace": "opennms.vnms_vccells_5",
        "indexFilterSet": false,
        "parsedQuery": {
            "$and": [{
                "auid": {
                    "$eq": "<1e000097>"
                }
            }, {
                "hub_ip": {
                    "$eq": "10.252.0.105"
                }
            }, {
                "sector_ip": {
                    "$eq": "<1e000046>"
                }
            }, {
                "last_updated_time": {
                    "$gt": "2016-12-24 05:49:00"
                }
            }]
        },
        "winningPlan": {
            "stage": "FETCH",
            "inputStage": {
                "stage": "IXSCAN",
                "keyPattern": {
                    "auid": 1,
                    "hub_ip": 1,
                    "sector_ip": 1,
                    "last_updated_time": -1
                },
                "indexName": "auid_1_hub_ip_1_sector_ip_1_last_updated_time_-1",
                "isMultiKey": false,
                "multiKeyPaths": {
                    "auid": [],
                    "hub_ip": [],
                    "sector_ip": [],
                    "last_updated_time": []
                },
                "isUnique": false,
                "isSparse": false,
                "isPartial": false,
                "indexVersion": 2,
                "direction": "forward",
                "indexBounds": {
                    "auid": ["[\"<1e000097>\", \"<1e000097>\"]"],
                    "hub_ip": ["[\"10.252.0.105\", \"10.252.0.105\"]"],
                    "sector_ip": ["[\"<1e000046>\", \"<1e000046>\"]"],
                    "last_updated_time": ["({}, \"2016-12-24 05:49:00\")"]
                }
            }
        },
        "rejectedPlans": []
    },
    "executionStats": {
        "executionSuccess": true,
        "nReturned": 28788,
        "executionTimeMillis": 34989,
        "totalKeysExamined": 28788,
        "totalDocsExamined": 28788,
        "executionStages": {
            "stage": "FETCH",
            "nReturned": 28788,
            "executionTimeMillisEstimate": 34475,
            "works": 28789,
            "advanced": 28788,
            "needTime": 0,
            "needYield": 0,
            "saveState": 1039,
            "restoreState": 1039,
            "isEOF": 1,
            "invalidates": 0,
            "docsExamined": 28788,
            "alreadyHasObj": 0,
            "inputStage": {
                "stage": "IXSCAN",
                "nReturned": 28788,
                "executionTimeMillisEstimate": 7730,
                "works": 28789,
                "advanced": 28788,
                "needTime": 0,
                "needYield": 0,
                "saveState": 1039,
                "restoreState": 1039,
                "isEOF": 1,
                "invalidates": 0,
                "keyPattern": {
                    "auid": 1,
                    "hub_ip": 1,
                    "sector_ip": 1,
                    "last_updated_time": -1
                },
                "indexName": "auid_1_hub_ip_1_sector_ip_1_last_updated_time_-1",
                "isMultiKey": false,
                "multiKeyPaths": {
                    "auid": [],
                    "hub_ip": [],
                    "sector_ip": [],
                    "last_updated_time": []
                },
                "isUnique": false,
                "isSparse": false,
                "isPartial": false,
                "indexVersion": 2,
                "direction": "forward",
                "indexBounds": {
                    "auid": ["[\"<1e000097>\", \"<1e000097>\"]"],
                    "hub_ip": ["[\"10.252.0.105\", \"10.252.0.105\"]"],
                    "sector_ip": ["[\"<1e000046>\", \"<1e000046>\"]"],
                    "last_updated_time": ["({}, \"2016-12-24 05:49:00\")"]
                },
                "keysExamined": 28788,
                "seeks": 1,
                "dupsTested": 0,
                "dupsDropped": 0,
                "seenInvalidated": 0
            }
        }
    },
    "serverInfo": {
        "host": "vnms",
        "port": 27017,
        "version": "4.0.5",
        "gitVersion": "3739429dd92b92d1b0ab120911a23d50bf03c412"
    },
    "ok": 1
}

mongostat数据:

insert query update delete getmore command dirty  used flushes vsize   res qrw arw net_in net_out conn                time
    *0    *0     *0     *0       0     3|0  0.0% 80.0%       0 5.26G 3.52G 0|0 3|0   254b    101k    7 Jan 23 10:20:41.082

1 个答案:

答案 0 :(得分:0)

查询性能受到资源的限制。这里有一些提示

  1. 按照Operations Checklists来检查资源。
  2. 从查询计划来看,不仅获取文档很慢,而且检查索引键也很慢。您需要Ensure Indexes Fit in RAM
  3. 应用其他随机索引无济于事,并且可能导致大量页面错误。您可以使用$indexStats来检查索引的使用情况。
  4. 尝试MongoDB的Cloud Manager来帮助收集性能指标。它提供免费试用。
  5. 从查询角度出发,仅投影所需的字段,而不是获取整个文档。