Hakemisto ( englanniksi index ) - tietokantaobjekti , joka on luotu tietojen haun suorituskyvyn parantamiseksi . Tietokannan taulukoissa voi olla suuri määrä rivejä, jotka on tallennettu mielivaltaisessa järjestyksessä, ja niiden etsiminen tietyn kriteerin mukaan skannaamalla taulukko rivi kerrallaan voi kestää kauan. Hakemisto muodostuu yhden tai useamman taulukon sarakkeen arvoista ja taulukon vastaaville riveille osoittavista osoittimista ja mahdollistaa siten hakuehtojen mukaisten rivien etsimisen. Indeksien käytön nopeuttaminen saavutetaan ensisijaisesti siksi, että indeksillä on hakuoptimoitu rakenne - esimerkiksi tasapainotettu puu .
Jotkut DBMS -järjestelmät laajentavat indeksien ominaisuuksia ottamalla käyttöön mahdollisuuden luoda indeksejä näkymäsarakkeisiin [1] tai indeksejä lausekkeisiin. [2] Esimerkiksi indeksi voidaan luoda lausekkeella upper(last_name)ja se tallentaa vastaavasti viittaukset, joiden avain on kentän arvo last_nameisoilla kirjaimilla. Lisäksi indeksit voidaan ilmoittaa joko yksilöllisiksi tai ei-yksilöllisiksi. Yksilöllinen indeksi toteuttaa taulukon eheysrajoituksen, mikä eliminoi mahdollisuuden lisätä päällekkäisiä arvoja.
Indeksejä on kahden tyyppisiä: klusteroituja ja ei-klusteroituja. Jos on klusteroitu indeksi, taulukon rivit järjestetään indeksiavaimen arvon mukaan. Jos taulukolla ei ole klusteroitua indeksiä, taulukkoa kutsutaan kasaksi [3] . Tällaiseen taulukkoon luotu klusteroitu indeksi sisältää vain osoittimia taulukon tietueisiin. Taulukkoa kohden voi olla vain yksi klusteroitu indeksi, mutta jokaisessa taulukossa voi olla useita erilaisia ei-klusteroituja indeksejä, joista jokainen määrittää oman tietuejärjestyksensä.
Indeksejä voidaan toteuttaa erilaisilla rakenteilla. Yleisimmin käytettyjä ovat B*-puut , B+-puut , B-puut ja tiivisteet .
Järjestys, jossa sarakkeet näkyvät yhdistelmähakemistossa, on varsin tärkeä. Asia on siinä, että kyselylle on mahdollista saada tietojoukko, joka vaikuttaa vain ensimmäiseen indeksoiduista sarakkeista. Useimmissa DBMS-järjestelmissä on kuitenkin mahdotonta tai tehotonta saada tietoja vain toisesta ja muista indeksoiduista sarakkeista (ei rajoituksia ensimmäiselle sarakkeelle).
Kuvittele esimerkiksi puhelinluettelo, joka on lajiteltu ensin kaupungin, sitten sukunimen ja sitten etunimen mukaan. Jos tiedät kaupungin, löydät helposti kaikki sen kaupungin puhelinnumerot. Tällaisessa hakemistossa on kuitenkin erittäin aikaa vievää löytää kaikki tietylle sukunimelle tallennettuja puhelimia - tätä varten sinun on etsittävä kunkin kaupungin osiosta ja etsittävä sieltä haluttu sukunimi. Jotkut DBMS-järjestelmät tekevät tämän työn, toiset eivät vain käytä tällaista indeksiä.
Parhaan kyselyn suorituskyvyn varmistamiseksi indeksit luodaan yleensä taulukon sarakkeisiin, joita käytetään usein kyselyissä. Samaan taulukkoon voidaan luoda useita indeksejä. Indeksien määrän lisääminen kuitenkin hidastaa taulukon rivien lisäämistä, päivittämistä ja poistamista, koska itse indeksit on päivitettävä. Lisäksi hakemistot vievät enemmän muistia, joten ennen indeksin luomista on varmistettava, että kyselyiden odotettu suorituskyvyn lisäys on suurempi kuin tietokoneesi indeksin ylläpitämiseen tarvittavien lisäresurssien käyttö.
Indeksit ovat hyödyllisiä monille sovelluksille, mutta niiden käytölle on rajoituksia. Ota tämä SQL -kysely :
SELECT etunimi FROM people WHERE last_name = 'Frankenstein' ;Suorittaakseen tällaisen kyselyn ilman indeksiä DBMS:n on tutkittava kenttä last_namejokaisella taulukon rivillä (tämä mekanismi tunnetaan nimellä "raaka voima" tai "täysi taulukkotarkistus", ja se voidaan näyttää suunnitelmassa LUONNONNA). Indeksiä käytettäessä DBMS yksinkertaisesti kulkee B-puun läpi, kunnes se löytää merkinnän "Frankenstein". Tällainen passi vaatii paljon vähemmän resursseja kuin täydellinen taulukon haku.
Otetaan nyt tämä kysely:
SELECT email_address FROM asiakkailta WHERE email_address LIKE '%@yahoo.com' ;Tämän kyselyn pitäisi löytää kaikki asiakkaat, joiden sähköposti päättyy -merkkiin @yahoo.com, mutta vaikka email_addresssarakkeessa olisi indeksi, DBMS käyttää silti täydellistä taulukon hakua. Tämä johtuu siitä, että indeksit on rakennettu olettamukselle, että sanat/merkit siirtyvät vasemmalta oikealle. Jokerimerkin käyttö hakuehdon alussa estää DBMS:ää käyttämästä B-puuhakua. Monissa DBMS-järjestelmissä tämä ongelma voidaan ratkaista luomalla lisäindeksi lausekkeella reverse(email_address)ja muodostamalla kysely, kuten:
SELECT email_address FROM asiakkailta WHERE käänteinen ( email_address ) LIKE käänteinen ( '%@yahoo.com' );Tässä tapauksessa jokerimerkki näkyy äärimmäisenä oikealla ( moc.oohay@%), mikä ei estä indeksin käyttöä reverse(email_address).
Yleisesti ottaen tietokantojen hakemisto on tiedosto, joka sisältää sarjan avaimia ja osoittimia. [4] Ajatus indeksien käytöstä tuli siitä, että nykyaikaiset tietokannat ovat liian massiivisia mahtuakseen päämuistiin. Yleensä jaamme tiedot lohkoihin ja allokoimme tiedot muistiin lohko kerrallaan. Tietueen etsiminen tietokannasta voi kuitenkin kestää kauan. Toisaalta indeksitiedosto tai indeksilohko on paljon pienempi kuin datalohko ja mahtuu päämuistipuskuriin, mikä nopeuttaa tietueen hakua.
Harvalle indeksille on ominaista se, että jokainen avain liittyy tiettyyn lohkoosoittimeen lajitetussa datatiedostossa.
Tiheä indeksi puolestaan eroaa siinä, että jokainen avain on liitetty tiettyyn osoittimeen lajitetussa datatiedostossa olevaan tietueeseen .
Klusteroiduissa indekseissä, joissa on päällekkäisiä avaimia, harva indeksi osoittaa kunkin lohkon pienimpään avaimeen , kun taas tiheä indeksi osoittaa ensimmäiseen merkintään määritetyllä avaimella.
Tietokanta | |
---|---|
Käsitteet |
|
Objektit |
|
Avaimet | |
SQL | |
Komponentit |