ms-dred
@ms-dred
Вечно что то не то и что то не так...

MongoDB как побороть медленные запросы с сортировкой?

Всем привет.
У меня очень большая нагрузка на сервере от MongoDB, ищу корни, и сейчас мысли только о индексах. Монга жрет не оперативку, а процессор, 8 ядерный процессор загружен чуть меньше чем полностью.
Для начала включил профилировщик базы данных для медленных запросов превышающих 400ms, вижу следующую картину.
{
	"op" : "command",
	"ns" : "site.coll",
	"command" : {
		"aggregate" : "coll",
		"pipeline" : [
			{
				"$match" : {
					"$text" : {
						"$search" : "поисковой запрос какой то текст"
					},
					"type" : "card",
					"$and" : [
						{
							"catalog" : {
								"$nin" : [
									ObjectId("54369100d8f80e0f969850da")
								]
							}
						},
						{
							"catalog" : ObjectId("54367806d8f80e0f969850c8")
						}
					],
					"public" : {
						"$gte" : 4
					}
				}
			},
			{
				"$project" : {
					"_id" : 1,
					"score" : {
						"$meta" : "textScore"
					}
				}
			},
			{
				"$sort" : {
					"score" : {
						"$meta" : "textScore"
					}
				}
			},
			{
				"$skip" : 12
			},
			{
				"$limit" : 12
			},
			{
				"$group" : {
					"_id" : null,
					"uid" : {
						"$push" : "$_id"
					}
				}
			}
		],
		"allowDiskUse" : true,
		"cursor" : {
			
		},
		"lsid" : {
			"id" : UUID("e68a1b13-f355-40b5-bf64-5aebc9b8d4f7")
		},
		"$db" : "site"
	},
	"keysExamined" : 415972,
	"docsExamined" : 324304,
	"hasSortStage" : true,
	"cursorExhausted" : true,
	"numYield" : 4516,
	"nreturned" : 1,
	"queryHash" : "66974B51",
	"planCacheKey" : "DB2DAB9C",
	"locks" : {
		"ReplicationStateTransition" : {
			"acquireCount" : {
				"w" : NumberLong(4520)
			}
		},
		"Global" : {
			"acquireCount" : {
				"r" : NumberLong(4520)
			}
		},
		"Database" : {
			"acquireCount" : {
				"r" : NumberLong(4519)
			}
		},
		"Collection" : {
			"acquireCount" : {
				"r" : NumberLong(4519)
			}
		},
		"Mutex" : {
			"acquireCount" : {
				"r" : NumberLong(3)
			}
		}
	},
	"flowControl" : {
		
	},
	"storage" : {
		"data" : {
			"bytesRead" : NumberLong(711558),
			"timeReadingMicros" : NumberLong(16191)
		}
	},
	"responseLength" : 309,
	"protocol" : "op_msg",
	"millis" : 1566,
	"planSummary" : "IXSCAN { _fts: \"text\", _ftsx: 1 }, IXSCAN { _fts: \"text\", _ftsx: 1 }, IXSCAN { _fts: \"text\", _ftsx: 1 }",
	"ts" : ISODate("2022-01-20T07:09:56.199Z"),
	"client" : "127.0.0.1",
	"allUsers" : [ ],
	"user" : ""
}

В коллекции coll существуют индексы,
schema.index({ indexAt: 1 })
schema.index({ type: 1, catalog: 1, public: 1 })
schema.index({ type: 1, catalog: 1, public: 1, indexAt: -1 })
schema.index({ subscribe: 'text', title: 'text' }, { default_language: "russian" })
//........

Я не пойму следующее, проблема в поле score которое создается динамически или в чем то другом?
Может быть еще где то выдернуть информацию что именно нужно mongodb для правильной работы.
  • Вопрос задан
  • 48 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы