Почему монго не использует правильный индекс? - PullRequest
0 голосов
/ 12 июня 2018

Я использую MongoDB для хранения данных со следующей структурой:

{ "_id" : ObjectId("5a497a1f451bf00880331913"), "device" : "deviceId", "topic" : "topicId", "vhost" : "vhostId", "date" : ISODate("2018-01-01T00:00:31.220Z"), "value" : 452 }

со следующими индексами:

[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "thingsplay.data"
        },
        {
                "v" : 2,
                "key" : {
                        "device" : 1,
                        "topic" : 1,
                        "date" : 1
                },
                "name" : "device_1_topic_1_date_1",
                "ns" : "thingsplay.data",
                "background" : true
        },
        {
                "v" : 2,
                "key" : {
                        "device" : 1,
                        "topic" : 1,
                        "vhost" : 1
                },
                "name" : "device_1_topic_1_vhost_1",
                "ns" : "thingsplay.data",
                "background" : true
        }
]

Но когда я делаю запрос с устройства,в полях темы и даты он использует device_1_topic_1_vhost_1 index ...

Для другого запроса с опцией объяснения у меня только что был правильный план выигрыша (device_1_topic_1_date_1), но когда я его выполняю ... Я все еще жду егозавершено и с db.currentOp() Я не вижу его, используя какой-либо индекс ...

{
        "desc" : "conn2172",
        "threadId" : "2836",
        "connectionId" : 2172,
        "client" : "x.x.x.x:50177",
        "appName" : "MongoDB Shell",
        "clientMetadata" : {
                "application" : {
                        "name" : "MongoDB Shell"
                },
                "driver" : {
                        "name" : "MongoDB Internal Client",
                        "version" : "3.6.2"
                },
                "os" : {
                        "type" : "Windows",
                        "name" : "Microsoft Windows Server 2008 R2",
                        "architecture" : "x86_64",
                        "version" : "6.1 SP1 (build 7601)"
                }
        },
        "active" : true,
        "opid" : 22137990,
        "secs_running" : 322,
        "microsecs_running" : NumberLong(322246758),
        "op" : "command",
        "ns" : "company.data",
        "query" : {
                "explain" : {
                        "find" : "data",
                        "filter" : {
                                "device" : "deviceId",
                                "topic" : "topicId",
                                "date" : {
                                        "$gt" : ISODate("2018-01-01T00:00:00Z"),

                                        "$lt" : ISODate("2018-06-12T16:18:00Z")
                                }
                        }
                },
                "verbosity" : "executionStats"
        },
        "numYields" : 19245,
        "locks" : {
                "Global" : "r",
                "Database" : "r",
                "Collection" : "r"
        },
        "waitingForLock" : false,
        "lockStats" : {
                "Global" : {
                        "acquireCount" : {
                                "r" : NumberLong(38492)
                        }
                },
                "Database" : {
                        "acquireCount" : {
                                "r" : NumberLong(19246)
                        }
                },
                "Collection" : {
                        "acquireCount" : {
                                "r" : NumberLong(19246)
                        }
                }
        }
}

Я не понимаю, почему индекс не используется ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...