MongoDB查询优化

我的天呢,最近用MongoDB存储了22G的数据到数据库中,但查询速度太慢了,龟速,任何人都忍受不了。

要解决这个问题,最简单的办法就是创建索引。

后来发现在执行mongo查询时,是直接集合扫描,这样就要扫描1711929个集合,不是扫描索引的。

数据集采用的ftp://ftp.argo.org.cn/pub/ARGO/global/上的所有数据,

条件查询(耗时之久)

>db.argodata.find({"DATE":"2016-01-10"},{"LONGITUDE":1,"LATITUDE":1}).explain(true)
{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "argo.argodata",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "DATE" : {
                "$eq" : "2016-01-10"
            }
        },
        "winningPlan" : {
            "stage" : "PROJECTION",
            "transformBy" : {
                "LONGITUDE" : 1,
                "LATITUDE" : 1
            },
            "inputStage" : {
                "stage" : "COLLSCAN",
                "filter" : {
                    "DATE" : {
                        "$eq" : "2016-01-10"
                    }
                },
                "direction" : "forward"
            }
        },
        "rejectedPlans" : [ ]
    },
    "executionStats" : {
        "executionSuccess" : true,
        "nReturned" : 447,
        "executionTimeMillis" : 199285,
        "totalKeysExamined" : 0,
        "totalDocsExamined" : 1711929,
        "executionStages" : {
            "stage" : "PROJECTION",
            "nReturned" : 447,
            "executionTimeMillisEstimate" : 198617,
            "works" : 1711931,
            "advanced" : 447,
            "needTime" : 1711483,
            "needYield" : 0,
            "saveState" : 15789,
            "restoreState" : 15789,
            "isEOF" : 1,
            "invalidates" : 0,
            "transformBy" : {
                "LONGITUDE" : 1,
                "LATITUDE" : 1
            },
            "inputStage" : {
                "stage" : "COLLSCAN",
                "filter" : {
                    "DATE" : {
                        "$eq" : "2016-01-10"
                    }
                },
                "nReturned" : 447,
                "executionTimeMillisEstimate" : 198375,
                "works" : 1711931,
                "advanced" : 447,
                "needTime" : 1711483,
                "needYield" : 0,
                "saveState" : 15789,
                "restoreState" : 15789,
                "isEOF" : 1,
                "invalidates" : 0,
                "direction" : "forward",
                "docsExamined" : 1711929
            }
        },
        "allPlansExecution" : [ ]
    },
    "serverInfo" : {
        "host" : "host-192-168-116-21",
        "port" : 27017,
        "version" : "3.4.4",
        "gitVersion" : "888390515874a9debd1b6c5d36559ca86b44babd"
    },
    "ok" : 1
}
 

从执行结果中可以看出,  "executionTimeMillis" : 199285,超过3多钟, "totalDocsExamined" : 1711929,扫描文件数量1711929个。如果在实际开发中,也要耗时这么久,谁愿意用你的产品啊

创建索引:(按需所建,以所需关键字去建立索引)

> db.argodata.ensureIndex({"DATE":1})
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}
 

创建索引之后,再次查询

> db.argodata.find({"DATE":"2016-01-10"},{"LONGITUDE":1,"LATITUDE":1}).explain(true).executionStats
{
    "executionSuccess" : true,
    "nReturned" : 447,
    "executionTimeMillis" : 85,
    "totalKeysExamined" : 447,
    "totalDocsExamined" : 447,
    "executionStages" : {
        "stage" : "PROJECTION",
        "nReturned" : 447,
        "executionTimeMillisEstimate" : 71,
        "works" : 448,
        "advanced" : 447,
        "needTime" : 0,
        "needYield" : 0,
        "saveState" : 4,
        "restoreState" : 4,
        "isEOF" : 1,
        "invalidates" : 0,
        "transformBy" : {
            "LONGITUDE" : 1,
            "LATITUDE" : 1
        },
        "inputStage" : {
            "stage" : "FETCH",
            "nReturned" : 447,
            "executionTimeMillisEstimate" : 71,
            "works" : 448,
            "advanced" : 447,
            "needTime" : 0,
            "needYield" : 0,
            "saveState" : 4,
            "restoreState" : 4,
            "isEOF" : 1,
            "invalidates" : 0,
            "docsExamined" : 447,
            "alreadyHasObj" : 0,
            "inputStage" : {
                "stage" : "IXSCAN",
                "nReturned" : 447,
                "executionTimeMillisEstimate" : 0,
                "works" : 448,
                "advanced" : 447,
                "needTime" : 0,
                "needYield" : 0,
                "saveState" : 4,
                "restoreState" : 4,
                "isEOF" : 1,
                "invalidates" : 0,
                "keyPattern" : {
                    "DATE" : 1
                },
                "indexName" : "DATE_1",
                "isMultiKey" : false,
                "multiKeyPaths" : {
                    "DATE" : [ ]
                },
                "isUnique" : false,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 2,
                "direction" : "forward",
                "indexBounds" : {
                    "DATE" : [
                        "[\"2016-01-10\", \"2016-01-10\"]"
                    ]
                },
                "keysExamined" : 447,
                "seeks" : 1,
                "dupsTested" : 0,
                "dupsDropped" : 0,
                "seenInvalidated" : 0
            }
        }
    },
    "allPlansExecution" : [ ]
}
 

这次查询速度非常之快,打破了原来的查询速度。

之后再去查询里面的内容,速度还是有所提高,但是还是存在缺陷,查询速度不均衡,有时候快,有时候慢

后面还要加强学习,day day up

你可能感兴趣的:(MongoDB学习笔记)