почему mongodb скорость сортировки по полю поддокумента так медленно? - PullRequest
0 голосов
/ 08 октября 2019

моя тестовая коллекция имеет эти поля

{
    "block_number": 123123,
    "value": 555.55555
    "transfers": [
        {
            "from": "foo1", 
            "to": "bar1", 
            "amount": 111.111
        },
        {
            "from": "foo2", 
            "to": "bar2", 
            "amount": 222.222
        },
        ...
        {
            "from": "foo3", 
            "to": "bar3", 
            "amount": 100.100
        },
    ]
},
...
{
    ...
}

, и я создал такие индексы (с кодом Python)

tx_collection.create_index("block_number")
tx_collection.create_index("transfers.amount")
tx_collection.create_index("value")

Почему два одинаковых запроса показывают разную скорость?

два запроса:

  1. tx_collection.find({'block_number': {'$gte': 3243145}}, {'_id': 0}).sort('transfers.amount', -1).limit(100)
  2. tx_collection.find({'block_number': {'$gte': 3243145}}, {'_id': 0}).sort('value', -1).limit(100)

И тестовый код Python во время выполнения выглядит следующим образом

    start = time.time()

    txs = tx_collection.find({'block_number': {'$gte': 3243145}}, {'_id': 0}).sort('transfers.amount', -1).limit(100)
    # txs = tx_collection.find({'block_number': {'$gte': 3243145}}, {'_id': 0}).sort('value', -1).limit(100)

    for tx in txs:
        print(tx)

    done = time.time()
    print(done - start)

время выполнения

  • 1-й запрос: около 0,1 с
  • 2-й запрос: около 10 с

Почему они слишком разные?

JFYI. у mongdb есть 5 осколков, и я запускаю этот запрос на mongos, используя код python.


Дополнительный тест.

Когда я тестирую приведенный ниже запрос на клиенте mongodb,

db.getCollection('transaction').find({}).sort({"transfers.amount":1})

выдает сообщение об ошибке вроде

"Executor error during find command: OperationFailed: Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.",

Кажется, что индекс на transfers.amount кажется не работает

Когда я проверил с помощью db.getCollection('transaction').getIndexes(), я подтвердил, что индекс на transfers.amountСам был хорошо настроен, как

    {
        "v" : 2,
        "key" : {
            "transfers.amount" : 1.0
        },
        "name" : "transfers.amount_1",
        "ns" : "crossangle.transaction"
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...