Indeksit ovat erittäin tärkeitä missä tahansa tietokannassa, eikä MongoDB:ssä ole toisin. Indeksien avulla kyselyiden suorittaminen MongoDB:ssä tehostuu.
Jos sinulla olisi kokoelma, jossa on tuhansia dokumentteja ilman indeksejä, ja sitten tekisit kyselyn löytääksesi tietyt dokumentit, niin tällaisessa tapauksessa MongoDB joutuisi skannaamaan koko kokoelman löytääkseen dokumentit. Mutta jos sinulla olisi indeksit, MongoDB käyttäisi näitä indeksejä rajoittaakseen kokoelmasta haettavien dokumenttien määrää.
Indeksit ovat erityisiä tietokokonaisuuksia, jotka tallentavat osan kokoelman tiedoista. Koska tiedot ovat osittaisia, niiden lukeminen helpottuu. Tämä osittainen joukko tallentaa tietyn kentän arvon tai kenttien joukon, joka on järjestetty kentän arvon mukaan.
Tässä opetusohjelmassa opit –
- Ideksien vaikutuksen ymmärtäminen
- Miten luodaan indeksejä: createIndex()
- Miten etsitään indeksejä: getindexes()
- Miten poistetaan indeksejä: dropindex()
Indeksien vaikutuksen ymmärtäminen
Nyt vaikka johdannosta olemme nähneet, että indeksit ovat hyviä kyselyille, mutta liian moni indeksi voi hidastaa muita operaatioita kuten Insert-, Delete- ja Update-operaatiota.
Jos dokumentteihin suoritetaan usein insert-, delete- ja update-operaatioita, niin indeksejä täytyisi muuttaa niin usein, mikä olisi vain yleiskustannus kokoelmalle.
Alla olevassa esimerkissä on esimerkki siitä, millaiset kentän arvot voisivat muodostaa indeksin kokoelmassa. Indeksi voi perustua joko vain yhteen kokoelman kenttään tai se voi perustua useisiin kokoelman kenttiin.
Oheisessa esimerkissä Employeeid ”1” ja EmployeeCode ”AA” käytetään kokoelman asiakirjojen indeksointiin. Kun siis tehdään kyselyhaku, näitä indeksejä käytetään löytämään nopeasti ja tehokkaasti halutut asiakirjat kokoelmasta.
Siten vaikka hakukysely perustuisi EmployeeCode ”AA” -koodiin, kyseinen asiakirja palautettaisiin.
Indeksien luominen: createIndex()
MongoDB:ssä indeksin luominen tapahtuu ”createIndex”-metodilla.
Seuraavassa esimerkissä näytetään, miten indeksi lisätään kokoelmaan. Oletetaan, että meillä on sama Employee-kokoelmamme, jonka kenttien nimet ovat ”Employeeid” ja ”EmployeeName”.
db.Employee.createIndex({Employeeid:1})
Koodin selitys:
- Metodilla createIndex luodaan indeksi asiakirjan ”Employeeid”-kentän perusteella.
- Parametri ’1’ ilmaisee, että kun indeksi luodaan ”Employeeid”-kentän arvoilla, ne on lajiteltava nousevaan järjestykseen. Huomaa, että tämä eroaa _id-kentästä (id-kenttää käytetään yksilöimään jokainen dokumentti kokoelmassa), jonka MongoDB luo kokoelmaan automaattisesti. Asiakirjat lajitellaan nyt Employeeid-kentän eikä _id-kentän mukaan.
Jos komento suoritetaan onnistuneesti, näytetään seuraava Output:
Tulos:
Output:
- Komento numIndexesBefore: 1 ilmaisee niiden kenttäarvojen lukumäärän (Kokoelman todelliset kentät), jotka olivat indeksissä ennen komennon suorittamista. Muista, että jokaisella kokoelmalla on _id-kenttä, joka lasketaan myös Field-arvoksi indeksiin. Koska _id-indeksikenttä on osa kokoelmaa, kun se alun perin luodaan, numIndexesBefore-kentän arvo on 1.
- NumIndexesAfter: 2 ilmoittaa niiden kentän arvojen lukumäärän, jotka olivat indeksissä komennon suorittamisen jälkeen.
- Tässä ”ok: 1”-ulostulo kertoo, että operaatio onnistui ja uusi indeksi on lisätty kokoelmaan.
Yllä oleva koodi osoittaa, miten luodaan indeksi yhden kentän arvon perusteella, mutta indeksin voi luoda myös useamman kentän arvon perusteella.
Seuraava esimerkki osoittaa, miten tämä voidaan tehdä;
db.Employee.createIndex({Employeeid:1, EmployeeName:1])
Koodin selitys:
- The createIndex-metodi ottaa nyt huomioon useita Field-arvoja, jolloin indeksi luodaan nyt ”Employeeid”- ja ”EmployeeName”-arvojen perusteella. Employeeid:1 ja EmployeeName:1 osoittaa, että indeksi olisi luotava näiden kahden kentän arvojen perusteella, ja :1 osoittaa, että indeksin olisi oltava nousevassa järjestyksessä.
Indeksien etsiminen: getindexes()
MongoDB:ssä indeksin löytäminen tapahtuu ”getIndexes”-metodilla.
Seuraavassa esimerkissä näytetään, miten tämä voidaan tehdä;
db.Employee.getIndexes()
Koodin selitys:
- Metodilla getIndexes etsitään kaikki kokoelman indeksit.
Jos komento suoritetaan onnistuneesti, näytetään seuraava Output:
Output:
- Tuloste palauttaa asiakirjan, josta näkyy vain, että kokoelmassa on kaksi indeksiä, joista toinen on _id-kenttä ja toinen on Employee id-kenttä. Merkintä :1 osoittaa, että indeksin kentän arvot luodaan nousevaan järjestykseen.
Indeksien poistaminen: dropindex()
MongoDB:ssä indeksin poistaminen tapahtuu dropIndex-metodin avulla.
Seuraavassa esimerkissä näytetään, miten tämä voidaan tehdä;
db.Employee.dropIndex(Employeeid:1)
Code Explanation:
- DropIndex-metodi ottaa tarvittavat Field-arvot, jotka on poistettava indeksistä.
Jos komento suoritetaan onnistuneesti, näytetään seuraava Output:
Output:
- NIndexesWas: 3 osoittaa niiden kenttäarvojen lukumäärän, jotka olivat indeksissä ennen komennon suorittamista. Muista, että jokaisella kokoelmalla on _id-kenttä, joka lasketaan myös Field-arvoksi indeksiin.
- Ok: 1 -tuloste kertoo, että operaatio onnistui ja ”Employeeid”-kenttä on poistettu indeksistä.
Poistaaksesi kerralla kaikki kokoelman indeksit, voit käyttää komentoa dropIndexes.
Seuraavassa esimerkissä näytetään, miten tämä voidaan tehdä.
db.Employee.dropIndex()
Koodin selitys:
- DropIndexes-metodi poistaa kaikki indeksit lukuun ottamatta _id-indeksiä.
Jos komento suoritetaan onnistuneesti, näytetään seuraava Output:
Output:
- NIndexesWas: 2 kertoo niiden kenttäarvojen määrän, jotka olivat indekseissä ennen komennon suorittamista.
- Muista jälleen, että jokaisessa kokoelmassa on _id-kenttä, joka lasketaan myös Field-arvoksi indeksiin, eikä MongoDB poista sitä ja siitä tämä viesti kertoo.
- Ok: 1 -tuloste kertoo, että operaatio onnistui.
Yhteenveto
- Indeksien määrittäminen on tärkeää kokoelman dokumenttien nopeamman ja tehokkaamman haun kannalta.
- Indeksit voidaan luoda createIndex-metodilla. Indeksit voidaan luoda vain yhdelle kentälle tai useammalle kentän arvolle.
- Indeksit voidaan löytää getIndexes-metodilla.
- Indeksit voidaan poistaa dropIndex-metodilla yksittäisille indekseille tai dropIndexes-metodilla kaikille indekseille.