Индекс MongoDB не используется при сортировке, хотя префикс совпадает - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь извлечь набор записей наиболее эффективным способом из MongoDB, но происходит ошибка, когда я добавляю этап сортировки в конвейер. Сервер не использует мой предполагаемый индекс. Однако согласно документации он должен соответствовать префиксу: https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/#sort-and-non-prefix-subset-of-an-index

У меня есть индекс, который выглядит так:

{
    "v" : 2,
    "key" : {
        "account_id" : 1,
        "cdr_block" : 1,
        "billing.total_billed" : 1,
        "times.created" : -1 
     },
     "name" : "IDX_by_account_and_block_sorted"
}

Таким образом, я бы предположил, что когда я фильтрую по account_id, cdr_block и billing.total_billed, а затем сортируем по times.created, будет использоваться индекс.

Однако это не так; когда я проверяю объяснения запроса в оболочке MongoDB; этот НЕ использует индекс, но использует индекс, который состоит только из times.created, поэтому это занимает несколько минут:

db.getCollection("cdr").aggregate(
    [
        { 
            "$match" : {
                "account_id" : 160.0, 
                "cdr_block" : ObjectId("5d11e0364f853f15824aff47"), 
                "billing.total_billed" : {
                    "$gt" : 0.0
                }
            }
        }, 
        { 
            "$sort" : {
                "times.created" : -1.0
            }
        }
    ], 
    { 
        "allowDiskUse" : true
    }
);

Если я опускаю этап сортировки $, он использует мой вышеупомянутый индекс.

Я думал, что это возможно из-за того, что это агрегация, но этот «обычный» запрос также не использует индекс:

db.getCollection("cdr").find({ 
    "account_id" : 160.0, 
    "cdr_block" : ObjectId("5d11e0364f853f15824aff47"), 
    "billing.total_billed" : {
        "$gt" : 0.0
    }
}).sort({"times.created" : -1 });

1 Ответ

0 голосов
/ 07 июля 2019

$ Оператор сортировки и производительность

Оператор сортировки $ может использовать индекс в начале конвейера или перед операторами агрегации $ project, $ unwind и $ group. Если $ project, $ unwind или $ group встречаются до операции $ sort, $ sort не может использовать индексы.

...