В журналах я обнаружил медленные запросы, но при запуске их вручную они выполняются быстро или, по крайней мере, учитывают индексы.
В журналах указывается, что часть запроса не использует индекс, который доступен.
При выполнении запроса учитывается индекс.
Запуск на AWS DocumentDB (который в основном совместим с MongoDB 3.6).
Логи говорят мне об этом (анонимные имена полей для интернетов ;-)):
{"op":"update",
"ts":1578041832906,
"ns":"collection",
"command":{
"q":{"array.field1":{"$binary":"Hzy2Q0TBYEAWadeCtxpXuA==","$type":"3"}},
"u":{"$set":{"array.$.field2":174}}},
"nMatched":0,
"nModified":0,
"protocol":"op_query",
"millis":694,
"planSummary":"IXSCAN",
"execStats":{
"stage":"UPDATE",
"nReturned":"0",
"executionTimeMillisEstimate":"694.497",
"inputStages":[{
"stage":"LIMIT_SKIP",
"nReturned":"0",
"executionTimeMillisEstimate":"694.488",
"inputStage":{
"stage":"COLLSCAN",
"nReturned":"0",
"executionTimeMillisEstimate":"694.486"
}
},{
"stage":"IXSCAN",
"nReturned":"0",
"executionTimeMillisEstimate":"694.492",
"indexName":"_idDocField3",
"direction":"forward"
}]
},
}
При выполнении объяснения для этого обновления
collection.explain().update(
{"array.field1": BinData(3, "Hzy2Q0TBYEAWadeCtxpXuA==")},
{$set: {"array.$.field2":174}}
)
queryPlanner показывает мне это
{
"queryPlanner": {
"plannerVersion": 1,
"namespace": "collection",
"winningPlan": {
"stage": "UPDATE",
"inputStages": [
{
"stage": "LIMIT_SKIP",
"inputStage": {
"stage": "FETCH",
"inputStage": {
"stage": "IXSCAN",
"indexName": "arrayField1"
}
}
},
{
"stage": "IXSCAN",
"indexName": "_idDocField3",
"direction": "forward"
}
]
}
},
"serverInfo": {
"host": "xxxxxxx",
"port": 27017,
"version": "3.6.0"
},
"ok": 1
}
Доступны следующие индексы:
_id_ { _id:1 }, ops: ~56,000
, _idDocField3 { _id: 1, docField3: 1 }, ops: ~4,200,000
, arrayField1 { "array.field1": 1 }, ops: ~400
, arrayField1DocField3 { "array.field1": 1, docField3: 1 }, ops: 0
array
- массив, содержащий документ и идентификаторы UUID.
Размер коллекции составляет около 40 000 000.
И документы немного противоречивы:
https://docs.mongodb.com/v3.6/core/index-multikey/
Многопользовательские индексы не могут покрывать запросы над полями массива.
Однако, начиная с версии 3.6, индексы с несколькими ключами могут покрывать запросы к полям, не являющимся массивами, если индекс>> отслеживает, какие поля или поля приводят к тому, что индекс является мультиключевым. Многопользовательские индексы, созданные в> MongoDB 3.4 или более поздней версии в механизмах хранения, отличных от MMAPv1, отслеживают эти данные.
Может ли быть идея удалить составные индексы и полагаться на пересечение индексов?
Или переключить порядок составных индексов?
Кто-нибудь, кто может помочь мне оптимизировать это?