[{"data":1,"prerenderedAt":2283},["ShallowReactive",2],{"authors":3,"article-2023-03-30-ameliorer-ses-requetes-mongo-avec-atlas-et-explain":305},[4,23,35,48,60,72,85,98,111,123,135,148,160,172,184,196,208,220,232,245,257,269,281,293],{"id":5,"title":6,"body":7,"description":11,"extension":14,"meta":15,"name":16,"navigation":17,"path":18,"readingTime":19,"seo":20,"stem":21,"__hash__":22},"authors\u002Fauthors\u002Falexandre-guillon.md","Software Engineer",{"type":8,"value":9,"toc":10},"minimark",[],{"title":11,"searchDepth":12,"depth":12,"links":13},"",2,[],"md",{},"Alexandre Guillon",true,"\u002Fauthors\u002Falexandre-guillon",1,{"title":6,"description":11},"authors\u002Falexandre-guillon","4tf48mjyjFNqItOHaulICbrjeCyMag1o6801uHeTz98",{"id":24,"title":6,"body":25,"description":11,"extension":14,"meta":29,"name":30,"navigation":17,"path":31,"readingTime":19,"seo":32,"stem":33,"__hash__":34},"authors\u002Fauthors\u002Falexis-ablain.md",{"type":8,"value":26,"toc":27},[],{"title":11,"searchDepth":12,"depth":12,"links":28},[],{},"Alexis Ablain","\u002Fauthors\u002Falexis-ablain",{"title":6,"description":11},"authors\u002Falexis-ablain","_SIAtB7f-39e5t3GiJof81NP47s6MGo2n4gaHkTy1uQ",{"id":36,"title":37,"body":38,"description":11,"extension":14,"meta":42,"name":43,"navigation":17,"path":44,"readingTime":19,"seo":45,"stem":46,"__hash__":47},"authors\u002Fauthors\u002Faxel-shaita.md","Engineering Manager",{"type":8,"value":39,"toc":40},[],{"title":11,"searchDepth":12,"depth":12,"links":41},[],{},"Axel Shaïta","\u002Fauthors\u002Faxel-shaita",{"title":37,"description":11},"authors\u002Faxel-shaita","fK0argUhsBkWLjpTAhY13oYLVzQthcEYkCEdtHWmIgE",{"id":49,"title":6,"body":50,"description":11,"extension":14,"meta":54,"name":55,"navigation":17,"path":56,"readingTime":19,"seo":57,"stem":58,"__hash__":59},"authors\u002Fauthors\u002Fbenjamin-bouillot.md",{"type":8,"value":51,"toc":52},[],{"title":11,"searchDepth":12,"depth":12,"links":53},[],{},"Benjamin Bouillot","\u002Fauthors\u002Fbenjamin-bouillot",{"title":6,"description":11},"authors\u002Fbenjamin-bouillot","tbhCFZyfTt7ZM5b5YgqQ2nhgnSTl8BweaQQryc87fHo",{"id":61,"title":37,"body":62,"description":11,"extension":14,"meta":66,"name":67,"navigation":17,"path":68,"readingTime":19,"seo":69,"stem":70,"__hash__":71},"authors\u002Fauthors\u002Fcedric-nicoloso.md",{"type":8,"value":63,"toc":64},[],{"title":11,"searchDepth":12,"depth":12,"links":65},[],{},"Cédric Nicoloso","\u002Fauthors\u002Fcedric-nicoloso",{"title":37,"description":11},"authors\u002Fcedric-nicoloso","ibSoh4VZYiWYTuLOnZTedaAfcnvet1Q9H7ogW0LgorY",{"id":73,"title":74,"body":75,"description":11,"extension":14,"meta":79,"name":80,"navigation":17,"path":81,"readingTime":19,"seo":82,"stem":83,"__hash__":84},"authors\u002Fauthors\u002Fdavid-touzet.md","Staff Engineer",{"type":8,"value":76,"toc":77},[],{"title":11,"searchDepth":12,"depth":12,"links":78},[],{},"David Touzet","\u002Fauthors\u002Fdavid-touzet",{"title":74,"description":11},"authors\u002Fdavid-touzet","dHWwnQxb1Ubt-WwXWEODGEo9AFoq1cJUhfg3kdnYSBM",{"id":86,"title":87,"body":88,"description":11,"extension":14,"meta":92,"name":93,"navigation":17,"path":94,"readingTime":19,"seo":95,"stem":96,"__hash__":97},"authors\u002Fauthors\u002Feloise-chizat.md","Data Engineer",{"type":8,"value":89,"toc":90},[],{"title":11,"searchDepth":12,"depth":12,"links":91},[],{},"Eloïse Chizat","\u002Fauthors\u002Feloise-chizat",{"title":87,"description":11},"authors\u002Feloise-chizat","Utd72Vm9qT4hh2ZbFi6a2_nXw5Wb494Ed_HL1ra5yw8",{"id":99,"title":100,"body":101,"description":11,"extension":14,"meta":105,"name":106,"navigation":17,"path":107,"readingTime":19,"seo":108,"stem":109,"__hash__":110},"authors\u002Fauthors\u002Femmanuel-auclair.md","Staff engineer",{"type":8,"value":102,"toc":103},[],{"title":11,"searchDepth":12,"depth":12,"links":104},[],{},"Emmanuel Auclair","\u002Fauthors\u002Femmanuel-auclair",{"title":100,"description":11},"authors\u002Femmanuel-auclair","MtsA8THNLEn0dTtYEIQaGwDuf7MjQL55IOeei5gugEg",{"id":112,"title":6,"body":113,"description":11,"extension":14,"meta":117,"name":118,"navigation":17,"path":119,"readingTime":19,"seo":120,"stem":121,"__hash__":122},"authors\u002Fauthors\u002Fhoreb-parraud.md",{"type":8,"value":114,"toc":115},[],{"title":11,"searchDepth":12,"depth":12,"links":116},[],{},"Horeb Parraud","\u002Fauthors\u002Fhoreb-parraud",{"title":6,"description":11},"authors\u002Fhoreb-parraud","ajjsnUX4ohZI-ghMdbb92q_taWDkKXVZSLZXoAeLQtg",{"id":124,"title":37,"body":125,"description":11,"extension":14,"meta":129,"name":130,"navigation":17,"path":131,"readingTime":19,"seo":132,"stem":133,"__hash__":134},"authors\u002Fauthors\u002Fhugo-contreras.md",{"type":8,"value":126,"toc":127},[],{"title":11,"searchDepth":12,"depth":12,"links":128},[],{},"Hugo Contreras","\u002Fauthors\u002Fhugo-contreras",{"title":37,"description":11},"authors\u002Fhugo-contreras","2nc3VMu9ASq9Z6Pwx2-7-Ye991Pww4p-UEDBQFfjF-Q",{"id":136,"title":137,"body":138,"description":11,"extension":14,"meta":142,"name":143,"navigation":17,"path":144,"readingTime":19,"seo":145,"stem":146,"__hash__":147},"authors\u002Fauthors\u002Fjulien-tassin.md","Head of Engineering",{"type":8,"value":139,"toc":140},[],{"title":11,"searchDepth":12,"depth":12,"links":141},[],{},"Julien Tassin","\u002Fauthors\u002Fjulien-tassin",{"title":137,"description":11},"authors\u002Fjulien-tassin","iUIHI7SITje38Jh9X9uvYs4-VsHx4eCdt6hAlyLFG_o",{"id":149,"title":6,"body":150,"description":11,"extension":14,"meta":154,"name":155,"navigation":17,"path":156,"readingTime":19,"seo":157,"stem":158,"__hash__":159},"authors\u002Fauthors\u002Flaurent-renard.md",{"type":8,"value":151,"toc":152},[],{"title":11,"searchDepth":12,"depth":12,"links":153},[],{},"Laurent Renard","\u002Fauthors\u002Flaurent-renard",{"title":6,"description":11},"authors\u002Flaurent-renard","5BP7Ed-pt1SQHjh0UJ1XUrlLTcdlFaDoKBCP4deHq8A",{"id":161,"title":6,"body":162,"description":11,"extension":14,"meta":166,"name":167,"navigation":17,"path":168,"readingTime":19,"seo":169,"stem":170,"__hash__":171},"authors\u002Fauthors\u002Fleo-martin.md",{"type":8,"value":163,"toc":164},[],{"title":11,"searchDepth":12,"depth":12,"links":165},[],{},"Léo Martin","\u002Fauthors\u002Fleo-martin",{"title":6,"description":11},"authors\u002Fleo-martin","eYxCHkRgbGDV7shKdTA9s7Tu0zGV4yDGFoKR5MHQntY",{"id":173,"title":6,"body":174,"description":11,"extension":14,"meta":178,"name":179,"navigation":17,"path":180,"readingTime":19,"seo":181,"stem":182,"__hash__":183},"authors\u002Fauthors\u002Floic-bousquet.md",{"type":8,"value":175,"toc":176},[],{"title":11,"searchDepth":12,"depth":12,"links":177},[],{},"Loïc Bousquet","\u002Fauthors\u002Floic-bousquet",{"title":6,"description":11},"authors\u002Floic-bousquet","ko12qZwiGL8XNjAoy9oWypPkIjr29Pbq7vhdtgldqeQ",{"id":185,"title":6,"body":186,"description":11,"extension":14,"meta":190,"name":191,"navigation":17,"path":192,"readingTime":19,"seo":193,"stem":194,"__hash__":195},"authors\u002Fauthors\u002Floic-poullain.md",{"type":8,"value":187,"toc":188},[],{"title":11,"searchDepth":12,"depth":12,"links":189},[],{},"Loïc Poullain","\u002Fauthors\u002Floic-poullain",{"title":6,"description":11},"authors\u002Floic-poullain","oRIyJhFRTqxy5dLCYQ2OnYZ1DB-gLDUM-85vTSYuTF0",{"id":197,"title":87,"body":198,"description":11,"extension":14,"meta":202,"name":203,"navigation":17,"path":204,"readingTime":19,"seo":205,"stem":206,"__hash__":207},"authors\u002Fauthors\u002Fmaud-lelu.md",{"type":8,"value":199,"toc":200},[],{"title":11,"searchDepth":12,"depth":12,"links":201},[],{},"Maud Lélu","\u002Fauthors\u002Fmaud-lelu",{"title":87,"description":11},"authors\u002Fmaud-lelu","MMbsCKuE41OMHusrl12FIEsI-Trx7l8Nn_ANhvj2_y4",{"id":209,"title":37,"body":210,"description":11,"extension":14,"meta":214,"name":215,"navigation":17,"path":216,"readingTime":19,"seo":217,"stem":218,"__hash__":219},"authors\u002Fauthors\u002Fnicolas-poirier.md",{"type":8,"value":211,"toc":212},[],{"title":11,"searchDepth":12,"depth":12,"links":213},[],{},"Nicolas Poirier","\u002Fauthors\u002Fnicolas-poirier",{"title":37,"description":11},"authors\u002Fnicolas-poirier","dXrJkYo8az4SN_D23aYc3fQ7z8s1dR2a0lt1ogjAjJs",{"id":221,"title":37,"body":222,"description":11,"extension":14,"meta":226,"name":227,"navigation":17,"path":228,"readingTime":19,"seo":229,"stem":230,"__hash__":231},"authors\u002Fauthors\u002Fraphael-sauget.md",{"type":8,"value":223,"toc":224},[],{"title":11,"searchDepth":12,"depth":12,"links":225},[],{},"Raphaël Sauget","\u002Fauthors\u002Fraphael-sauget",{"title":37,"description":11},"authors\u002Fraphael-sauget","Uri9bcq0QDuxRA0PbBoNtu7p_5L3dALu4kzcXVW0xyM",{"id":233,"title":234,"body":235,"description":11,"extension":14,"meta":239,"name":240,"navigation":17,"path":241,"readingTime":19,"seo":242,"stem":243,"__hash__":244},"authors\u002Fauthors\u002Fromain-koenig.md","Co-funder & Head of innovation",{"type":8,"value":236,"toc":237},[],{"title":11,"searchDepth":12,"depth":12,"links":238},[],{},"Romain Koenig","\u002Fauthors\u002Fromain-koenig",{"title":234,"description":11},"authors\u002Fromain-koenig","uyS8--eG2_ezyqRABcJnMJmQKKuSArhPWd14aUvFeEw",{"id":246,"title":37,"body":247,"description":11,"extension":14,"meta":251,"name":252,"navigation":17,"path":253,"readingTime":19,"seo":254,"stem":255,"__hash__":256},"authors\u002Fauthors\u002Fromaric-juniet.md",{"type":8,"value":248,"toc":249},[],{"title":11,"searchDepth":12,"depth":12,"links":250},[],{},"Romaric Juniet","\u002Fauthors\u002Fromaric-juniet",{"title":37,"description":11},"authors\u002Fromaric-juniet","4Zb2artgT-eo-PHLXi3xi4d5t7s6PfhUxeSfXIikSUY",{"id":258,"title":6,"body":259,"description":11,"extension":14,"meta":263,"name":264,"navigation":17,"path":265,"readingTime":19,"seo":266,"stem":267,"__hash__":268},"authors\u002Fauthors\u002Fstanyslas-bres.md",{"type":8,"value":260,"toc":261},[],{"title":11,"searchDepth":12,"depth":12,"links":262},[],{},"Stanyslas Bres","\u002Fauthors\u002Fstanyslas-bres",{"title":6,"description":11},"authors\u002Fstanyslas-bres","Xa0SahETuiN4q1jrmR2ych3moAqcZ2LbU7vSfEt2RuU",{"id":270,"title":6,"body":271,"description":11,"extension":14,"meta":275,"name":276,"navigation":17,"path":277,"readingTime":19,"seo":278,"stem":279,"__hash__":280},"authors\u002Fauthors\u002Fvictor-borg.md",{"type":8,"value":272,"toc":273},[],{"title":11,"searchDepth":12,"depth":12,"links":274},[],{},"Victor Borg","\u002Fauthors\u002Fvictor-borg",{"title":6,"description":11},"authors\u002Fvictor-borg","-Za-JweoiP6hyclue_WkxMXdRUDTczPGlJf6AZckjUc",{"id":282,"title":6,"body":283,"description":11,"extension":14,"meta":287,"name":288,"navigation":17,"path":289,"readingTime":19,"seo":290,"stem":291,"__hash__":292},"authors\u002Fauthors\u002Fvirgil-roger.md",{"type":8,"value":284,"toc":285},[],{"title":11,"searchDepth":12,"depth":12,"links":286},[],{},"Virgil Roger","\u002Fauthors\u002Fvirgil-roger",{"title":6,"description":11},"authors\u002Fvirgil-roger","DfVFe5j0bCgXeEr381ZYOM5DP4m-pWb93J9-m_muKJ0",{"id":294,"title":6,"body":295,"description":11,"extension":14,"meta":299,"name":300,"navigation":17,"path":301,"readingTime":19,"seo":302,"stem":303,"__hash__":304},"authors\u002Fauthors\u002Fyukan-zhao.md",{"type":8,"value":296,"toc":297},[],{"title":11,"searchDepth":12,"depth":12,"links":298},[],{},"Yukan Zhao","\u002Fauthors\u002Fyukan-zhao",{"title":6,"description":11},"authors\u002Fyukan-zhao","LRPHugtAJnWHsmHxy9_SR5Zas_C5p-GR_uHEs1Fhk_E",{"id":306,"title":307,"author":308,"body":309,"date":2273,"description":2274,"extension":14,"lang":2275,"meta":2276,"navigation":17,"path":2277,"published":17,"readingTime":579,"seo":2278,"stem":2279,"tags":2280,"__hash__":2282},"articles\u002Farticles\u002F2023-03-30-ameliorer-ses-requetes-mongo-avec-atlas-et-explain.md","Améliorer ses requêtes Mongo avec Atlas et .explain()","eloise-chizat",{"type":8,"value":310,"toc":2257},[311,315,318,323,334,339,342,346,349,359,377,383,389,394,398,401,406,411,416,420,429,432,437,441,446,449,452,457,460,463,653,656,659,663,667,681,684,733,748,783,790,1107,1117,1120,1144,1151,1188,1196,1200,1207,1386,1393,1476,1479,1678,1681,1688,1900,1903,1906,1909,1966,1969,2165,2168,2171,2174,2186,2190,2193,2196,2205,2210,2214,2253],[312,313,314],"p",{},"Quoi de plus frustrant qu’un site qui rame ? Rien. Si à chaque clic l’utilisateur·rice doit\npatienter en cherchant des formes dans les nuages pour faire passer le temps, pas sûr que grand\nmonde reste sur votre site …",[312,316,317],{},"Allez, on a (sûrement) du boulot !",[319,320,322],"h2",{"id":321},"identifier-les-problèmes-avec-atlas","Identifier les problèmes avec Atlas",[312,324,325,326,333],{},"MongoDB ",[327,328,332],"a",{"href":329,"rel":330},"https:\u002F\u002Fwww.mongodb.com\u002Fdocs\u002Fatlas\u002F",[331],"nofollow","Atlas"," est un service de base de données dans le\ncloud, créé par la même entreprise que MongoDb. C’est un outil qui permet, entre autres, de\nmonitorer l’état de la base de données.",[335,336,338],"h3",{"id":337},"metrics","Metrics",[312,340,341],{},"Les deux graphiques qui nous intéressent ici sont “Query Executor” et “Query Targeting”, que l’on\ntrouvera dans l’onglet “Metrics”. Ils nous donneront une idée de la réponse à “y-a-t’il des choses à\naméliorer ?” mais ne nous donneront pas de précision sur quoi exactement. Cependant, ils sont un bon\nindicateur de l’état général de nos queries.",[335,343,345],{"id":344},"query-executor","Query Executor",[312,347,348],{},"Sur ce graphique, on pourra voir :",[350,351,352,356],"ul",{},[353,354,355],"li",{},"en bleu le nombre moyen d’index scannés;",[353,357,358],{},"en vert le nombre moyen de documents scannés;",[312,360,361,362,366,367,370,371,376],{},"données correspondantes à respectivement ",[363,364,365],"code",{},"totalDocsExamined"," et ",[363,368,369],{},"totalKeysExamined"," que l’on\nretrouve en sortie d’un ",[327,372,375],{"href":373,"rel":374},"https:\u002F\u002Fwww.mongodb.com\u002Fdocs\u002Fmanual\u002Freference\u002Fcommand\u002Fexplain\u002F",[331],"explain()",".\nPlus la courbe verte est éloignée de la courbe bleue, moins les index sont utilisés dans les\nrequêtes de l’application, ce qu’on cherche à éviter.",[312,378,379],{},[380,381],"img",{"alt":11,"src":382},"\u002Fimages\u002FCapture-decran-2022-10-05-a-17.27.27-1.png",[312,384,385],{},[386,387,388],"em",{},"“scanned” : The average rate per second over the selected sample period of index items scanned\nduring queries and query-plan evaluation. This rate is driven by the same value as totalKeysExamined\nin the output of explain(). ”",[312,390,391],{},[386,392,393],{},"scanned objects” : The average rate per second over the selected sample period of documents scanned\nduring queries and query-plan evaluation. This rate is driven by the same value as totalDocsExamined\nin the output of explain().",[335,395,397],{"id":396},"query-targeting","Query Targeting",[312,399,400],{},"Ce graphique représentant des ratios est peut-être plus intéressant à regarder pour déterminer si\nl’on a besoin de travailler sur nos queries. Un ratio de 1 indique que le nombre de documents ou\nd’index scannés est égal au nombre de documents renvoyés. On cherchera donc à se rapprocher de cette\nvaleur, ce qui n’est pas toujours facile. Par exemple, on en est loin ici :",[312,402,403],{},[380,404],{"alt":11,"src":405},"\u002Fimages\u002FCapture-decran-2022-10-05-a-17.27.13.png",[312,407,408],{},[386,409,410],{},"“scanned \u002F returned” : The ratio of the number of index items scanned to the number of documents\nreturned by queries, since the previous data point for the selected sample period. A value of 1.0\nmeans all documents returned exactly match query criteria for the sample period. A value of 100\nmeans on average for the sample period, a query scans 100 documents to find one that's returned.",[312,412,413],{},[386,414,415],{},"”scanned objects \u002F returned” : The ratio of the number of documents scanned to the number of\ndocuments returned by queries, since the previous data point for the selected sample period.",[319,417,419],{"id":418},"performance-advisor","Performance advisor",[312,421,422,423,428],{},"Cet onglet peut proposer des créations ou suppressions d’index en fonction de nos queries. Même s’il\nest tentant de cliquer sans trop regarder, il vaut mieux réfléchir un peu avant. En effet, ajouter\ndes indexes sur un peu tous les champs serait contre-productif : Mongo pourrait utiliser un index\nplutôt qu’un autre sans que ce soit forcément le bon choix. Autre potentiel problème : si les\nindexes créés sont triés et stockés dans la RAM, il faut s’assurer qu’on\n",[327,424,427],{"href":425,"rel":426},"https:\u002F\u002Fwww.mongodb.com\u002Fdocs\u002Fv6.0\u002Ftutorial\u002Fensure-indexes-fit-ram\u002F",[331],"ne dépasse pas la place allouée","\n!",[312,430,431],{},"Ces propositions d’indexes se basent sur les requêtes faites sur l’app, et si elles ne sont pas\nécrites en pensant un minimum perf, les indexes proposés ici ne seront pas forcément pertinents.",[312,433,434],{},[380,435],{"alt":11,"src":436},"\u002Fimages\u002FCapture-decran-2022-07-21-a-16.22.26.png",[335,438,440],{"id":439},"profiler","Profiler",[312,442,443],{},[380,444],{"alt":11,"src":445},"\u002Fimages\u002FCapture-decran-2022-07-21-a-16.01.52.png",[312,447,448],{},"C’est sur cet onglet qu’on va enfin pouvoir mettre les mains dans le cambouis. Ce graphique\nidentifie les requêtes “trop longues” selon Atlas.",[312,450,451],{},"En cliquant sur un point du graphique, le détail de la requête incriminée apparait.",[312,453,454],{},[380,455],{"alt":11,"src":456},"\u002Fimages\u002FCapture-decran-2022-07-21-a-16.42.00.png",[312,458,459],{},"Sur cette requête, le nombre documents examinés via l’index est de 3 209 alors qu’on ne renvoie au\nfinal que 5 documents !",[312,461,462],{},"On trouvera également le détail de la requête, ce qui nous permettra d’identifier exactement dans\nquelle partie du code elle se trouve.",[464,465,469],"pre",{"className":466,"code":467,"language":468,"meta":11,"style":11},"language-json shiki shiki-themes github-light github-dark","{\n    \"type\": \"command\",\n    \"command\": {\n        \"aggregate\": \"myCollection\",\n        \"pipeline\": [],\n        …\n    },\n    \"planSummary\": \"IXSCAN { someField: 1 }\",\n    \"keysExamined\": 3209,\n    \"docsExamined\": 3209,\n    \"hasSortStage\": true,\n    \"cursorExhausted\": true,\n    \"numYields\": 6,\n    \"nreturned\": 5,\n    \"durationMillis\": 198,\n    …\n}\n","json",[363,470,471,479,495,504,517,526,533,539,552,565,577,590,602,615,628,641,647],{"__ignoreMap":11},[472,473,475],"span",{"class":474,"line":19},"line",[472,476,478],{"class":477},"sVt8B","{\n",[472,480,481,485,488,492],{"class":474,"line":12},[472,482,484],{"class":483},"sj4cs","    \"type\"",[472,486,487],{"class":477},": ",[472,489,491],{"class":490},"sZZnC","\"command\"",[472,493,494],{"class":477},",\n",[472,496,498,501],{"class":474,"line":497},3,[472,499,500],{"class":483},"    \"command\"",[472,502,503],{"class":477},": {\n",[472,505,507,510,512,515],{"class":474,"line":506},4,[472,508,509],{"class":483},"        \"aggregate\"",[472,511,487],{"class":477},[472,513,514],{"class":490},"\"myCollection\"",[472,516,494],{"class":477},[472,518,520,523],{"class":474,"line":519},5,[472,521,522],{"class":483},"        \"pipeline\"",[472,524,525],{"class":477},": [],\n",[472,527,529],{"class":474,"line":528},6,[472,530,532],{"class":531},"s7hpK","        …\n",[472,534,536],{"class":474,"line":535},7,[472,537,538],{"class":477},"    },\n",[472,540,542,545,547,550],{"class":474,"line":541},8,[472,543,544],{"class":483},"    \"planSummary\"",[472,546,487],{"class":477},[472,548,549],{"class":490},"\"IXSCAN { someField: 1 }\"",[472,551,494],{"class":477},[472,553,555,558,560,563],{"class":474,"line":554},9,[472,556,557],{"class":483},"    \"keysExamined\"",[472,559,487],{"class":477},[472,561,562],{"class":483},"3209",[472,564,494],{"class":477},[472,566,568,571,573,575],{"class":474,"line":567},10,[472,569,570],{"class":483},"    \"docsExamined\"",[472,572,487],{"class":477},[472,574,562],{"class":483},[472,576,494],{"class":477},[472,578,580,583,585,588],{"class":474,"line":579},11,[472,581,582],{"class":483},"    \"hasSortStage\"",[472,584,487],{"class":477},[472,586,587],{"class":483},"true",[472,589,494],{"class":477},[472,591,593,596,598,600],{"class":474,"line":592},12,[472,594,595],{"class":483},"    \"cursorExhausted\"",[472,597,487],{"class":477},[472,599,587],{"class":483},[472,601,494],{"class":477},[472,603,605,608,610,613],{"class":474,"line":604},13,[472,606,607],{"class":483},"    \"numYields\"",[472,609,487],{"class":477},[472,611,612],{"class":483},"6",[472,614,494],{"class":477},[472,616,618,621,623,626],{"class":474,"line":617},14,[472,619,620],{"class":483},"    \"nreturned\"",[472,622,487],{"class":477},[472,624,625],{"class":483},"5",[472,627,494],{"class":477},[472,629,631,634,636,639],{"class":474,"line":630},15,[472,632,633],{"class":483},"    \"durationMillis\"",[472,635,487],{"class":477},[472,637,638],{"class":483},"198",[472,640,494],{"class":477},[472,642,644],{"class":474,"line":643},16,[472,645,646],{"class":531},"    …\n",[472,648,650],{"class":474,"line":649},17,[472,651,652],{"class":477},"}\n",[312,654,655],{},"Attention, toutes les requêtes à la base de données sont affichées ici ! De ce fait, si vous faites\ndes requêtes un peu gourmandes à la mano dans votre terminal, elles apparaîtront aussi ici.",[312,657,658],{},"Maintenant qu’on a identifié une requête qui pose problème, c’est cool, mais on fait quoi ?",[319,660,662],{"id":661},"améliorer-ses-requêtes","Améliorer ses requêtes",[335,664,666],{"id":665},"lire-et-comprendre-un-explain","Lire et comprendre un .explain()",[312,668,669,670,674,675,680],{},"La doc Mongo est par ",[327,671,673],{"href":373,"rel":672},[331],"ici"," et\n",[327,676,679],{"href":677,"rel":678},"https:\u002F\u002Fwww.mongodb.com\u002Fdocs\u002Fmanual\u002Freference\u002Fexplain-results\u002F",[331],"là",".",[312,682,683],{},"TL;DR, on peut (essayer de) comprendre ce que fait Mongo avec notre requête, en faisant :",[464,685,689],{"className":686,"code":687,"language":688,"meta":11,"style":11},"language-ts shiki shiki-themes github-light github-dark","db.getCollection('myCollection').find({ ... }).explain('executionStats');\n","ts",[363,690,691],{"__ignoreMap":11},[472,692,693,696,700,703,706,709,712,715,719,722,725,727,730],{"class":474,"line":19},[472,694,695],{"class":477},"db.",[472,697,699],{"class":698},"sScJk","getCollection",[472,701,702],{"class":477},"(",[472,704,705],{"class":490},"'myCollection'",[472,707,708],{"class":477},").",[472,710,711],{"class":698},"find",[472,713,714],{"class":477},"({ ",[472,716,718],{"class":717},"szBVR","...",[472,720,721],{"class":477}," }).",[472,723,724],{"class":698},"explain",[472,726,702],{"class":477},[472,728,729],{"class":490},"'executionStats'",[472,731,732],{"class":477},");\n",[312,734,735,736,739,740,743,744,747],{},"Attention, pour les ",[363,737,738],{},"aggregate",", c’est dans l’autre sens ! Le ",[363,741,742],{},".explain()"," vient avant le\n",[363,745,746],{},".aggregate()",". Pour la lecture, c’est le même principe.",[464,749,751],{"className":686,"code":750,"language":688,"meta":11,"style":11},"db.getCollection('myCollection').explain('executionStats').aggregate([ ... ]);\n",[363,752,753],{"__ignoreMap":11},[472,754,755,757,759,761,763,765,767,769,771,773,775,778,780],{"class":474,"line":19},[472,756,695],{"class":477},[472,758,699],{"class":698},[472,760,702],{"class":477},[472,762,705],{"class":490},[472,764,708],{"class":477},[472,766,724],{"class":698},[472,768,702],{"class":477},[472,770,729],{"class":490},[472,772,708],{"class":477},[472,774,738],{"class":698},[472,776,777],{"class":477},"([ ",[472,779,718],{"class":717},[472,781,782],{"class":477}," ]);\n",[312,784,785,786,789],{},"Pour le ",[363,787,788],{},".find()",", on aura un résultat du style :",[464,791,793],{"className":466,"code":792,"language":468,"meta":11,"style":11},"{\n    \"queryPlanner\" : {\n        \"parsedQuery\" : {...},\n        \"winningPlan\" : { -- plan utilisé\n            \"stage\" : \"FETCH\",\n            \"filter\" : {...},\n            \"inputStage\" : {\n                \"stage\" : \"IXSCAN\",\n                \"keyPattern\" : {\n                    \"myFieldWithIndex\" : 1\n                },\n                \"indexName\" : \"myIndexName\",\n                \"isMultiKey\" : false,\n                \"isUnique\" : false,\n                ...\n            }\n        },\n        \"rejectedPlans\" : [],\n        ...\n    },\n    \"executionStats\" : {\n        \"executionSuccess\" : true,\n        \"nReturned\" : 32199, -- nombre de documents renvoyés\n        \"executionTimeMillis\" : 160, -- temps d'exécution\n        \"totalKeysExamined\" : 49805, -- nombre d'indexes examinés\n        \"totalDocsExamined\" : 49805, -- nombre de documents examinés\n        ...\n    },\n    ...\n}\n\n",[363,794,795,799,807,820,837,850,861,868,880,887,897,902,914,926,937,942,947,952,961,967,972,980,992,1020,1041,1064,1086,1091,1096,1102],{"__ignoreMap":11},[472,796,797],{"class":474,"line":19},[472,798,478],{"class":477},[472,800,801,804],{"class":474,"line":12},[472,802,803],{"class":483},"    \"queryPlanner\"",[472,805,806],{"class":477}," : {\n",[472,808,809,812,815,817],{"class":474,"line":497},[472,810,811],{"class":483},"        \"parsedQuery\"",[472,813,814],{"class":477}," : {",[472,816,718],{"class":531},[472,818,819],{"class":477},"},\n",[472,821,822,825,828,831,834],{"class":474,"line":506},[472,823,824],{"class":483},"        \"winningPlan\"",[472,826,827],{"class":477}," : { ",[472,829,830],{"class":531},"--",[472,832,833],{"class":531}," plan",[472,835,836],{"class":531}," utilisé\n",[472,838,839,842,845,848],{"class":474,"line":519},[472,840,841],{"class":483},"            \"stage\"",[472,843,844],{"class":477}," : ",[472,846,847],{"class":490},"\"FETCH\"",[472,849,494],{"class":477},[472,851,852,855,857,859],{"class":474,"line":528},[472,853,854],{"class":483},"            \"filter\"",[472,856,814],{"class":477},[472,858,718],{"class":531},[472,860,819],{"class":477},[472,862,863,866],{"class":474,"line":535},[472,864,865],{"class":483},"            \"inputStage\"",[472,867,806],{"class":477},[472,869,870,873,875,878],{"class":474,"line":541},[472,871,872],{"class":483},"                \"stage\"",[472,874,844],{"class":477},[472,876,877],{"class":490},"\"IXSCAN\"",[472,879,494],{"class":477},[472,881,882,885],{"class":474,"line":554},[472,883,884],{"class":483},"                \"keyPattern\"",[472,886,806],{"class":477},[472,888,889,892,894],{"class":474,"line":567},[472,890,891],{"class":483},"                    \"myFieldWithIndex\"",[472,893,844],{"class":477},[472,895,896],{"class":483},"1\n",[472,898,899],{"class":474,"line":579},[472,900,901],{"class":477},"                },\n",[472,903,904,907,909,912],{"class":474,"line":592},[472,905,906],{"class":483},"                \"indexName\"",[472,908,844],{"class":477},[472,910,911],{"class":490},"\"myIndexName\"",[472,913,494],{"class":477},[472,915,916,919,921,924],{"class":474,"line":604},[472,917,918],{"class":483},"                \"isMultiKey\"",[472,920,844],{"class":477},[472,922,923],{"class":483},"false",[472,925,494],{"class":477},[472,927,928,931,933,935],{"class":474,"line":617},[472,929,930],{"class":483},"                \"isUnique\"",[472,932,844],{"class":477},[472,934,923],{"class":483},[472,936,494],{"class":477},[472,938,939],{"class":474,"line":630},[472,940,941],{"class":531},"                ...\n",[472,943,944],{"class":474,"line":643},[472,945,946],{"class":477},"            }\n",[472,948,949],{"class":474,"line":649},[472,950,951],{"class":477},"        },\n",[472,953,955,958],{"class":474,"line":954},18,[472,956,957],{"class":483},"        \"rejectedPlans\"",[472,959,960],{"class":477}," : [],\n",[472,962,964],{"class":474,"line":963},19,[472,965,966],{"class":531},"        ...\n",[472,968,970],{"class":474,"line":969},20,[472,971,538],{"class":477},[472,973,975,978],{"class":474,"line":974},21,[472,976,977],{"class":483},"    \"executionStats\"",[472,979,806],{"class":477},[472,981,983,986,988,990],{"class":474,"line":982},22,[472,984,985],{"class":483},"        \"executionSuccess\"",[472,987,844],{"class":477},[472,989,587],{"class":483},[472,991,494],{"class":477},[472,993,995,998,1000,1003,1006,1008,1011,1014,1017],{"class":474,"line":994},23,[472,996,997],{"class":483},"        \"nReturned\"",[472,999,844],{"class":477},[472,1001,1002],{"class":483},"32199",[472,1004,1005],{"class":477},", ",[472,1007,830],{"class":531},[472,1009,1010],{"class":531}," nombre",[472,1012,1013],{"class":531}," de",[472,1015,1016],{"class":531}," documents",[472,1018,1019],{"class":531}," renvoyés\n",[472,1021,1023,1026,1028,1031,1033,1035,1038],{"class":474,"line":1022},24,[472,1024,1025],{"class":483},"        \"executionTimeMillis\"",[472,1027,844],{"class":477},[472,1029,1030],{"class":483},"160",[472,1032,1005],{"class":477},[472,1034,830],{"class":531},[472,1036,1037],{"class":531}," temps",[472,1039,1040],{"class":531}," d'exécution\n",[472,1042,1044,1047,1049,1052,1054,1056,1058,1061],{"class":474,"line":1043},25,[472,1045,1046],{"class":483},"        \"totalKeysExamined\"",[472,1048,844],{"class":477},[472,1050,1051],{"class":483},"49805",[472,1053,1005],{"class":477},[472,1055,830],{"class":531},[472,1057,1010],{"class":531},[472,1059,1060],{"class":531}," d'indexes",[472,1062,1063],{"class":531}," examinés\n",[472,1065,1067,1070,1072,1074,1076,1078,1080,1082,1084],{"class":474,"line":1066},26,[472,1068,1069],{"class":483},"        \"totalDocsExamined\"",[472,1071,844],{"class":477},[472,1073,1051],{"class":483},[472,1075,1005],{"class":477},[472,1077,830],{"class":531},[472,1079,1010],{"class":531},[472,1081,1013],{"class":531},[472,1083,1016],{"class":531},[472,1085,1063],{"class":531},[472,1087,1089],{"class":474,"line":1088},27,[472,1090,966],{"class":531},[472,1092,1094],{"class":474,"line":1093},28,[472,1095,538],{"class":477},[472,1097,1099],{"class":474,"line":1098},29,[472,1100,1101],{"class":531},"    ...\n",[472,1103,1105],{"class":474,"line":1104},30,[472,1106,652],{"class":477},[312,1108,1109,1110,366,1113,1116],{},"On peut déjà comparer le ",[363,1111,1112],{},"executionStats.nReturned",[363,1114,1115],{},"executionStats.totalDocsExamined",". Si on a\nla même valeur, cela veut dire que tous les documents parcourus sont renvoyés en réponse.",[312,1118,1119],{},"Est-ce qu’un index a été utilisé ? On peut voir ça à plusieurs endroits :",[350,1121,1122,1128,1138],{},[353,1123,1124,1127],{},[363,1125,1126],{},"executionStats.totalKeysExamined"," qui nous donne le nombre de documents examinés via un index",[353,1129,1130,1133,1134,1137],{},[363,1131,1132],{},"winningPlan.inputStage.stage"," qui vaut ",[363,1135,1136],{},"IXSCAN"," (voir ci-dessous)",[353,1139,1140,1143],{},[363,1141,1142],{},"winningPlan.inputStage.indexName"," qui nous donne le nom de l’index utilisé",[312,1145,1146,1147,1150],{},"Le champ ",[363,1148,1149],{},"stage"," peut prendre plusieurs valeurs :",[350,1152,1153,1159,1164,1170,1176,1182],{},[353,1154,1155,1158],{},[363,1156,1157],{},"COLLSCAN"," quand toute la collection est scannée (en général, on va essayer de ne pas avoir cette\nvaleur dans le premier stage au moins)",[353,1160,1161,1163],{},[363,1162,1136],{}," quand on examine les documents via un index",[353,1165,1166,1169],{},[363,1167,1168],{},"FETCH"," quand on récupère des documents",[353,1171,1172,1175],{},[363,1173,1174],{},"GROUP"," quand on groupe des documents",[353,1177,1178,1181],{},[363,1179,1180],{},"SHARD_MERGE"," pour fusionner les résultats des shards",[353,1183,1184,1187],{},[363,1185,1186],{},"SHARDING_FILTER"," pour filtrer les documents orphelins des shards",[312,1189,1190,1191,1193,1194,680],{},"Pour diminuer le temps d’exécution, le but va être d’avoir le moins possible de ",[363,1192,1157],{}," au profit\ndes ",[363,1195,1136],{},[335,1197,1199],{"id":1198},"exemple","Exemple",[312,1201,1202,1203,1206],{},"Imaginons une collection ",[363,1204,1205],{},"transactions"," sans index et avec 106 041 documents de la forme suivante :",[464,1208,1210],{"className":466,"code":1209,"language":468,"meta":11,"style":11},"{\n    \"_id\" : \"j9sdaW87Wv5gck443\",\n    \"date\" : ISODate(\"2022-09-24T00:00:00.000Z\"),\n    \"id_user\" : \"1234\",\n    \"id_bank_account\" : \"gTdxTA9ZvZrsrML6S\",\n    \"description\" : \"Virement\",\n    \"subdivisions\" : [\n        {\n            \"id\" : \"b44jxF599Tk8qkj32\",\n            \"amount_in_cents\" : 89400,\n            \"accounting_account\" : \"471000\",\n        },\n        {\n            \"id\" : \"43BRMJHuXYNfxogdD\",\n            \"amount_in_cents\" : -89400,\n            \"accounting_account\" : \"512001\",\n        }\n    ]\n}\n",[363,1211,1212,1216,1228,1246,1258,1270,1282,1290,1295,1307,1319,1331,1335,1339,1350,1361,1372,1377,1382],{"__ignoreMap":11},[472,1213,1214],{"class":474,"line":19},[472,1215,478],{"class":477},[472,1217,1218,1221,1223,1226],{"class":474,"line":12},[472,1219,1220],{"class":483},"    \"_id\"",[472,1222,844],{"class":477},[472,1224,1225],{"class":490},"\"j9sdaW87Wv5gck443\"",[472,1227,494],{"class":477},[472,1229,1230,1233,1235,1238,1241,1244],{"class":474,"line":497},[472,1231,1232],{"class":483},"    \"date\"",[472,1234,844],{"class":477},[472,1236,1237],{"class":531},"ISODate(",[472,1239,1240],{"class":490},"\"2022-09-24T00:00:00.000Z\"",[472,1242,1243],{"class":531},")",[472,1245,494],{"class":477},[472,1247,1248,1251,1253,1256],{"class":474,"line":506},[472,1249,1250],{"class":483},"    \"id_user\"",[472,1252,844],{"class":477},[472,1254,1255],{"class":490},"\"1234\"",[472,1257,494],{"class":477},[472,1259,1260,1263,1265,1268],{"class":474,"line":519},[472,1261,1262],{"class":483},"    \"id_bank_account\"",[472,1264,844],{"class":477},[472,1266,1267],{"class":490},"\"gTdxTA9ZvZrsrML6S\"",[472,1269,494],{"class":477},[472,1271,1272,1275,1277,1280],{"class":474,"line":528},[472,1273,1274],{"class":483},"    \"description\"",[472,1276,844],{"class":477},[472,1278,1279],{"class":490},"\"Virement\"",[472,1281,494],{"class":477},[472,1283,1284,1287],{"class":474,"line":535},[472,1285,1286],{"class":483},"    \"subdivisions\"",[472,1288,1289],{"class":477}," : [\n",[472,1291,1292],{"class":474,"line":541},[472,1293,1294],{"class":477},"        {\n",[472,1296,1297,1300,1302,1305],{"class":474,"line":554},[472,1298,1299],{"class":483},"            \"id\"",[472,1301,844],{"class":477},[472,1303,1304],{"class":490},"\"b44jxF599Tk8qkj32\"",[472,1306,494],{"class":477},[472,1308,1309,1312,1314,1317],{"class":474,"line":567},[472,1310,1311],{"class":483},"            \"amount_in_cents\"",[472,1313,844],{"class":477},[472,1315,1316],{"class":483},"89400",[472,1318,494],{"class":477},[472,1320,1321,1324,1326,1329],{"class":474,"line":579},[472,1322,1323],{"class":483},"            \"accounting_account\"",[472,1325,844],{"class":477},[472,1327,1328],{"class":490},"\"471000\"",[472,1330,494],{"class":477},[472,1332,1333],{"class":474,"line":592},[472,1334,951],{"class":477},[472,1336,1337],{"class":474,"line":604},[472,1338,1294],{"class":477},[472,1340,1341,1343,1345,1348],{"class":474,"line":617},[472,1342,1299],{"class":483},[472,1344,844],{"class":477},[472,1346,1347],{"class":490},"\"43BRMJHuXYNfxogdD\"",[472,1349,494],{"class":477},[472,1351,1352,1354,1356,1359],{"class":474,"line":630},[472,1353,1311],{"class":483},[472,1355,844],{"class":477},[472,1357,1358],{"class":483},"-89400",[472,1360,494],{"class":477},[472,1362,1363,1365,1367,1370],{"class":474,"line":643},[472,1364,1323],{"class":483},[472,1366,844],{"class":477},[472,1368,1369],{"class":490},"\"512001\"",[472,1371,494],{"class":477},[472,1373,1374],{"class":474,"line":649},[472,1375,1376],{"class":477},"        }\n",[472,1378,1379],{"class":474,"line":954},[472,1380,1381],{"class":477},"    ]\n",[472,1383,1384],{"class":474,"line":963},[472,1385,652],{"class":477},[312,1387,1388,1389,1392],{},"Prenons cette requête qui liste les transactions de l’utilisateur ",[363,1390,1391],{},"1234"," pour un compte comptable et\nune date :",[464,1394,1396],{"className":686,"code":1395,"language":688,"meta":11,"style":11},"db.getCollection(\"transactions\")\n  .find({\n    id_user: \"1234\",\n    \"subdivisions.accounting_account\": \"471000\",\n    date: ISODate(\"2022-09-24 00:00:00.000Z\"),\n  })\n  .explain(\"executionStats\");\n",[363,1397,1398,1412,1422,1431,1442,1458,1463],{"__ignoreMap":11},[472,1399,1400,1402,1404,1406,1409],{"class":474,"line":19},[472,1401,695],{"class":477},[472,1403,699],{"class":698},[472,1405,702],{"class":477},[472,1407,1408],{"class":490},"\"transactions\"",[472,1410,1411],{"class":477},")\n",[472,1413,1414,1417,1419],{"class":474,"line":12},[472,1415,1416],{"class":477},"  .",[472,1418,711],{"class":698},[472,1420,1421],{"class":477},"({\n",[472,1423,1424,1427,1429],{"class":474,"line":497},[472,1425,1426],{"class":477},"    id_user: ",[472,1428,1255],{"class":490},[472,1430,494],{"class":477},[472,1432,1433,1436,1438,1440],{"class":474,"line":506},[472,1434,1435],{"class":490},"    \"subdivisions.accounting_account\"",[472,1437,487],{"class":477},[472,1439,1328],{"class":490},[472,1441,494],{"class":477},[472,1443,1444,1447,1450,1452,1455],{"class":474,"line":519},[472,1445,1446],{"class":477},"    date: ",[472,1448,1449],{"class":698},"ISODate",[472,1451,702],{"class":477},[472,1453,1454],{"class":490},"\"2022-09-24 00:00:00.000Z\"",[472,1456,1457],{"class":477},"),\n",[472,1459,1460],{"class":474,"line":528},[472,1461,1462],{"class":477},"  })\n",[472,1464,1465,1467,1469,1471,1474],{"class":474,"line":535},[472,1466,1416],{"class":477},[472,1468,724],{"class":698},[472,1470,702],{"class":477},[472,1472,1473],{"class":490},"\"executionStats\"",[472,1475,732],{"class":477},[312,1477,1478],{},"Et l’explication de son résultat :",[464,1480,1482],{"className":466,"code":1481,"language":468,"meta":11,"style":11},"{\n    \"queryPlanner\" : {\n        ...\n        \"winningPlan\" : {\n            \"stage\" : \"COLLSCAN\", -- n'utilise pas d'index\n            ...\n        },\n        \"rejectedPlans\" : [] -- n'a pas trouvé d'autre possibilité d'exécution\n    },\n    \"executionStats\" : {\n        \"executionSuccess\" : true,\n        \"nReturned\" : 5, -- nombre de documents retournés\n        \"executionTimeMillis\" : 62, -- temps de réponse\n        \"totalKeysExamined\" : 0, -- n'examine pas d'index\n        \"totalDocsExamined\" : 106041, -- nombre de documents examinés\n        ...\n    },\n    ...\n}\n",[363,1483,1484,1488,1494,1498,1504,1526,1531,1535,1560,1564,1570,1580,1601,1621,1641,1662,1666,1670,1674],{"__ignoreMap":11},[472,1485,1486],{"class":474,"line":19},[472,1487,478],{"class":477},[472,1489,1490,1492],{"class":474,"line":12},[472,1491,803],{"class":483},[472,1493,806],{"class":477},[472,1495,1496],{"class":474,"line":497},[472,1497,966],{"class":531},[472,1499,1500,1502],{"class":474,"line":506},[472,1501,824],{"class":483},[472,1503,806],{"class":477},[472,1505,1506,1508,1510,1513,1515,1517,1520,1523],{"class":474,"line":519},[472,1507,841],{"class":483},[472,1509,844],{"class":477},[472,1511,1512],{"class":490},"\"COLLSCAN\"",[472,1514,1005],{"class":477},[472,1516,830],{"class":531},[472,1518,1519],{"class":531}," n'utilise",[472,1521,1522],{"class":531}," pas",[472,1524,1525],{"class":531}," d'index\n",[472,1527,1528],{"class":474,"line":528},[472,1529,1530],{"class":531},"            ...\n",[472,1532,1533],{"class":474,"line":535},[472,1534,951],{"class":477},[472,1536,1537,1539,1542,1544,1547,1549,1552,1555,1558],{"class":474,"line":541},[472,1538,957],{"class":483},[472,1540,1541],{"class":477}," : [] ",[472,1543,830],{"class":531},[472,1545,1546],{"class":531}," n'a",[472,1548,1522],{"class":531},[472,1550,1551],{"class":531}," trouvé",[472,1553,1554],{"class":531}," d'autre",[472,1556,1557],{"class":531}," possibilité",[472,1559,1040],{"class":531},[472,1561,1562],{"class":474,"line":554},[472,1563,538],{"class":477},[472,1565,1566,1568],{"class":474,"line":567},[472,1567,977],{"class":483},[472,1569,806],{"class":477},[472,1571,1572,1574,1576,1578],{"class":474,"line":579},[472,1573,985],{"class":483},[472,1575,844],{"class":477},[472,1577,587],{"class":483},[472,1579,494],{"class":477},[472,1581,1582,1584,1586,1588,1590,1592,1594,1596,1598],{"class":474,"line":592},[472,1583,997],{"class":483},[472,1585,844],{"class":477},[472,1587,625],{"class":483},[472,1589,1005],{"class":477},[472,1591,830],{"class":531},[472,1593,1010],{"class":531},[472,1595,1013],{"class":531},[472,1597,1016],{"class":531},[472,1599,1600],{"class":531}," retournés\n",[472,1602,1603,1605,1607,1610,1612,1614,1616,1618],{"class":474,"line":604},[472,1604,1025],{"class":483},[472,1606,844],{"class":477},[472,1608,1609],{"class":483},"62",[472,1611,1005],{"class":477},[472,1613,830],{"class":531},[472,1615,1037],{"class":531},[472,1617,1013],{"class":531},[472,1619,1620],{"class":531}," réponse\n",[472,1622,1623,1625,1627,1630,1632,1634,1637,1639],{"class":474,"line":617},[472,1624,1046],{"class":483},[472,1626,844],{"class":477},[472,1628,1629],{"class":483},"0",[472,1631,1005],{"class":477},[472,1633,830],{"class":531},[472,1635,1636],{"class":531}," n'examine",[472,1638,1522],{"class":531},[472,1640,1525],{"class":531},[472,1642,1643,1645,1647,1650,1652,1654,1656,1658,1660],{"class":474,"line":630},[472,1644,1069],{"class":483},[472,1646,844],{"class":477},[472,1648,1649],{"class":483},"106041",[472,1651,1005],{"class":477},[472,1653,830],{"class":531},[472,1655,1010],{"class":531},[472,1657,1013],{"class":531},[472,1659,1016],{"class":531},[472,1661,1063],{"class":531},[472,1663,1664],{"class":474,"line":643},[472,1665,966],{"class":531},[472,1667,1668],{"class":474,"line":649},[472,1669,538],{"class":477},[472,1671,1672],{"class":474,"line":954},[472,1673,1101],{"class":531},[472,1675,1676],{"class":474,"line":963},[472,1677,652],{"class":477},[312,1679,1680],{},"Avoir une requête qui n’utilise pas d’index n’est pas un problème en soit. Ce qu’il faut regarder\nc’est le ratio entre le nombre de document examiné (ici 106 041, c’est à dire toute notre collection\n!) et le nombre de documents retournés (ici, uniquement 1). Cette collection stocke des transactions\nbancaire, elle sera amenée à grossir rapidement : on ne peut pas se permettre de scanner toute la\ncollection à chaque fois.",[312,1682,1683,1684,1687],{},"Créons un index sur les dates avec ",[363,1685,1686],{},"db.getCollection('transactions').createIndex({ \"date\" : 1 })"," .\nOn aura alors un résultat plus satisfaisant :",[464,1689,1691],{"className":466,"code":1690,"language":468,"meta":11,"style":11},"{\n    \"queryPlanner\": {\n        \"winningPlan\": {\n            \"stage\": \"FETCH\",\n            \"inputStage\": {\n                \"stage\": \"IXSCAN\",\n                \"indexName\": \"date_1\", -- index utilisé\n                ...\n            },\n        },\n        \"rejectedPlans\": [] -- n'a pas trouvé d'autre possibilité d'exécution\n    },\n    \"executionStats\": {\n        \"executionSuccess\": true,\n        \"nReturned\": 5, -- nombre de documents retournés\n        \"executionTimeMillis\": 6, -- temps de réponse\n        \"totalKeysExamined\": 8, -- nombre d'indexes examinés\n        \"totalDocsExamined\": 8, -- nombre de documents examinés\n        ...\n    },\n    ...\n}\n",[363,1692,1693,1697,1703,1709,1719,1725,1735,1753,1757,1762,1766,1787,1791,1797,1807,1827,1845,1864,1884,1888,1892,1896],{"__ignoreMap":11},[472,1694,1695],{"class":474,"line":19},[472,1696,478],{"class":477},[472,1698,1699,1701],{"class":474,"line":12},[472,1700,803],{"class":483},[472,1702,503],{"class":477},[472,1704,1705,1707],{"class":474,"line":497},[472,1706,824],{"class":483},[472,1708,503],{"class":477},[472,1710,1711,1713,1715,1717],{"class":474,"line":506},[472,1712,841],{"class":483},[472,1714,487],{"class":477},[472,1716,847],{"class":490},[472,1718,494],{"class":477},[472,1720,1721,1723],{"class":474,"line":519},[472,1722,865],{"class":483},[472,1724,503],{"class":477},[472,1726,1727,1729,1731,1733],{"class":474,"line":528},[472,1728,872],{"class":483},[472,1730,487],{"class":477},[472,1732,877],{"class":490},[472,1734,494],{"class":477},[472,1736,1737,1739,1741,1744,1746,1748,1751],{"class":474,"line":535},[472,1738,906],{"class":483},[472,1740,487],{"class":477},[472,1742,1743],{"class":490},"\"date_1\"",[472,1745,1005],{"class":477},[472,1747,830],{"class":531},[472,1749,1750],{"class":531}," index",[472,1752,836],{"class":531},[472,1754,1755],{"class":474,"line":541},[472,1756,941],{"class":531},[472,1758,1759],{"class":474,"line":554},[472,1760,1761],{"class":477},"            },\n",[472,1763,1764],{"class":474,"line":567},[472,1765,951],{"class":477},[472,1767,1768,1770,1773,1775,1777,1779,1781,1783,1785],{"class":474,"line":579},[472,1769,957],{"class":483},[472,1771,1772],{"class":477},": [] ",[472,1774,830],{"class":531},[472,1776,1546],{"class":531},[472,1778,1522],{"class":531},[472,1780,1551],{"class":531},[472,1782,1554],{"class":531},[472,1784,1557],{"class":531},[472,1786,1040],{"class":531},[472,1788,1789],{"class":474,"line":592},[472,1790,538],{"class":477},[472,1792,1793,1795],{"class":474,"line":604},[472,1794,977],{"class":483},[472,1796,503],{"class":477},[472,1798,1799,1801,1803,1805],{"class":474,"line":617},[472,1800,985],{"class":483},[472,1802,487],{"class":477},[472,1804,587],{"class":483},[472,1806,494],{"class":477},[472,1808,1809,1811,1813,1815,1817,1819,1821,1823,1825],{"class":474,"line":630},[472,1810,997],{"class":483},[472,1812,487],{"class":477},[472,1814,625],{"class":483},[472,1816,1005],{"class":477},[472,1818,830],{"class":531},[472,1820,1010],{"class":531},[472,1822,1013],{"class":531},[472,1824,1016],{"class":531},[472,1826,1600],{"class":531},[472,1828,1829,1831,1833,1835,1837,1839,1841,1843],{"class":474,"line":643},[472,1830,1025],{"class":483},[472,1832,487],{"class":477},[472,1834,612],{"class":483},[472,1836,1005],{"class":477},[472,1838,830],{"class":531},[472,1840,1037],{"class":531},[472,1842,1013],{"class":531},[472,1844,1620],{"class":531},[472,1846,1847,1849,1851,1854,1856,1858,1860,1862],{"class":474,"line":649},[472,1848,1046],{"class":483},[472,1850,487],{"class":477},[472,1852,1853],{"class":483},"8",[472,1855,1005],{"class":477},[472,1857,830],{"class":531},[472,1859,1010],{"class":531},[472,1861,1060],{"class":531},[472,1863,1063],{"class":531},[472,1865,1866,1868,1870,1872,1874,1876,1878,1880,1882],{"class":474,"line":954},[472,1867,1069],{"class":483},[472,1869,487],{"class":477},[472,1871,1853],{"class":483},[472,1873,1005],{"class":477},[472,1875,830],{"class":531},[472,1877,1010],{"class":531},[472,1879,1013],{"class":531},[472,1881,1016],{"class":531},[472,1883,1063],{"class":531},[472,1885,1886],{"class":474,"line":963},[472,1887,966],{"class":531},[472,1889,1890],{"class":474,"line":969},[472,1891,538],{"class":477},[472,1893,1894],{"class":474,"line":974},[472,1895,1101],{"class":531},[472,1897,1898],{"class":474,"line":982},[472,1899,652],{"class":477},[312,1901,1902],{},"Le temps de réponse a grandement diminué, on utilise un index et on examine beaucoup moins de\ndocuments.",[312,1904,1905],{},"Mais il est encore possible d’améliorer notre résultat en examinant des indexes à la place des\ndocuments.",[312,1907,1908],{},"Supprimons notre index pour en créer un autre :",[464,1910,1912],{"className":686,"code":1911,"language":688,"meta":11,"style":11},"db.getCollection(\"transactions\").createIndex({\n  id_user: 1,\n  \"subdivisions.accounting_account\": 1,\n  date: 1,\n});\n",[363,1913,1914,1931,1941,1952,1961],{"__ignoreMap":11},[472,1915,1916,1918,1920,1922,1924,1926,1929],{"class":474,"line":19},[472,1917,695],{"class":477},[472,1919,699],{"class":698},[472,1921,702],{"class":477},[472,1923,1408],{"class":490},[472,1925,708],{"class":477},[472,1927,1928],{"class":698},"createIndex",[472,1930,1421],{"class":477},[472,1932,1933,1936,1939],{"class":474,"line":12},[472,1934,1935],{"class":477},"  id_user: ",[472,1937,1938],{"class":483},"1",[472,1940,494],{"class":477},[472,1942,1943,1946,1948,1950],{"class":474,"line":497},[472,1944,1945],{"class":490},"  \"subdivisions.accounting_account\"",[472,1947,487],{"class":477},[472,1949,1938],{"class":483},[472,1951,494],{"class":477},[472,1953,1954,1957,1959],{"class":474,"line":506},[472,1955,1956],{"class":477},"  date: ",[472,1958,1938],{"class":483},[472,1960,494],{"class":477},[472,1962,1963],{"class":474,"line":519},[472,1964,1965],{"class":477},"});\n",[312,1967,1968],{},"Ce qui nous donne :",[464,1970,1972],{"className":466,"code":1971,"language":468,"meta":11,"style":11},"{\n    \"queryPlanner\": {\n        \"winningPlan\": {\n            \"stage\": \"FETCH\",\n            \"inputStage\": {\n                \"stage\": \"IXSCAN\",\n                \"indexName\": \"id_user_1_subdivisions.accounting_account_1_date_1\", -- index utilisé\n                ...\n            },\n        },\n        \"rejectedPlans\": []\n    },\n    \"executionStats\": {\n        \"executionSuccess\": true,\n        \"nReturned\": 5, -- nombre de documents retournés\n        \"executionTimeMillis\": 5, -- temps de réponse\n        \"totalKeysExamined\": 45, -- nombre d'indexes examinés\n        \"totalDocsExamined\": 5, -- nombre de documents examinés\n        ...\n    },\n    ...\n}\n",[363,1973,1974,1978,1984,1990,2000,2006,2016,2033,2037,2041,2045,2052,2056,2062,2072,2092,2110,2129,2149,2153,2157,2161],{"__ignoreMap":11},[472,1975,1976],{"class":474,"line":19},[472,1977,478],{"class":477},[472,1979,1980,1982],{"class":474,"line":12},[472,1981,803],{"class":483},[472,1983,503],{"class":477},[472,1985,1986,1988],{"class":474,"line":497},[472,1987,824],{"class":483},[472,1989,503],{"class":477},[472,1991,1992,1994,1996,1998],{"class":474,"line":506},[472,1993,841],{"class":483},[472,1995,487],{"class":477},[472,1997,847],{"class":490},[472,1999,494],{"class":477},[472,2001,2002,2004],{"class":474,"line":519},[472,2003,865],{"class":483},[472,2005,503],{"class":477},[472,2007,2008,2010,2012,2014],{"class":474,"line":528},[472,2009,872],{"class":483},[472,2011,487],{"class":477},[472,2013,877],{"class":490},[472,2015,494],{"class":477},[472,2017,2018,2020,2022,2025,2027,2029,2031],{"class":474,"line":535},[472,2019,906],{"class":483},[472,2021,487],{"class":477},[472,2023,2024],{"class":490},"\"id_user_1_subdivisions.accounting_account_1_date_1\"",[472,2026,1005],{"class":477},[472,2028,830],{"class":531},[472,2030,1750],{"class":531},[472,2032,836],{"class":531},[472,2034,2035],{"class":474,"line":541},[472,2036,941],{"class":531},[472,2038,2039],{"class":474,"line":554},[472,2040,1761],{"class":477},[472,2042,2043],{"class":474,"line":567},[472,2044,951],{"class":477},[472,2046,2047,2049],{"class":474,"line":579},[472,2048,957],{"class":483},[472,2050,2051],{"class":477},": []\n",[472,2053,2054],{"class":474,"line":592},[472,2055,538],{"class":477},[472,2057,2058,2060],{"class":474,"line":604},[472,2059,977],{"class":483},[472,2061,503],{"class":477},[472,2063,2064,2066,2068,2070],{"class":474,"line":617},[472,2065,985],{"class":483},[472,2067,487],{"class":477},[472,2069,587],{"class":483},[472,2071,494],{"class":477},[472,2073,2074,2076,2078,2080,2082,2084,2086,2088,2090],{"class":474,"line":630},[472,2075,997],{"class":483},[472,2077,487],{"class":477},[472,2079,625],{"class":483},[472,2081,1005],{"class":477},[472,2083,830],{"class":531},[472,2085,1010],{"class":531},[472,2087,1013],{"class":531},[472,2089,1016],{"class":531},[472,2091,1600],{"class":531},[472,2093,2094,2096,2098,2100,2102,2104,2106,2108],{"class":474,"line":643},[472,2095,1025],{"class":483},[472,2097,487],{"class":477},[472,2099,625],{"class":483},[472,2101,1005],{"class":477},[472,2103,830],{"class":531},[472,2105,1037],{"class":531},[472,2107,1013],{"class":531},[472,2109,1620],{"class":531},[472,2111,2112,2114,2116,2119,2121,2123,2125,2127],{"class":474,"line":649},[472,2113,1046],{"class":483},[472,2115,487],{"class":477},[472,2117,2118],{"class":483},"45",[472,2120,1005],{"class":477},[472,2122,830],{"class":531},[472,2124,1010],{"class":531},[472,2126,1060],{"class":531},[472,2128,1063],{"class":531},[472,2130,2131,2133,2135,2137,2139,2141,2143,2145,2147],{"class":474,"line":954},[472,2132,1069],{"class":483},[472,2134,487],{"class":477},[472,2136,625],{"class":483},[472,2138,1005],{"class":477},[472,2140,830],{"class":531},[472,2142,1010],{"class":531},[472,2144,1013],{"class":531},[472,2146,1016],{"class":531},[472,2148,1063],{"class":531},[472,2150,2151],{"class":474,"line":963},[472,2152,966],{"class":531},[472,2154,2155],{"class":474,"line":969},[472,2156,538],{"class":477},[472,2158,2159],{"class":474,"line":974},[472,2160,1101],{"class":531},[472,2162,2163],{"class":474,"line":982},[472,2164,652],{"class":477},[312,2166,2167],{},"Avec cette index, le nombre de documents examinés est égal au nombre de documents retournés. Le\nnombre d’indexes examinés a augmenté mais cela n’est pas un problème pour les performances sur cet\nordre de grandeur.",[312,2169,2170],{},"Attention toutefois, ici l’exemple ne s’appuie que sur une seule requête. Il est peu probable que\nvous ayez à faire une seule requête par collection. Il vous faudra alors penser vos index pour\nqu’ils servent sur la majorité de vos requêtes.",[312,2172,2173],{},"Créer des index dans tous les sens pourra aussi vous desservir : Mongo choisira d’utiliser un des\nindexes créés, il est possible que ce ne soit pas forcément celui auquel vous pensiez !",[312,2175,2176,2177,2182,2183],{},"Pour visualiser l’utilisation de vos indexes, utilisez\n",[327,2178,2181],{"href":2179,"rel":2180},"https:\u002F\u002Fwww.mongodb.com\u002Fdocs\u002Fmanual\u002Freference\u002Foperator\u002Faggregation\u002FindexStats\u002F",[331],"$indexStats"," :\n",[363,2184,2185],{},"db.getCollection('transactions').aggregate( [ { $indexStats: { } } ] )",[319,2187,2189],{"id":2188},"monitorer","Monitorer",[312,2191,2192],{},"Les graphiques disponibles sur Atlas présentés plus haut nous donnent une idée de l’état de la base\nà un instant t. Sur Query Executor et Query Targeting il n’est pas possible de différencier les\ncollections. Sur le Profiler, c’est un petit peu plus précis, mais on ne peut remonter que sur les\ndernières 24h.",[312,2194,2195],{},"Pour avoir une vue plus globale des évolutions de performance suite aux différentes modifications,\nil est possible de monitorer les temps de réponse des routes. Certes, on mesurera tout un tas de\nchoses en plus de “l’amélioration de la requête”, mais cela permet de voir si notre feature a besoin\nde plus de travail (possiblement autre que sur Mongo).",[312,2197,2198,2199,2204],{},"Par exemple, une des requêtes améliorées lors de nos sessions avec la\n",[327,2200,2203],{"href":2201,"rel":2202},"https:\u002F\u002Ftech.indy.fr\u002F2022\u002F03\u002F03\u002Fles-guildes\u002F",[331],"guilde Mongo"," a été monitorée. Cette route ne fait\nqu’une requête Mongo et peu de traitements JS, nous étions donc assez confiants sur les impacts\npositifs de notre travail.",[312,2206,2207],{},[380,2208],{"alt":11,"src":2209},"\u002Fimages\u002FCapture-decran-2022-07-21-a-17.08.18.png",[319,2211,2213],{"id":2212},"pour-aller-plus-loin","Pour aller plus loin …",[350,2215,2216,2229,2241],{},[353,2217,2218,2222,2226],{},[2219,2220,2221],"strong",{},"Créer un index B-tree composé efficace",[327,2223],{"href":2224,"rel":2225},"https:\u002F\u002Ftech.indy.fr\u002F2022\u002F04\u002F07\u002Fcreer-un-index-b-tree-compose-efficace\u002F",[331],[327,2227,2224],{"href":2224,"rel":2228},[331],[353,2230,2231,2234,2238],{},[2219,2232,2233],{},"Let’s .explain() MongoDB Performance | Twitch Live Coding",[327,2235],{"href":2236,"rel":2237},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=HAtnkHw_fJ8",[331],[327,2239,2236],{"href":2236,"rel":2240},[331],[353,2242,2243,2246,2250],{},[2219,2244,2245],{},"Mongo University",[327,2247],{"href":2248,"rel":2249},"https:\u002F\u002Funiversity.mongodb.com\u002Fcourses\u002FM201\u002Fabout",[331],[327,2251,2248],{"href":2248,"rel":2252},[331],[2254,2255,2256],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s7hpK, html code.shiki .s7hpK{--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":11,"searchDepth":12,"depth":12,"links":2258},[2259,2264,2267,2271,2272],{"id":321,"depth":12,"text":322,"children":2260},[2261,2262,2263],{"id":337,"depth":497,"text":338},{"id":344,"depth":497,"text":345},{"id":396,"depth":497,"text":397},{"id":418,"depth":12,"text":419,"children":2265},[2266],{"id":439,"depth":497,"text":440},{"id":661,"depth":12,"text":662,"children":2268},[2269,2270],{"id":665,"depth":497,"text":666},{"id":1198,"depth":497,"text":1199},{"id":2188,"depth":12,"text":2189},{"id":2212,"depth":12,"text":2213},"2023-03-30","Quoi de plus frustrant qu’un site qui rame ? Rien. Si à chaque clic l’utilisateur·rice doit patienter en cherchant des formes dans les nuages pour faire passer le temps, pas sûr que grand monde reste sur votre site …","fr",{},"\u002Farticles\u002F2023-03-30-ameliorer-ses-requetes-mongo-avec-atlas-et-explain",{"title":307,"description":2274},"articles\u002F2023-03-30-ameliorer-ses-requetes-mongo-avec-atlas-et-explain",[2281],"Tech","dZk8IGcORfEaBLtD9YjVkSNHAY49-uihMaHIjrUtu3w",1775058083817]