моя тестовая коллекция имеет эти поля
{
"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")
Почему два одинаковых запроса показывают разную скорость?
два запроса:
tx_collection.find({'block_number': {'$gte': 3243145}}, {'_id': 0}).sort('transfers.amount', -1).limit(100)
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"
}