1
Sapientia - Erdélyi Magyar TudományEgyetem (EMTE)
ABR 2( Adatbázisrendszerek 2)
9. Előadás:
teljesítménynövelés
Tárolási motrok
Beilleszthető tárolási motrok Mi egy beilleszthető tárolási motor (storage engine)? Egy interfész a merevlemez és az adatbázis között.
2
Python, pymongo
MongoDB szerver
Storage engine
Merev-lemez
Memória
QUIZ – Tárolási motrok
A tárolási motrok közvetlenül meghatározzák a következők közül melyiket (melyikeket)?
Az index formátumát A drájverek sodrony (pipeline) protokollját A klaszterek architektúráját Az adat fájl-formátumát
3
MMAPv1
Az eredeti tároló motor a MongoDB-ben. Allocate memory or map files or devices in memory LIBRARY Standard C Library (libc, -lc) SYNOPSYS #include<sys/mman.h>
4
100 GB 100 GB Virtual
Memory
MMAPv1
1. Kollekció szintű zárolás 2. Síkbeli módosítás (in plane updates). Ha van hely
módosításra, akkor marad helyben a dokumentum, másképp az egészet elköltöztetjük.
3. Kettes kitevő használata (power of two sizes). 3 byte→4 byte, 7 byte→8 byte, 19 byte→32 byte
A 3-as hozzásegít a 2-es kézbetartásához. Ha a
módosítás kevéssel növeli meg a dokumentumot, akkor helyben kifér a módosítás.
5
MMAPv1 -QUIZ
Mely megállapítások érvényesek az MMAPV1 tárolási motornál?
MMAP dokumentum szintű zárolást biztosít MMAP automatikusan a 2-es hatványának
megfelelő helyet biztosít, mikor dokumentumokat szúrunk be
MMAP a mmap rendszer felső szintjén van, amelyik megfelelteti a fájlokat a memóriába
MMAP menedzseli a használt memóriáját minden megfeleletetett fájlnak, eldöntve, hogy mely részek legyenek a memóriában a lemezről
6
Wired Tiger
1. Documentum szintű konkurrencia (különböző dokumentumokra érvényes)
2. Tömörítést alkalmaz mint a dokumentumokra mint az indexekre. A lemezre való írás előtt tömörít, mert a memóriában való tömörítés fölösleges.
3. Nincs helybeni módosítás. Használata: - storageEngine wiredTiger
7
Indexek {name:”Zoe”,hair_color:”brown”,DOB:”2001-03-23”} A kollekció összevissza van a lemezen. Ha nincs index és Zoe-t
szeretnénk megkeresni, az egész kollekciót végig kell vizsgálni. Az index tartalmaz egy pointert, ahol megtalálható a rekord. B-fákkal van megoldva. (name,hair_color) lehet összetett index is. Ha csak a hajszínre szeretnénk keresni, akkor bajban vagyunk. 8
Andrew Barry Zoe
Andrew Blonde Andrew Red Barry Black
Indexek (a,b,c) indexelve van, akkor használható Írás – lassúbb lesz. Olvasás nagyon gyors lehet. Mikor nagyon sok elemű kollekciót másolunk valahova, érdemes
egyszer átmásolni, majd utána indexelni. 9
a igen a,b igen a,b,c igen b nem b,c nem c nem a,c részlegesen
Quiz – indexek
Melyik optimizációnak van a legnagyobb hatása az adatbázis teljesítményére
o Megnövelni a RAM-ot, hogy az állomány, amit feldolgozunk elférjen benne.
o Gyorsabb lemezegységet adunk hozzá, s így azon műveletek, amelyek lemezelérést ígényelnek sokkal gyorsabbak
o Kicserélni a Processzort (pl. 2x gyorsabbra) o Olyan indexeket adunk a kollekcióhoz, amelyik a
lekérdezések kis százalékában vizsgálja végig a kollekciót
10
Index hozzáadása
use school; db.students.findOne() db.students.find({student_id:5}) db.students.explain().find({student_id:5}) Winning plan: COLLSCAN – collection scan, vagyis
a kollekció összes dokumentumát megvizsgálja. db.students.createIndex ({student_id:1}); db.students.explain(true).find({student_id:5}) - execution stage db.students.createIndex({student_id:1,class_id:-1}) 11
QUIZ – indexek készítése
Kérünk egy Mongo shell utasítást, amelyik a students kollekcióhoz hozzaad egy olyan indexet, amelyiknek a kulcsa class, student_name.
Egyik se megy a -1 irányba.
12
Indexek megtalálása (és törlése)
> db.students.getIndexes() [ { "v" : 1, "key" : {"_id" : 1}, "name" : "_id_", "ns" : "school.students" },{ "v" : 1, "key" : {"student_id" : 1}, "name" : "student_id_1", "ns" : "school.students" } ] db.students.dropIndex ({student_id:1}); 13
QUIZ - Indexek megtalálása (és törlése)
Melyik érvényes utasítás egy kollekciónak (collection) az indexeinek felfedésére?
o db.collection.findIndexes() o db.getIndexes() o db.collection.find("indexes") o show indexes o db.collection.getIndexes()
14
Többkulcsú indexek (multikey indexes)
Tömbökön (arrays) készül ez az index. {nev: “Laszlo”, tagek: [”asztalitenisz”,”minifoci”,”bridge”], szin: “kek”, helyseg:[“Csikszereda”,”Hargita”] } (tagek) (tagek, szin) Nem lehet 2 array tipus, pl. (tagek,helyseg) nem jó Létező adatbázison nem készíti el az indexet, ha 2
array típus van. Ha létezik az index, nem engedi bevinni a nem megfelelő dokumentumot.
15
QUIZ – többkulcsu indexek
A foo kollekción a következő indexet készítettük: db.foo.createIndex( { a:1, b:1 } ) Mely bevitelek érvényesek erre a kollekcióra? db.foo.insert( { a : ["apples", "oranges" ], b : "grapes" } ) db.foo.insert( { a : "grapes", b : "oranges" } ) db.foo.insert( { a : "grapes", b : [ 8, 9, 10 ] } ) db.foo.insert( { a : [ 1, 2, 3 ], b : [ 5, 6, 7 ] } )
16
Dot notation (pont jelölés és többkulcs)
db.students.createIndex({“scores.score”:-1}) db.students.explain().find({'scores':{$elemMatch:{typ
e:'exam',score:{$gt:99.8}}}}) db.students.find({$and:[{'scores.type':'exam'},
{'scores.score':{'$gt':99.8}}]})
17
Dot notation (pont jelölés és többkulcs)
QUIZ People kollekció így néz ki: { "_id" : ObjectId("551458821b87e1799edbebc4"), "name" :
"Eliot Horowitz", "work_history" : [ { "company" : "DoubleClick", "position" : "Software Engineer" }, { "company" : "ShopWiki", "position" : "Founder & CTO" }, { "company" : "MongoDB", "position" : "Founder & CTO" } ] }
Készítsünk indexet a company-ra, csökkenő sorrendben. db.people.createIndex({“work_history.company”:-1})
18
Index készítési opció, Unique
Az eddig elkészített indexek nem voltak egyediek. Egyediek voltak csak az _id indexek, amelyet a rendszer készített el.
db.stuff.drop() db.stuff.insert({'thing':'apple'}) db.stuff.insert({'thing':'pear'}) db.stuff.insert({'thing':'apple'}) db.stuff.createIndex({thing:1}); db.stuff.dropIndex({thing:1}); db.stuff.createIndex({thing:1},{unique:true}); db.stuff.remove({thing:'apple'},{justOne:true}); db.stuff.getIndexes()
19
QUIZ – egyedi (unique) indexek
Kérjük megadni a mongo shell parancsot, amelyik egy egyedi indexet készít a student_id, class_id-re, növekő sorrendben a students kollekcióra.
20
Gyér (sparse) indexek
Adott az alábbi 4 dokumentum. {a:1, b:2, c:5} {a:10, b:5, c:10} {a:13, b:17} {a:7, b:23} Egyedi (Unique) indexet a c-re nem tudok csinálni. Sparse: ne vedd be az indexbe azon dokumentumokat, ahol
hiányzik a kulcs. db.collection.createIndex({c:1},{unique:true}) – nem működik db.collection.createIndex({c:1},{unique:true, sparse:true}) Sort esetében nem hasznos, az egész kollekciót végigpásztázza.
21
QUIZ – gyér (sparse) indexek
Melyek a gyér indexek előnyei. Válaszd ki mindeniket, amelyik talál:
Az indexek csak akkor lehetnek többkulcsuak, ha gyérek
Az index minden esetben sokkal gyorsabban végzi a sorbaállítást.
Nagyobb felxibilitást érünk el a Unique index készítésével
Az index kevesebb helyet foglal el, mintha nem lenne gyér
22
Indexek készítése a háttérben
Tulajdonság Előtérben Háttérben Alapértelmezett Igen Nem Sebesség Gyors Lassú DB blokk WRITE Igen Nem DB blokk READ Igen Nem
23
db.students.createIndex({‘scores.score’:1},{background:true})
QUIZ – indexek készítése a háttérben
Mely állítások igazak a MongoDB háttérben elkészített indexeiről:
Egy mongod szerver egyszerre csak egyetlen indexet tud a
háttérben elkészíteni minden adatbázisra. Bár az adatbázis-szerver fogadja a kéréseket, a háttérben levő
index készítése blokkolja azt a mongo shellt, amelyikben az index készítési parancsot kiadtuk.
A háttérben való index készítése hoszabb időt igényel, mint az előtérben készített index
Mongo 2.2 –ben és azután az indexek a háttérben készülnek alapértelmezés szerint
24
Az explain() használata
Megadja, hogy az adatbázis mit csinál a lekérdezéssel. Hogyan hajtja végre, milyen indexeket használ, hány dokumentumot vizsgál meg. Megadja, mit fog csinálni az adatbázis.
db.foo.find().explain() – volt használatban db.foo.explain().find() db.foo.explain().update() db.foo.explain().remove() db.foo.explain().aggregate() db.foo.explain().help() insert()-re nem használható
25
QUIZ – explain() használata
Melyek érvényes utak megkeresni, hogy milyen indexeket használ egy sajátos lekérdezés?
curs = db.example.find( { a : 1, b : 2 } ); curs.explain() db.example.find( { a : 1, b : 2 } ).explain() db.example.explain().remove( { a : 1, b : 2 } ) db.example.remove( { a : 1, b : 2 } ).explain() db.example.explain().find( { a : 1, b : 2 } ) var exp = db.example.explain(); exp.find( { a : 1, b : 2 } )
26
Explain
Query planner – lekérdezés tervező executionStats – végrehajtási statisztikák allPlansExecution – minden végrehajtási terv var = db.example.explain("executionStats"); var = db.example.explain(“allPlansExecution");
27
QUIZ
Az explain által megadott kimenetet láthatjuk. Mi írja le legjobban a történteket?
o A lekérdezés 10000 dokmentumot fésült át és 520
miliszekundumot tartott o A lekérdezés terv-magyarázata egy kurzor által keletkezik o A lekérdezés használ egy BasicCursor nevű indexet és az
eredményt 619 miliszekundum alatt szolgáltatja o A lekérdezés 999999 dokumentumot fésült át, eredményül
10000 dokumentumot kapott 619 miliszekundum alatt
28
Covered queries (Lefedett lekérdezések)
Egy index által teljesen megvalósítható. Nem szükséges semmilyen más keresés.
Sokkal gyorsabb minden más lekérdezésnél. var = db.numbers.explain(“executionStats”); exp.find({i:45, j:23}); executionStats – 100 returned docs (nReturned) “totalDocsExamined “: 100 “totalKeysExamined”: 100 _id:0, i:1, j:1, k:1 (totalDocsExamined: 0) Ha kihagyjuk a kéket, nem működik 29
Lefedett lekérdezés (covered query) - quiz
Egy lefedett lekérdezést szeretnél készíteni az example kollekción. A következő indexeid vannak:
{ name : 1, dob : 1 } { _id : 1 } { hair : 1, name : 1 } db.example.find( { name : { $in : ["Alfred", "Bruce" ] } }, {
name : 1, hair : 1 } ) db.example.find( { _id : 1117008 }, { _id : 0, name : 1, dob :
1 } ) db.example.find( { name : { $in : [ "Bart", "Homer" ] } },
{_id : 0, hair : 1, name : 1} ) db.example.find( { name : { $in : [ "Bart", "Homer" ] } },
{_id : 0, dob : 1, name : 1} ) 30
Mikor használjuk az indexet?
b, c, c, b, d, e, e, f, a, b, c Lekérdezési terv, amelyik 3 kandidáns indexet használ
31
QUIZ – mikor, melyik indexet használjuk
Adott a foo kollekció a következő indexxel: db.foo.createIndex( { a : 1, b : 1, c : 1 } ) Mely lekérdezések fogják használni ezt az indexet? db.foo.find({c:1}).sort({a:-1, b:1}) db.foo.find( { c : 1 } ).sort( { a : 1, b : 1 } ) db.foo.find( { a : 3 } ) db.foo.find( { b : 3, c : 4 } )
32
Milyen nagy az index állományunk?
Lényeg, hogy az index beférjen a memóriába. db.students.stats() “totalIndexSize”: 668003728 db.students.totalIndexSize()
33
Index kardinalitás
normál gyér többkulcsú 1:1 <=dokumentumok >dokumenutmok Feltételezzük, hogy módosítunk egy dokumentumot,
amelynek egy kulcsa a tag és a módosítás miatt a merevlemezre kell írnunk. Ha a dokumentum 100 tag-et tartalmaz és azok többkulcsos (lista) indexként vannak nyilvántartva, hány helyen kell módosítani az index pointert?
34
Földrajzi indexek (geospatial indexes)-2D
35
x
y
Ember
‘location’:[x,y] ensureIndex({‘location’:’2d’,type:1}) find({location:{$near:[x,y]}}).limit(20) increasing distance (növekvő távolságra)
Geospatial index – Quiz
Suppose you have a 2D geospatial index defined on the key location in the collection places. Write a query that will find the closest three places (the closest three documents) to the location 74, 140.
1 db.places.find({"location":{$near:[74,140]}}).limit(3) Correct
36
Igazi földgömb index
Földrajzi hosszúság és szélesség. Szélesség: -90 től +90 fokig 2dsphere – 2 dimenziós gömb. geoJSON.org MongoDB o Pontok o Poligonok {nev:’Dok kafe’,varos:’Csikszereda’, ‘location’:{‘type’:’Point’,
‘coordinates’:[25.8096112,46.3550264]},type:’kavezo’} db.places.ensureIndex({‘location’:’2dsphere’})
37
db.places.find({ location:{ $near:{ $geometry:{ type:’Point’, coordinates: [25.8096112,46.3550264], $maxdistance: 2000 } } } })
38
Szöveges indexek
Teljes szögeben való keresés? {_id:1,”szavak”:“A kutya keresi a labdat”} db.mondatok.find({“szavak”:”kutya”}) – semmit db.mondatok.ensureIndex({“szavak”:’text’}) db.mondatok.find({$text:{$search:’kutya’}}) db.mondatok.find({$text:{$search:’keresi kutya’}}) Mennyire jó a találat? db.mondatok.find({$text:{$search:’kutya
keresi’}},{score:{$meta:’textScore’}}).sort({score:{$meta:’textScore’}})
39
QUIZ – text keresés
Egy text indexet készítettünk a "title„ mezőre a movies kollekcióban, majd elvégezzük a következő szöveg keresést:
> db.movies.find( { $text : { $search : "Big Lebowski" } } ) Mely dokumentumokat fogja visszaadni, ha ezek mind a movies
kollekcióban vannak? Jelöljük be mindeniket: { "title" : "The Big Lebowski" , star: "Jeff Bridges" } { "title" : "Big" , star : "Tom Hanks" } { "title" : "Big Fish" , star: "Ewan McGregor" }
40
Az index teljesítménye
Cél: jól teljesítő READ/WRITE operációk. (ír/olvas) Szelektivitás: minimalizálni a bejárt rekordokat Más opciók: hogyan kezeljük a sort utasítást? db.students.find({student_id:{$gt:500000},
class_id:54}).sort({student_id:1}).hint({class_id:1}).explain("executionstats")
totalKeysExamined nReturned – result set winningPlan rejectedPlan SORT – minél kevesebbet használjunk
41
QUIZ – index teljesítmények
Általánosságba véve, mely szabályokat kell betartani, amikor összetett indexeket készítünk? A definíciókat használjuk:
equality field: mező, amelyen egyenlőségi tesztet futtatunk sort field: mező, amelyre a lekérdezés sort műveletet ad range field: mező, amelyen a lekérdezés tartományhoz való
tartozást tesztel le Sort field az equality field előtt Equality field a range field előtt Sor field a range field előtt Equality field a sort field előtt Range field az equality field előtt
42
Lassú lekérdezések - profilozó >100 ms – log fájlba kiírja Profiler – system.profiler mongod –dbpath /usr/local/var/mongodb –profile 1 –slowms 2 db.system.profile.find().sort({ts:1}).pretty() db.getProfilingStatus() db.setProfilingLevel(1,4)
43
Szint 0 1 2 kikapcsolva Minden lassú lekérdezést
loggoljon MINDEN lekérdezést loggoljon
QUIZ
Write the query to look in the system profile collection for all queries that took longer than one second, ordered by timestamp descending.
db.system.profile.find({millis:{$gt:1000}}).sort({ts:-1})
44
Mongotop
1. Indexek kritikusak a teljesítmény szempontjából 2. Explain 3. Hint 4. Profiling Magasabb szint a Mongotop. Hol tölti el az idejét a mongo. >mongotop 3 (3 sec)
45
Mongostat
1 sec – beír, lekérdez, módosít, töröl Párhúzamosan futtatni a WiredTiger-en és az mm
46
Sharding – szétszórt adatbázis
47