Sākums » Datubāzes, Lasītāju iesūtītie raksti, mysql, sql tip

Datubāžu indeksi

06.09.2009 16:31 1,119 skatījumi 2 komentāri

Šajā rakstā tiks aprakstīts par datu bāžu indeksiem. Kas tie ir, kā tie strādā. Uzsvars tiks likts uz MySQL DBVS (datu bāzes vadības sistēma), tomēr daži teorētiskie principi ir attiecināmi arī uz relāciju datu bāzem kopumā.

Pēc definīcijas, indekss — datu struktura, kas paredzēta ātrākai ierakstu nolasīšanai no tabulas. Indekss sastāv no vismaz vienas vai vairākām tabulas kollonām. Relāciju datu bāzēs, indekss ir tabulas daļa, uz kuru tiek likts indekss. Viens no galveniem iemesliem, kādēļ datu nolasīšana no indeksa ir ātrāka, nekā no pašas tabulas ir tas, ka indeksa datu struktūras izmērs parasti ir mazāks par pašu tabulu, atsevišķos gadījumos ļaujot to pat uzturēt operatīvajā atmiņā.
Dažas relāciju datu bāzes ļauj izveidot indeksus arī uz funkcijām/izteiksmēm (PostgreSQL) vai uz ierakstiem, kas atbilst īpašiem noteikumiem. MySQL uz doto brīdi tādas iespējas nav.

Indeksu tipi.

INDEX vai KEY – parasts, ne unikāls indekss. Šis indekss var saturēt vienādus ierakstus un tiek izmantots tikai pieprasījumu paātrināšanai.
UNIQUE – šis indekss, papildus pieprasījumu optimizācijai, nepieļauj vienādu ierakstu pievienošanu (vai modificēšanu) laukos, uz kuru indekss ir uzlikts.
PRIMARY – unique indekss pēc būtības, atšķiras ar savu nosaukumu, un to, kas šis indekss var būt tikai viens konkrētā tabulā. “Primary” indeksa nozīme ir unikāli identificēt katru ierakstu tabulā, izmantojot pēc iespējas mazāko lauku skaitu. Bieži vien tiek izmantots uz viena lauka un kopā ar “auto_increment” modifikatoru, kas ļauj izveidot tabulu ar unikāliem ierakstiem un identifikatoriem katram ierakstam.
FULLTEXT – indekss, kas izmantojas tekstu meklēšanai izmantojot MATCH / AGAINST operatorus.

Svarīgi atcerēties, ka sākot ar MySQL 5.0, ir iespējams DBVS var izmantot vairākus indeksus, veicot pieprasījumu. Ar EXPLAIN tas uzrādīsies kā index_merge. Līdz 5.0 versijai, MySQL izmantoja tikai vienu indeksu katrā konkrētā pieprasījumā (ja indekss ir izveidots un atbilst pieprasījuma kritērijiem).

Indeksa pielietošanas veidi.

Parastais indekss.

Vienkāršā veidā indekss uz vienu kolonnu lai paaugstinātu ātrdarbību. Piemēram, ja tiek veikts pieprasījums, balstoties uz lauka author_name, bez indeksa datu bāzei būtu nepieciešams iet cauri visiem ierakstiem, lai atrastu vajadzīgos, jo nav informācijas, par to, cik daudz ierakstiem jāiet cauri. Kā līdzību varētu minēt šādu situāciju. Iedomājaties, ka jums ir bibliotēka ar daudzām grāmatām, un jums vajag atrast Viļa Lāča romānu “Zvejnieka dēls”. Jums būtu jāiet cauri visām grāmatām, lai atrastu vajadzīgo (nav indeksa).  Tagad, kad plaukti ir sakārtoti alfabētiski, jūs vienkārši ejat pie vajadzīgā plaukta “V” (indekss uz autora vārdu author_name).

Kompozītais indekss.

Jebkurš indekss var saturēt vairāk par vienu kollonu (kompozītais indekss). Šajā gadījumā ir svarīga lauku secība, uz kuriem indekss tiek nodefinēts.  Lai kompozītais indekss tiktu izmantots pieprasījumā, tam jāizmanto kollonas sākot no kreisās puses. Pieprasījums nevar izmantot kompozīto indeksu, ja tas tiek balstīts uz otrās vai trešās indeksa daļas. Piemēram, izveidosim 3 indeksus uz sekojošiem laukiem:

1. valsts, rajons, pilseta
2. rajons, pilseta
3. pilseta

Šajā gadījumā, ja tiek veikts pieprasījums pēc “rajons” un “pilseta”, pirmais indekss netiks izmantots. Taču veicot pieprasījumu izmantojot visus šos laukus, tas tiks izmantots. Kā arī tas tiks izmantots gadījumā, ja pieprasījums tiek veikts, izmatojot laukus “valsts”, “rajons”.
Kaut arī kompozītais indekss ir lēnāks nekā indekss uz vienu kolonnu, tas noteikti strādā ātrāk nekā piemēram 3 atsevišķi indeksi uz katru kolonnu.

Nosedzošais indekss.

Indekss, kad tiek pieprasīti visi noindeksētie lauki. Piemēram, ja mums ir izveidots primārais indekss uz lauku ‘id’, un kompozītais indekss uz laukiem a un b, tad veicot pieprasījumu
SELECT id, a FROM tabula WHERE b = 1
šis indekss tiks izmantots. Pievērsiet uzmanību, ka pieprasījumā izmantojas arī lauks ‘id’ – InnoDB tabulas jau ir noindeksētas pēc primārās atslēgas, tāpēc tas iekļaujas nosedzošajā indeksā. Šajā piemērā, pieprasot arī lauku ‘c’, vai pievienojot nosacījumu uz ‘c’, nosedzošais indekss nevarēs tik izmantots.

Daļējais indekss.

Parasti tiek izmantots uz VARCHAR laukiem, noindeksējot tikai daļu teksta. Tas palīdz samazināt indeksa izmēru un līdz ar to pieprasījumu laiku. Kā izmantošanas piemērs būtu daļējs indekss uz lauka gramatas_nosaukums, noindeksējot tikai pirmos 10 simbolus. Tā kā meklēšana vairākumā gadījumu notiek pēc daļas teksta, tiek noindeksēti tikai tās daļas, kuras tiek visbiežāk izmantotas.

Negatīvie aspekti

Lai gan indeksu izmantošana daudzos gadījumos palielina pieprasījumu ātrdarbību, ir gadījumi, kad indeksi to negatīvi ieteikmē – ierakstu pievienošana. Katru reizi, kad tiek pievienots ieraksts tabulā, indekss tiek pārskaitīts no jauna. Pie lielām ierakstu pievienošanas operācijām tas var nozīmīgi samazināt ātrdarbību. Risinājums – dzēst indeksus pirms daudzu ierakstu pievienošanas, un uzlikt tos no jauna kad pievienošana pabeigta. Protams to ir saprātīgāk darīt īpašos gadījumos – indeksa pārbūvē uz vienu INSERT būs nelietderīga.

Autors: Deniss (nitrino)
VN:F [1.2.3_620]
Rating: 4.5/5 (4 votes cast)
  • rob

    Uzzināju šo to jaunu thx

    VA:F [1.2.3_620]
    Rating: 3.7/5 (3 votes cast)
    1
  • korkijs www

    Mana personīga sajūta – tulkots ar ļoti viduvējām tulkotāja zināšanām par tēmu. Otrā rindkopa nav patiesa lielākajai daļai reālās dzīves gadījumu, jā, indeksu izmēra starpība pret visu tabulu ir būtiska pie liela datu apjoma, bet tipiskajā gadījumā galvenā indeksa priekšrocība faktiski visās DBVS būs tā, ka indeksētie dati jau ir sakārtotas datu struktūras (binārs koks, piemēram) un attiecīgi ir visai skaidrs, ka sakārtotā struktūrā lielākoties būs ātrāk veikt nepieciešamo darbību. Tālāk pašā tulkotajā rakstā minētais piemērs par sakārtotu bibliotēku apraksta tieši manis teikto un izmēra starpību – iespēju ielādēt atmiņā indeksu šai gadījumā varētu ilustrēt ar burtnīciņu, kurā ir visu grāmatu nosaukumi un atrašanās vietas, pie milzu bibliotēkas gadījuma tas dotu ieguvumu, pie viena grāmatu skapja bibliotēkas faktiski nav ieguvuma…

    VA:F [1.2.3_620]
    Rating: 4.2/5 (5 votes cast)
    2
  • Nav nevienas atsauces

Ir ko teikt?

Vari izmantot:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

Raksta komentāru RSS