J'ai un finder défini comme un référentiel Spring Data dérivé de MongoRepository qui recherche 3 attributs différents dans MongoDB. Tous les trois ont un seul indice.Spring Data REST: résumé de page lente
public Page<Content> findByIdInOrAuthorUserNameInOrTagsIdIn(
@Param("ids") Collection ids,
@Param("userNames") Collection userName,
@Param("tagIds") Collection tagIds,
@Param("pageable") Pageable pageable);
Le problème est que l'on attribue a un jeu de résultats de 2,5 millions d'entrées:
"page": {
"size": 20,
"totalElements": 2531397,
"totalPages": 126570,
"number": 5
}
Ainsi, la requête pour une page est assez rapide (13ms) comme on le voit dans le fichier journal mongo :
2017-04-10T12:50:27.562+0200 I COMMAND [conn68] command content.content command: find { find: "content", filter: { $or: [ { $or: [ { _id: { $in: [ "..." ] } }, { author.userName: { $in: [ "...", "..." ] } } ] }, { tags._id: { $in: [ "..." ] } } ] }, skip: 100, limit: 20 } planSummary: IXSCAN { _id: 1 }, IXSCAN { tags._id: 1 }, IXSCAN { author.userName: 1 } keysExamined:120 docsExamined:120 cursorExhausted:1 numYields:0 nreturned:20 reslen:21185 locks:{ Global: { acquireCount: { r: 2 } }, Database: { acquireCount: { r: 1 } }, Collection: { acquireCount: { r: 1 } } } protocol:op_query 13ms
Mais il semble que le résumé de la page qui compte le résultat prend ~ 117s:
2017-04-10T12:52:24.172+0200 I COMMAND [conn68] command content.content command: count { count: "content", query: { $or: [ { $or: [ { _id: { $in: [ "..." ] } }, { author.userName: { $in: [ "...", "..." ] } } ] }, { tags._id: { $in: [ "..." ] } } ] } } planSummary: IXSCAN { _id: 1 }, IXSCAN { tags._id: 1 }, IXSCAN { author.userName: 1 } keysExamined:2531466 docsExamined:2531397 numYields:21190 reslen:44 locks:{ Global: { acquireCount: { r: 42382 } }, Database: { acquireCount: { r: 21191 } }, Collection: { acquireCount: { r: 21191 } } } protocol:op_query 116592ms
Y at-il un moyen de désactiver le résumé de la page ou d'accélérer le comptage d'une certaine façon?
Vous ne savez pas si cela fonctionne, mais avez-vous essayé une tranche au lieu d'une page: http://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/ Slice.html –
C'était exactement ce pour quoi je bloquais :) Slice peut aussi être combiné avec le paramètre Pageable. Merci –
Fait une réponse donc, vous pouvez le fermer, et le système ne pense pas que cela reste sans réponse. –