mongodb $ lookup не использует хеш-индекс для простого равного соединения - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть коллекция song_test, в которой есть поле "artist_name". Я создал хешированный индекс на том же.

> db.songs_test.getIndexes()
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "songs_new.songs_test"
    },
    {
        "v" : 2,
        "key" : {
            "artist_name" : "hashed"
        },
        "name" : "artist_name_hashed",
        "ns" : "songs_new.songs_test"
    }
]

Затем я запускаю следующий запрос агрегации:

use songs_new

db.songs_test.explain().aggregate([
        {$lookup : {
                 "from": "songs_test",
                 "localField": "artist_name",
                 "foreignField": "artist_name",
                 "as": "artist_name_matches"
                 }
        },
        {$unwind : "$artist_name_matches"}
], {allowDiskUse: true}
)

Для выполнения этого запроса агрегации требуется около 13 минут. Коллекция Songs_test насчитывает 1 миллион записей. Когда я делаю объяснение - я вижу, что поиск не использует индекс.

Объясните вывод:

switched to db songs_new
{
    "stages" : [
        {
            "$cursor" : {
                "query" : {

                },
                "queryPlanner" : {
                    "plannerVersion" : 1,
                    "namespace" : "songs_new.songs_test",
                    "indexFilterSet" : false,
                    "parsedQuery" : {

                    },
                    "queryHash" : "8B3D4AB8",
                    "planCacheKey" : "8B3D4AB8",
                    "winningPlan" : {
                        "stage" : "COLLSCAN",
                        "direction" : "forward"
                    },
                    "rejectedPlans" : [ ]
                }
            }
        },
        {
            "$lookup" : {
                "from" : "songs_test",
                "as" : "artist_name_matches",
                "localField" : "artist_name",
                "foreignField" : "artist_name",
                "unwinding" : {
                    "preserveNullAndEmptyArrays" : false
                }
            }
        }
    ],
    "ok" : 1
}

Я пробовал разные вещи (предложенные в Интернете), но не смогузнать точную причину. Кроме того, требуется около 13 минут для работы на 8-разрядной 64-ГБ оперативной памяти. Совокупный запрос использует только один поток (что также странно). Может кто-нибудь помочь, почему он не использует индекс и почему агрегация выполняется в одном потоке?

...