10. 10
• Plus important réglage dans la DB en matière de
performance (le schéma n’est pas un réglage).
– L’efficacité des index doit être examinée très tôt
– Eviter les duplications
– .
// index on author (ascending)
>db.articles.ensureIndex( { author : 1 } )
// index on title (descending)
>db.articles.ensureIndex( { title: -1 } )
// index on arrays of values – multi key index
>db.articles.ensureIndex( { tags : 1 } )
Fondamentaux
15. 15
• Le tri n’a pas d’importance pour les index simples
– Lecture dans les deux sens du BTree
• { attribute: 1 } ou { attribute: -1 }
• Le tri est important pour les ‘compound indexes’
– Requête sur auteur, et tri par date
Ordre de tri
// index sur author croissant et décroissant sur date
>db.articles.ensureIndex( { ‘author’ : 1, ‘date’ -1 } )
16. 16
• Retourne uniquement des données comprises
dans l’index
– Pas d’utilisation du fichier DB
– Performance optimale
– Valide pour les index composés
• Invoke with a projection
Requête couverte (covered)
> db.users.ensureIndex( { user : 1, password :1 } )
> db.user.find({user:"danr"}, {_id:0, password:1})
{ "password" : ”*********" }
Tip: utiliser les projections au maximum pour limiter
les quantités de données à acheminer vers le client
18. 18
• Permet d’évaluer l’efficactié des requêtes et index
– Quels index ont été utilisés… ou pas
– Combien de documents ou objets ont été scannés
– Utilisable via la console ou en code
Explication du plan d’exécution
//To view via the console
> db.articles.find({author:'Dan Roberts'}).sort({date:-1}).explain()
20. 20
• Permet de logger les requêtes lentes
– Au-delà d’un temps d’exécution (défaut 100ms)
– Toutes les requêtes également
Profiler
//Enable database profiler on the console, 0=off 1=slow 2=all
> db.setProfilingLevel(1, 100)
{ "was" : 0, "slowms" : 100, "ok" : 1 }
//View profile with
> show profile
//or
>db.system.profile.find().pretty()
23. 23
• Index sur des champs geospatiaux
– Utilise le format GeoJSON
– Geometrie sur plans et spheres
2d et 2dSphere
//GeoJSON object structure for indexing
"location" : { "type" : "Point", "coordinates" : [ -0.128, 51.507 ] }
// Index on GeoJSON objects
>db.articles.ensureIndex( { location: “2dsphere” } )
26. 26
Extension de notre exemple
• Stockage du lieu
d’origine du post
• Geolocalisation
récupérée depuis le
navigateur
Collection article
>db.articles.insert({
'text': 'Article
content…’,
'date' : ISODate(...),
'title' : ’Intro to
MongoDB’,
'author' : 'Dan Roberts’,
'tags' : ['mongodb',
'database',
'nosql’],
‘location’ : {
‘type’ : ‘Point’,
‘coordinates’ :
[ -0.128, 51.507 ]
}
});
//Javascript function to get geolocation.
navigator.geolocation.getCurrentPosition();
//You will need to translate into GeoJSON
29. 29
• Permet la recherche de texte avec support
de :
• Stemming, languages, weighting, phrases et
aggregation framework
• Officiel en 2.6
Index text
30. 30
Recherche texte
• Un seul index texte
par collection
• Operateur $** pour
indexer tous les
champs d’une
collection
• Utiliser les poids pour
modifier l’importance
des champs
>db.articles.ensureIndex(
{text :”text”}
)
>db.articles.ensureIndex(
{ "$**" : “text”,
name : “TextIndex”} )
>db.articles.ensureIndex(
{ "$**" : "text”},
{ weights :
{ ”title" : 10, ”text" : 5},
name : "TextIndex” }
)
Operators
$text, $search, $language,
$meta
31. 31
• Utilisation de $text et $search pour requêter
• Retourne un curseur
• $meta pour la récupération du score
– .
// Search articles collection
> db.articles.find ({$text: { $search: ”MongoDB" }})
> db.articles.find(
{ $text: { $search: "MongoDB" }},
{ score: { $meta: "textScore" }, _id:0, title:1 } )
{ "title" : "Intro to MongoDB", "score" : 0.75 }
Recherche texte
33. 33
• Indexing
– #1 pour l’amélioration de la performance….
• Durant le développement, n’oubliez pas
– Explain plan
– Database profiler
• Geospatial
• Text Search
Summary
34. 34
– Reporting et Analytique
– Framework d’agrégation
Prochaine session – 22 Avril