2014 it - app dev series - 04 - indicizzazione

31
Serie Sviluppo di un’Applicazione Back to Basics Strategie di Indicizzazione Senior Solutions Architect, MongoDB Inc. Massimo Brignoli #MongoDBBasics

description

 

Transcript of 2014 it - app dev series - 04 - indicizzazione

Page 1: 2014   it - app dev series - 04 - indicizzazione

Serie Sviluppo di un’ApplicazioneBack to BasicsStrategie di Indicizzazione

Senior Solutions Architect, MongoDB Inc.

Massimo Brignoli

#MongoDBBasics

Page 2: 2014   it - app dev series - 04 - indicizzazione

Agenda

• Riassunto delle puntate precedenti

• Le Basi dell’indicizzazione– Tipi di indice nella nostra applicazione– Indici composti– Indici Covered

• Valutazione/Tuning– Piano di esecuzione: Explain– Profiler del Database

• Geografia

• Ricerca full-text

Page 3: 2014   it - app dev series - 04 - indicizzazione

Q & A

Virtual Genius Bar

– Use the chat to post questions

– EMEA Solution Architecture / Support team are on hand

– Make use of them during the sessions!!!

Page 4: 2014   it - app dev series - 04 - indicizzazione

Riassunto delle puntate precedenti….

Page 5: 2014   it - app dev series - 04 - indicizzazione

Inserimenti

• ObjectId()

• _id

• Durabilità

• WriteConcerns

• Anche per update

>db.articles.insert({'text': 'Article

content…’, 'date' : ISODate(...), 'title' : ’Intro to MongoDB’, 'author' : 'Dan Roberts’, 'tags' : [

'mongodb',

'database', 'nosql’

]});

opzioni w: MAJORITY, j : true

Page 6: 2014   it - app dev series - 04 - indicizzazione

Query

• Operatori di comparazione

• proiezioni

• cursori

operatori

$gt, $gte, $in, $lt,

$lte, $ne, $nin>var cursor = db.articles.find( { ’author' : ’Dan Roberts’ } , {‘_id’:0, ‘title’:1})

>cursor.hasNext()true

>cursor.next(){ "title" : "Intro to MongoDB" }

Page 7: 2014   it - app dev series - 04 - indicizzazione

Update

• Manipolare i documenti in modo efficiente

• Buckets

• Repor pre-aggregati

• Update sul posto

operators

$each, $slice, $sort, $inc, $push

$inc, $rename, $setOnInsert, $set, $unset, $max, $min

$, $addToSet, $pop, $pullAll, $pull, $pushAll, $push

$each, $slice, $sort

>db.comments.update(

{‘c’: {‘$lt’:10}}, {

‘$inc’ : {c:1},

'$push' : {

'comments' : ‘Excellent’ }},{ upsert : true }

)

Page 8: 2014   it - app dev series - 04 - indicizzazione

Basi dell’Indicizzazione

Page 9: 2014   it - app dev series - 04 - indicizzazione

Basi dell’Indicizzazione

E’ il più grande fattore di miglioramento delle performance in un DB

L’efficienza degli indici va studiata fin da subito

– .// indice sull’autore (ascendente)>db.articles.ensureIndex( { author : 1 } )

// indice sull’autore (discendente)>db.articles.ensureIndex( { author : -1 } )

// indice su un array di valori – indice multi-key>db.articles.ensureIndex( { tags : 1 } )

Page 10: 2014   it - app dev series - 04 - indicizzazione

Indici su Sottodocumenti

E’ possibile creare indici su sottodocumenti:

– Usando la “dot notation”

{‘_id’ : ObjectId(..),

‘article_id’ : ObjectId(..), ‘section’ : ‘schema’,

‘date’ : ISODate(..),‘daily’: {

‘views’ : 45,

‘comments’ : 150 } ‘hours’ : { 0 : { ‘views’ : 10 }, 1 : { ‘views’ : 2 }, … 23 : { ‘views’ : 14,

‘comments’ : 10 } }}

>db.interactions.ensureIndex(

{ “daily.comments” : 1}

}

>db.interactions.find(

{“daily.comments” : { $gte : 150} } ,

{ _id:0, “daily.comments” : 1 } )

Page 11: 2014   it - app dev series - 04 - indicizzazione

Gli indici in MongoDB sono B-Tree

Page 12: 2014   it - app dev series - 04 - indicizzazione

Costo O(log(n))

Page 13: 2014   it - app dev series - 04 - indicizzazione

Indici Composti

Sono indici che usano più di un valore

//Da effettuare nella console mongo> db.articles.ensureIndex( { author : 1, tags : 1 } )

> db.articles.find( { author : ‘Dan Roberts’, tags : ‘MongoDB’} )//e> db.articles.find( { author : ‘Dan Roberts’ } )

// Non avete bisogno di questo indice:> db.articles.ensureIndex( { author : 1 } )

Page 14: 2014   it - app dev series - 04 - indicizzazione

Ordinamento

L’ordinamento non ha importanza sugli indici singoli

– Possiamo leggere da entrambe le parti di un btree• { attribute: 1 } o{ attribute: -1 }

L’ordinamento ha importanza negli indici composti

– Ad esempio vogliamo fare una query sull’autore ed ordinare per data// indici su autore crescente ma data decrescente

>db.articles.ensureIndex( { ‘author’ : 1, ‘date’ -1 } )

Page 15: 2014   it - app dev series - 04 - indicizzazione

Query su Covered Index

Ritornano i dati solamente dall’indice

– Invece che dai file del database– Ottimizzazione delle performance– Funziona con gli indici composti

• Invoke with a projection

> db.users.ensureIndex( { user : 1, password :1 } )

> db.user.find({user:"danr"}, {_id:0, password:1})

{ "password" : ”*********" }

Tip: use projections anyway to reduce data sent back to the client

Page 16: 2014   it - app dev series - 04 - indicizzazione

Piano di Explain

Usato per valutare per operazioni e gli indici

– Indica che indice e’ stato usato, se ce n’e’– Quanti documenti sono stati scansionati– Puo’ essere visualizzato nella console o

nell’applicazione

//Da fare nella console> db.articles.find({author:'Dan Roberts'}).sort({date:-1}).explain()

Page 17: 2014   it - app dev series - 04 - indicizzazione

Output del piano di Explain

{"cursor" : "BtreeCursor

author_1_date_-1","isMultiKey" : false,"n" : 1,"nscannedObjects" : 1,"nscanned" : 1,"nscannedObjectsAllPlans" : 1,"nscannedAllPlans" : 1,"scanAndOrder" : false,"indexOnly" : false,"nYields" : 0,"nChunkSkips" : 0,"millis" : 0,"indexBounds" :….

Other Types:

• BasicCursor• Full collection scan

• BtreeCursor• GeoSearchCursor• Complex Plan• TextCursor

Page 18: 2014   it - app dev series - 04 - indicizzazione

Database profiler

Da abilitare per vedere le query lente

– (o tutte le query)– Default 100ms

//Abilita il database profiler nella console, 0=off 1=slow 2=all> db.setProfilingLevel(1, 100){ "was" : 0, "slowms" : 100, "ok" : 1 }

//Vedere il profilo con> show profile

//oppure>db.system.profile.find().pretty()

Page 19: 2014   it - app dev series - 04 - indicizzazione

Output del Database profiler

{"op" : "query","ns" : "test.articles","query" : {

"query" : {"author" : "Dan Roberts"

},"orderby" : {

"date" : -1}

},"ntoreturn" : 0,"ntoskip" : 0,"nscanned" : 1,"nreturned" : 1,

……

Page 20: 2014   it - app dev series - 04 - indicizzazione

Indici Geografici

Page 21: 2014   it - app dev series - 04 - indicizzazione

2dSphere

Indici su campi geospaziali

– Usando la notazione degli oggetti GeoJSON– Geometria su sfera

//Struttura di un oggetto GeoJSON per l’indicizzazione

"location" : { "type" : "Point", "coordinates" : [ -0.128, 51.507 ] }

// Indice su oggetti GeoJSON>db.articles.ensureIndex( { location: “2dsphere” } )

Page 22: 2014   it - app dev series - 04 - indicizzazione

Documenti degli Articoli Esteso

• Memorizza la posizione dove e’ stato postato l’articolo

• Posizione Geo dal browser

Collection degli Articoli>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 ] }

});

//Funzione per leggere la posizione geograficanavigator.geolocation.getCurrentPosition();

//Da tradurre in un GeoJSON

Page 23: 2014   it - app dev series - 04 - indicizzazione

Esempio

– Query e explain>db.articles.find( { location :

{ $near :{ $geometry :{ type : "Point" ,coordinates : [-

0.128, 51.507] } }, $maxDistance : 5000 }

} )//explain output…{

"cursor" : "S2NearCursor","isMultiKey" : true,"n" : 1,"nscannedObjects" : 1,"nscanned" : 1,….

Page 24: 2014   it - app dev series - 04 - indicizzazione

Ricerca Testuale

Page 25: 2014   it - app dev series - 04 - indicizzazione

Indici di Testo

• Abilita la ricerca full-text• Include il supporto per:– Stemming, 15 lingue, peso, frasi e supporto

all’aggregazione framework– Aggiornata e abilita nella versione 2.6

(rilasciata da poco)• Questi esempio usano la sintassi e le

caratteristiche della 2.6

• La ricerca full-text è importante per i CMS

Page 26: 2014   it - app dev series - 04 - indicizzazione

Ricerca Testuale

• Solo un indice di testo per collection

• Operatore $** per indicizzare tutti i campi testo

• Usa weights per cambiare l’importanza dei campi

>db.articles.ensureIndex({text :”text”}

)

>db.articles.ensureIndex( { "$**" : “text”,

name : “TextIndex”} )

>db.articles.ensureIndex( { "$**" :

"text”}, { weights :

{ ”title" : 5, ”text" : 10}, name : "TextIndex” })

Operatori$text, $search, $language, $meta

Page 27: 2014   it - app dev series - 04 - indicizzazione

Ricerca

Si usano gli operatori $text e $search per fare una query

Ritornano un cursore (finalmente).

$meta for scoring results

– .

// Ricerca gli articoli nella 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 }

Page 28: 2014   it - app dev series - 04 - indicizzazione

Sommario

Page 29: 2014   it - app dev series - 04 - indicizzazione

Sommario

• Indicizzazione– #1 per migliorare le performance

• Usate durante lo sviluppo per controllare di andare nella direzione corretta:

– Explain plan– Database profiler

• Geospaziale

• Ricerca Full-Text

Page 30: 2014   it - app dev series - 04 - indicizzazione

Prossima Sessione – 13th May

– Reporting e Analytics• Come usare i Report

– Aggregation Framework

• Introduzione

Page 31: 2014   it - app dev series - 04 - indicizzazione