Я замечаю огромные различия в производительности в том, что кажется одинаковым, по крайней мере, концептуально.Тесты были выполнены на простой структуре коллекции, которая имеет _id, имя и созданный At, но их там 20 миллионов.Есть указатель на созданный Ат.Он размещен на кластере mlab, версия 3.6.9 WiredTiger.
Я пытаюсь заставить простой пейджинг работать с использованием агрегата, я знаю, что могу использовать поиск и ограничение, но мне нравится добавлять больше элементов в конвейер, пример, который я привожу, очень искажен.
db.getCollection("runnablecalls").aggregate([
{
$facet: {
docs: [
{ $sort: {createdAt: -1} },
{ $limit: 25 },
{ $skip: 0 },
],
page_info: [
{ $group: { _id: null, total: { $sum: 1 } }
}
],
}
}
])
Это занимает почти 40s
.Теперь, если я переместил $sort
и $limit
за пределы фасета, это займет 0.042s
.
db.getCollection("runnablecalls").aggregate([
{ $sort: {createdAt: -1} },
{ $limit: 25 },
{
$facet: {
docs: [
{ $skip: 0 },
],
page_info: [
{
$group: { _id: null, total: { $sum: 1 } }
}
]}
},
])
Фасет page_info
не имеет значения в конце, я могу вынуть его без разницы, я просто оставляю его, потому что мне нравится его использовать.Я знаю, как решить проблему, используя два запроса: счетчик и агрегат без $facet
.Мне просто нравится понимать, почему это происходит.