Kaip pagerinti užklausas naudojant MongoDB indeksavimą

Kaip Pagerinti Uzklausas Naudojant Mongodb Indeksavima



Padidinti užklausos greitį būtina MongoDB ir visoms kitoms duomenų bazių sistemoms. Kuriant duomenų struktūras, kurios padeda MongoDB greičiau identifikuoti įrašus, indeksavimas yra veiksmingas būdas pagreitinti ir optimizuoti paieškas. Indeksai apima kai kurių įrašų duomenų kopijas, kad užklausos būtų veiksmingesnės. Tai supaprastina pastangas, susijusias su atsakymu į MongoDB užklausas. Šiame vadove aptarsime indeksų naudojimą naudojant skirtingus indeksavimo tipus.

Sukurti kolekciją

Prieš naudodami indeksus, turime sukurti naują kolekciją savo MongoDB. Jau sukūrėme vieną ir įdėjome 10 dokumentų pavadinimu „Manekenas“. Funkcija find() MongoDB rodo visus įrašus iš kolekcijos „Dummy“ žemiau esančiame MongoDB apvalkalo ekrane.

testas> db.Dummy.find()







Pasirinkite Indeksavimo tipą

Prieš nustatydami indeksą, pirmiausia turite nustatyti stulpelius, kurie bus dažniausiai naudojami užklausos kriterijais. Indeksai gerai veikia stulpeliuose, kurie dažnai filtruojami, rūšiuojami arba ieškomi. Didelio kardinalumo laukai (daug skirtingų reikšmių) dažnai yra puikios indeksavimo parinktys. Štai keletas skirtingų indeksų tipų kodų pavyzdžių.



01 pavyzdys: vieno lauko indeksas

Tai tikriausiai pats svarbiausias indekso tipas, kuris indeksuoja vieną stulpelį, kad padidintų užklausos greitį tame stulpelyje. Šio tipo indeksas naudojamas užklausoms, kuriose naudojate vieną rakto lauką rinkinio įrašų užklausai pateikti. Tarkime, kad naudojate lauką „tipas“, kad pateiktumėte užklausą kolekcijos „Dummy“ įrašams naudodami paieškos funkciją, kaip nurodyta toliau. Ši komanda apžvelgs visą kolekciją, todėl gali užtrukti daug laiko, kol bus apdorotos didžiulės kolekcijos. Todėl turime optimizuoti šios užklausos našumą.



testas> db.Dummy.find({tipas: 'emp' })





Aukščiau pateikti Dummy rinkinio įrašai buvo rasti naudojant lauką „tipas“, t. y. su sąlyga. Todėl norint optimizuoti paieškos užklausą, čia galima naudoti vieno klavišo indeksą. Taigi, mes naudosime MongoDB funkciją createIndex (), kad sukurtume indeksą „Dummy“ kolekcijos lauke „type“. Šios užklausos naudojimo iliustracijoje pavaizduotas sėkmingas vieno rakto indekso, pavadinto „type_1“, sukūrimas apvalkale.

testas> db.Dummy.createIndex({ tipas: 1 })

Panaudokime Find() užklausą, kai ji gaus naudodama lauką 'tipas'. Operacija dabar bus žymiai greitesnė nei anksčiau naudota Find() funkcija, nes indeksas yra vietoje, nes MongoDB gali naudoti indeksą, kad greitai nuskaitytų įrašus su prašomu pareigų pavadinimu.



testas> db.Dummy.find({tipas: 'emp' })

02 pavyzdys: sudėtinis indeksas

Tam tikromis aplinkybėmis galime ieškoti prekių pagal įvairius kriterijus. Sudėtinio šių laukų indekso įdiegimas gali padėti pagerinti užklausos našumą. Tarkime, šį kartą norite ieškoti iš kolekcijos „Manekenas“ naudodami kelis laukus, kuriuose yra skirtingos paieškos sąlygos, kaip rodoma užklausoje. Ši užklausa ieško įrašų iš kolekcijos, kurioje laukas „type“ nustatytas į „emp“, o laukas „sal“ yra didesnis nei 350.

$gte loginis operatorius buvo naudojamas sąlygai pritaikyti lauke „sal“. Iš viso buvo grąžinti du įrašai, išnagrinėjus visą kolekciją, kurią sudaro 10 įrašų.

testas> db.Dummy.find({tipas: 'emp' , sal: {$gte: 350 } })

Sukurkime anksčiau minėtos užklausos sudėtinį indeksą. Šis sudėtinis indeksas turi laukus „tipas“ ir „sal“. Skaičiai „1“ ir „-1“ žymi atitinkamai didėjančia ir mažėjančia tvarka laukuose „type“ ir „sal“. Sudėtinio indekso stulpelių seka yra svarbi ir turi atitikti užklausos šablonus. MongoDB šiam sudėtiniam indeksui suteikė pavadinimą „type_1_sal_-1“, kaip parodyta.

testas> db.Dummy.createIndex({ tipas: 1 , bus:- 1 })

Panaudoję tą pačią užklausą find() ieškodami įrašų, kurių lauko reikšmė „type“ yra „emp“, o lauko „sal“ reikšmė didesnė nei 350, gavome tą pačią išvestį, šiek tiek pakeitus tvarką. palyginti su ankstesnės užklausos rezultatu. Didesnis „sal“ lauko vertės įrašas dabar yra pirmoje vietoje, o mažiausia – žemiausia pagal „-1“, nustatytą „sal“ laukui aukščiau esančiame sudėtiniame indekse.

testas> db.Dummy.find({tipas: 'emp' , sal: {$gte: 350 } })

03 pavyzdys: teksto rodyklė

Kartais galite susidurti su situacija, kai turėtumėte tvarkyti didelį duomenų rinkinį, pvz., didelius produktų, ingredientų aprašymus ir pan. Teksto rodyklė gali būti naudinga atliekant viso teksto paieškas dideliame teksto lauke. Pavyzdžiui, savo bandymų duomenų bazėje sukūrėme naują kolekciją pavadinimu „Test“. Į šį rinkinį įterpti iš viso 6 įrašai, naudojant funkciją insertMany() pagal toliau pateiktą užklausą find().

testas> db.Test.insertMany([

{vardas: 'Ana' , iš: „Ji gyvena Londone ir yra gera mokytoja“ },

{vardas: 'Robertas' , iš: 'Jis yra toks nuostabus futbolininkas' },

{vardas: 'nuo' , iš: „Galbūt keliaus į Dubajų“ },

{vardas: 'Jokūbas' , iš: „Jis jaudinantis ir turtingas“. },

{vardas: 'Cillian' , iš: „Nuostabi filmo pradžia akimirksniu išgarsėjo“ },

{vardas: 'Ken' , iš: 'Maisto mylėtojas. Ji gali valgyti ir tave.' }

])

Dabar sukursime teksto rodyklę šios kolekcijos lauke „Des“, naudodami MongoDB funkciją createIndex (). Raktažodis „tekstas“ lauko reikšmėje rodo indekso tipą, kuris yra „teksto“ indeksas. Indekso pavadinimas des_text buvo sugeneruotas automatiškai.

testas> db.Test.createIndex({ des: 'tekstas' })

Dabar funkcija find () buvo naudojama atliekant „teksto paiešką“ kolekcijoje naudojant „des_text“ indeksą. Operatorius $search buvo naudojamas ieškant žodžio „maistas“ kolekcijos įrašuose ir rodyti tą konkretų įrašą.

testas> db.Test.find({ $text: { $search: 'maistas' }});

Patikrinkite indeksus:

Galite patikrinti ir išvardyti visus taikomus skirtingų kolekcijų indeksus savo MongoDB. Norėdami tai padaryti, naudokite metodą getIndexes () kartu su kolekcijos pavadinimu MongoDB apvalkalo ekrane. Šią komandą naudojome atskirai „Test“ ir „Dummy“ kolekcijoms. Tai rodo visą reikiamą informaciją apie įtaisytuosius ir vartotojo nustatytus indeksus ekrane.

testas> db.Test.getIndexes()

testas> db.Dummy.getIndexes()

Nuleidimo indeksai:

Atėjo laikas ištrinti indeksus, kurie anksčiau buvo sukurti kolekcijai naudojant dropIndex() funkciją, kartu su tuo pačiu lauko pavadinimu, kuriam buvo pritaikytas indeksas. Toliau pateikta užklausa rodo, kad vienas indeksas buvo pašalintas.

testas> db.Dummy.dropIndex({tipas: 1 })

Lygiai taip pat galima sumažinti sudėtinį indeksą.

testas> db.Dummy.drop index({tipas: 1 , bus: 1 })

Išvada

Spartinant duomenų gavimą iš MongoDB, indeksavimas yra būtinas siekiant padidinti užklausų efektyvumą. Trūkstant indeksų, MongoDB turi ieškoti atitinkančių įrašų visoje kolekcijoje, o tai tampa mažiau efektyvi, kai rinkinio dydis didėja. MongoDB galimybė greitai rasti reikiamus įrašus naudojant indeksų duomenų bazės struktūrą pagreitina užklausų apdorojimą, kai naudojamas tinkamas indeksavimas.