Le tri de grands ensembles de données dans MongoDB peut parfois entraîner des plantages frustrants par manque de mémoire. Mais ne vous inquiétez pas, j'ai quelques conseils simples pour vous aider à éviter cela ! Avant de plonger dans le vif du sujet, j'ai écrit un autre article sur l'utilisation du planificateur de requêtes MongoDB pour vérifier si vos requêtes sont efficaces. C’est un excellent moyen de voir ce qui se passe réellement sous le capot et de détecter rapidement les problèmes.
Lorsque vous triez une grande quantité de données, MongoDB essaie de tout charger en mémoire. Si l’ensemble de données est trop volumineux, il risque de manquer de mémoire et de planter. Voici comment éviter cela et vous assurer que vos requêtes se déroulent correctement.
Exemple :
db.users.createIndex({ createdAt: 1 });
Résultat du planificateur de requêtes :
{ "stage": "FETCH", "inputStage": { "stage": "IXSCAN", "keyPattern": { "createdAt": 1 } } }
Ici, vous pouvez voir que MongoDB utilise une analyse d'index (IXSCAN), ce qui signifie qu'il est intelligent et efficace !
Exemple :
db.users.find().sort({ createdAt: 1 });
Résultat du planificateur de requêtes :
{ "stage": "FETCH", "inputStage": { "stage": "IXSCAN", "keyPattern": { "createdAt": 1 } } }
Bien ! MongoDB utilise l'index correctement, donc cela n'enlise pas votre système.
Exemple :
db.users.find().sort({ createdAt: 1 }).limit(100).skip(0);
Résultat du planificateur de requêtes :
{ "stage": "LIMIT", "inputStage": { "stage": "IXSCAN", "keyPattern": { "createdAt": 1 } } }
MongoDB est intelligent ici en limitant l'ensemble de résultats, il ne récupère donc que ce dont vous avez besoin pour le moment.
Exemple :
db.users.aggregate([{ $sort: { createdAt: 1 } }], { allowDiskUse: true });
Résultat du planificateur de requêtes :
{ "stage": "SORT", "diskUsed": true, "inputStage": { "stage": "COLLSCAN" } }
MongoDB utilise désormais l'espace disque pour faciliter le tri. Si vous utilisez un forfait plus puissant, cela pourrait être un excellent moyen d'éviter les plantages de mémoire.
Voici un conseil pour que tout se passe bien : si vous faites quelque chose sur le champ que vous essayez de trier (comme le convertir, y ajouter quelque chose ou l'ajuster) dans un pipeline d'agrégation , MongoDB supprimera l'index. Une fois l'index supprimé, MongoDB ne peut pas l'utiliser pour faciliter le tri, ce qui signifie que votre requête deviendra plus lente et utilisera plus de mémoire.
Par exemple, disons que vous souhaitez trier les utilisateurs selon l'année de leur inscription. Si vous faites quelque chose comme ça :
db.users.aggregate([ { $project: { year: { $year: "$createdAt" } } }, { $sort: { year: 1 } } ]);
Parce que vous convertissez le champ CreateAt en une année, MongoDB supprime l'index sur CreateAt. Il doit désormais parcourir toute la collection pour trier les données, ce qui peut considérablement ralentir les choses.
J'espère que ces conseils permettront à votre MongoDB de fonctionner correctement ! Si vous avez des questions, n'hésitez pas à nous contacter. Bon codage ! ?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!