Hakemisto (tietokannat)

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 10.5.2020 tarkistetusta versiosta . tarkastukset vaativat 7 muokkausta .

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.

Arkkitehtuuri

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 .

Sarakesarja yhdistelmähakemistossa

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ä.

Suorituskyky

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ö.

Rajoitukset

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).

Harva ja tiheä indeksi

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.

Muistiinpanot

  1. Indeksoitujen näkymien luominen MS SQL Serverissä . Haettu 10. elokuuta 2010. Arkistoitu alkuperäisestä 3. joulukuuta 2010.
  2. Indeksin käyttäminen lausekkeille ORDER BY:ssä (PostgreSQL) . Haettu 18. elokuuta 2011. Arkistoitu alkuperäisestä 27. syyskuuta 2011.
  3. Kekorakenteet MS SQL Serverissä . Haettu 10. elokuuta 2010. Arkistoitu alkuperäisestä 24. maaliskuuta 2011.
  4. Hector Garcia-Molina, Jeffrey D. Ullman, Jennifer D. Widom. Tietokantajärjestelmät: Täydellinen kirja . - 2. painos - Prentice Hall , 2008. - 1248 s. — ISBN 978-0131873254 .