Sql - cum funcționează indexarea bazei de date? Bază de date - performanță, cod q - rusă (ru)

Atunci când datele sunt stocate pe unități de disc, acestea sunt stocate ca blocuri de date. Accesul la aceste blocuri se realizează în întregime, ceea ce le face disponibile pentru accesul atomic pe disc. Blocurile de discuri sunt structurate în același mod ca listele legate; Ambele conțin o secțiune pentru date, un pointer la locația următorului nod (sau bloc) și ambele nu trebuie să fie stocate în apropiere.







Datorită faptului că un număr de înregistrări pot fi sortate într-un singur domeniu, putem afirma că caseta de căutare, care nu este sortată necesită o căutare liniară, care necesită N / 2 acces bloc (în medie), unde N - numărul de unități , la care se răspândește masa. Dacă acest câmp este un câmp non-cheie (adică E. nu conține înregistrări unice), atunci trebuie să căutați întregul spațiu de tabelă în accesul N la bloc.

În cazul în care câmpul sortat poate fi folosit o căutare binară, are acces la log2 N În plus, din moment ce datele sunt sortate în funcție de domenii non-cheie, restul mesei nu are nevoie pentru a căuta valori duplicate, o dată o valoare mai mare este găsit. Astfel, creșterea productivității este semnificativă.

Ce este indexarea?

Indexarea este o modalitate de sortare a mai multor înregistrări în mai multe domenii. Crearea unui index într-un câmp dintr-un tabel creează o altă structură de date care conține valoarea câmpului și un indicator pentru înregistrarea din care face parte. Apoi, această structură index este sortată, ceea ce permite efectuarea căutărilor binare.

Dezavantajul de indexare este faptul că acești indici necesită spațiu suplimentar, deoarece indexurile sunt stocate împreună într-un tabel MyISAM utilizând mecanismul, acest fișier poate ajunge rapid limitele care stau la baza dimensiunea sistemului de fișiere, atunci când mai multe câmpuri sunt indexate în același tabel.

În primul rând, să trasăm o schemă a tabelului bazei de date;

Notă. char a fost folosit în loc de varchar pentru a furniza dimensiunea exactă pe disc. Această bază de date eșantion conține cinci milioane de rânduri și nu este specificată. Vor fi analizate performanțele mai multor interogări. Aceasta este o solicitare care utilizează identificatorul (câmpul cheii sortate) și unul care utilizează primul nume (câmpul nesortat nespecificat).

Exemplul 1 - câmpuri sortate sau nesortate

Dată fiind baza noastră exemplară r = 5000000 intrările de o dimensiune fixă, care dă lungimea înregistrării R = 204 bytes, iar acestea sunt stocate într-un tabel folosind mecanismul MyISAM care utilizează implicit dimensiunea blocului B = 1,024 bytes. Factorul de blocare al tabelului este bfr = (B / R) = 1024/204 = 5 înregistrări pe bloc de disc. Numărul total de blocuri necesare pentru stocarea tabelului este N = (r / bfr) = 5000000/5 = 1,000,000 blocuri.

Pentru o căutare liniară, câmpul ID necesită o medie de N / 2 = 500.000 de cereri de bloc pentru a găsi valoarea, dat fiind că câmpul id este câmpul cheie. Dar, deoarece câmpul id este sortat, se poate efectua și o căutare binară, care necesită, în medie, log21000000 = 19.93 = 20 unități de acces. Imediat vedem că aceasta este o îmbunătățire radicală.

Acum câmpul firstName este sortat și nu este câmpul cheie, astfel încât căutarea binară nu este posibilă, iar valorile nu sunt unice și, prin urmare, căutarea de masă va fi nevoie să se încheie cu precizie pentru a avea acces unități N = 1.000.000. Această situație are drept scop corectarea indexării.

Dat fiind că înregistrarea indexului conține numai un câmp indexat și un indicator pentru înregistrarea inițială, este rezonabil ca acesta să fie mai mic decât intrarea multipolară indicată. Astfel, pentru indexul în sine, sunt necesare mai puține blocuri de discuri decât tabela originală, deci sunt necesare mai puține apeluri la blocuri. Schema pentru indexul din câmpul FirstName este prezentată mai jos;

Notă. Indicatorii din MySQL au o lungime de 2, 3, 4 sau 5 octeți, în funcție de dimensiunea tabelului.

Având în vedere baza noastră de date exemplară, r = 5.000.000 de înregistrări cu lungimea înregistrării indexului R = 54 octeți și folosind dimensiunea implicită a blocului B = 1.024 octeți. Factorul de blocare al indexului este bfr = (B / R) = 1024/54 = 18 înregistrări pe bloc de disc. Numărul total de blocuri necesare pentru stocarea indexului este N = (r / bfr) = 5000000/18 = 277.778 blocuri.

Când trebuie folosit?

Având în vedere că crearea unui index necesită spațiu suplimentar pe disc (277,778 blocuri suplimentare din exemplul de mai sus, o creștere de 28%), și că prea multe indicii pot cauza probleme legate de dimensiunea limitată a sistemelor de fișiere, trebuie să se gândească cu atenție pentru a alege dreapta Golf indexare.

Deoarece codurile sunt folosite doar pentru a accelera căutarea unui câmp adecvat în evidențe, este clar că câmpul indice utilizat numai pentru ieșire, va fi o pierdere de spațiu de stocare și timpul de procesare în timpul operației de inserare sau de îndepărtare, și, astfel, ar trebui să fie evitate. De asemenea, având în vedere natura binar de căutare, putere importantă sau unicitatea datelor. Indexarea în domeniu, cu o capacitate de 2 ar împărți datele în jumătate, în timp ce puterea de 1000 ar reveni aproximativ 1000 de intrări. La această eficiență energetică scăzută reduce la ordonarea liniară, iar optimizatorul de interogare evită utilizarea indicelui în cazul în care capacitatea este mai mică de 30% din numerele de înregistrare, ceea ce face indicele o risipă de spațiu.

Prima dată când am citit acest lucru, a fost foarte util pentru mine. Mulțumesc.

De atunci am o idee despre lipsa creării de indici: dacă scrieți într-un tabel (UPDATE sau INSERT) cu un index, aveți de fapt două operațiuni de scriere în sistemul de fișiere. Unul pentru datele tabelului și celălalt pentru datele indexului (și utilizarea lui (și - dacă sunt grupate - utilizarea datelor din tabel)). Dacă tabelul și indexul sunt localizate pe aceeași unitate de disc, este nevoie de mai mult timp. Astfel, un tabel fără index (heap) va permite operații de scriere mai rapide. (Dacă ați avea doi indici, ați avea trei operațiuni de scriere, etc.)







Cu toate acestea, determinarea a două locații diferite pe două hard discuri diferite pentru datele de index și datele tabele poate reduce / elimina problema creșterii costului timpului. Acest lucru necesită definirea unor grupuri de fișiere suplimentare cu fișierele corespunzătoare de pe hard disk-urile necesare și localizarea locației tabelului / indexului după cum doriți.

O altă problemă cu indexurile este fragmentarea lor în timp, când sunt introduse date. REORGANIZE vă ajută, trebuie să scrieți proceduri pentru a face acest lucru.

În unele scenarii, halda este mai utilă decât tabela cu indicii,

De exemplu: - Dacă aveți o mulțime de intrări concurente, dar numai o noapte de lectură în afara orelor de lucru pentru raportare.

În plus, diferențierea dintre indicii clusteri și nonclusiții este foarte importantă.

Un index este pur și simplu o structură de date care accelerează căutarea unei coloane particulare în baza de date. Această structură este, de obicei, un b-tree, dar poate fi de asemenea o tabelă de tip hash sau o altă structură logică.

Acum, să presupunem că dorim să rulați interogarea pentru a găsi toate informațiile despre angajați numiți "Abc"?

Ce se va întâmpla fără un index?

Software-ul bazei de date ar trebui literalmente să se uite la fiecare rând din tabelul Employee pentru a vedea dacă Employee_Name este pentru acest șir "Abc". Și din moment ce avem nevoie de fiecare linie numită "Abc" în interiorul ei, nu putem doar să ne oprim, de îndată ce găsim un singur rând numit "Abc", deoarece pot exista și alte linii numite Abc. Astfel, ar trebui găsită fiecare linie până la ultima linie - aceasta înseamnă că mii de linii din acest script ar trebui verificate de baza de date pentru a găsi șirul cu numele "Abc". Aceasta este ceea ce se numește scanare completă a mesei

Cum poate indexul bazei de date să ajute la performanță

Întregul punct de a avea un cod - accelera interogări de căutare, reducerea semnificativă a numărului de înregistrări / rânduri în tabel, aveți nevoie pentru a studia. Un index este o structură de date (cel mai adesea un arbore B) care stochează valori pentru o anumită coloană într-un tabel.

Cum funcționează indexul B-copac?

Motivul pentru care B-arborii sunt cea mai populară structură de date pentru indexuri este că acestea sunt eficiente din punct de vedere al timpului - deoarece căutarea, ștergerea și lipirea se pot face în timp logaritmic. Și un alt motiv important pentru care B-copacii sunt utilizați mai des este că datele stocate în interiorul arborelui B pot fi sortate. RDBMS determină, de obicei, care structură de date este de fapt utilizată pentru index. Dar în anumite scenarii cu DBMS specifice, puteți specifica structura de date pe care doriți să o utilizați în baza de date atunci când creați indexul însuși.

Cum functioneaza masa de hash?

Motivul pentru care sunt utilizați indicii hash este că tabelele hash sunt extrem de eficiente atunci când vine vorba doar de găsirea de valori. Astfel, interogările care sunt comparate pentru egalitate cu un șir pot obține foarte rapid valori dacă folosesc un index hash.

De exemplu, interogarea discutată anterior poate beneficia de indexul hash creat în coloana Employee_Name. O metodă de operare a unui indice de hash ar consta în faptul că o valoare a coloanei este cheia în tabela hash, iar valoarea reală, care este mapat la această cheie va fi pur și simplu un pointer la un rând în tabelul de date. Deoarece tabela hash este de fapt un tablou asociativ, înregistrare tipic ar arata astfel: «Abc => 0x28939», care este 0x28939 referire la rândul din tabel, în cazul în care Abc stocate în memorie. Căutați o valoare de tip «Abc» în tabelul de index hash și returnează o referință la o linie în memorie, în mod evident mult mai rapid decât scanarea tabelului pentru a găsi toate rândurile cu valoarea «Abc» în coloana Employee_Name.

Tabelele Hash nu sortează structurile de date și există multe tipuri de interogări pe care indexurile hash nu le pot ajuta nici măcar. De exemplu, să presupunem că doriți să cunoașteți toți angajații care au mai puțin de 40 de ani. Cum ai putut face acest lucru cu un indice de tabelă de tip hash? Ei bine, este imposibil, deoarece tabelul hash este bun doar pentru a găsi perechi de valori cheie - aceasta înseamnă că întrebările care verifică egalitatea

Ce este exact în indexul bazei de date? Deci, acum știi că un indice de bază de date este creată într-o coloană din tabel și că indicele stochează valorile în acea coloană special. Dar este important să se înțeleagă că baza de date nu stochează valorile indicelui în celelalte coloane ale aceluiași tabel. De exemplu, dacă vom crea o coloană de index Employee_Name, acest lucru înseamnă că valorile coloanei și Employee_Age Employee_Address, de asemenea, nu este stocat în index. Dacă am păstrat doar toate celelalte coloane din index, ar fi ca pentru a crea o altă copie a întregului tabel, care ar ocupa prea mult spațiu și ar fi foarte ineficient.

Cum știe baza de date când să utilizeze indexul? Când se execută o interogare de tip "SELECT * FROM angajat WHERE Employee_Name = 'Abc", baza de date verifică dacă există un index pentru coloana (coloanele) solicitată. Presupunând că coloana Employee_Name are un index creat pe ea, baza de date trebuie să decidă dacă are sens să folosească indexul pentru a găsi valorile dorite - deoarece există câteva scenarii în care este de fapt mai puțin eficientă utilizarea indexului bazei de date. Și este mai eficient să scanezi întreaga masă.

Care este costul indexului bazei de date?

Este nevoie de spațiu - și cu cât este mai mare masa dvs., cu atât este mai mare indexul. Un alt indicator de performanță cu indexuri este faptul că ori de câte ori adăugați, ștergeți sau actualizați rânduri în tabelul corespunzător, aceleași operații trebuie efectuate cu indexul. Amintiți-vă că indexul trebuie să conțină aceleași date până la minute, ca tot ceea ce se află în coloana (coloanele) tabelului care acoperă indexul.

De obicei, un index ar trebui creat doar într-un tabel dacă datele din coloana indexată sunt frecvent solicitate.

Un index nu este altceva decât o structură de date care stochează valori pentru o anumită coloană într-un tabel. Indexul este creat în coloana din tabel.

Acum, să presupunem că dorim să executăm interogarea pentru a găsi toate informațiile despre utilizatorii numiți "John". Dacă executăm următoarea interogare.

Software-ul bazei de date ar trebui să vadă literalmente fiecare linie din tabelul User pentru a vedea dacă numele pentru această linie este "John". Va dura mult timp.
Aici indicele ne ajută "indexul este folosit pentru a accelera interogările de căutare, reducând semnificativ numărul de înregistrări / rânduri din tabel care trebuie studiate".
Cum se creează un index

Indicele constă din valorile coloanelor (de exemplu: John) dintr-un tabel și aceste valori sunt stocate în structura de date.
Deci, acum baza de date va folosi indexul pentru a găsi angajați pe nume John, deoarece indexul este probabil să fie sortat în ordine alfabetică după numele utilizatorului. Deoarece este sortat, înseamnă că căutarea de nume este mult mai rapidă, deoarece toate numele, începând cu "J", vor fi alături de ele în index!

Doar o sugestie rapidă. Deoarece indexare este în valoare de înregistrare suplimentară și spațiu de stocare, astfel încât în ​​cazul în care cererea dumneavoastră necesită mai multe inserții / actualizări, puteți utiliza un tabel fără indici, dar în cazul în care are nevoie de mai multe căutări de date, ar trebui să mergeți la masa indexate.

Pe scurt, un index este o structură de date care stochează valori pentru o anumită coloană într-un tabel pentru a accelera căutarea de interogări.

Un exemplu clasic de "Index în cărți"

Luați în considerare "Cartea" de 1000 de pagini, împărțită în 100 de secțiuni, fiecare secțiune cu pagini X.

Acum, fără o pagină de index pentru a găsi o secțiune specifică începând cu litera "S", nu aveți de ales decât să scanați întreaga carte. Ie 1000 de pagini

Dar cu o pagină de index la început sunteți. Și pentru a citi o secțiune specială care contează, trebuie doar să vă uitați prin pagina de index de fiecare dată din nou și din nou. După ce găsiți indexul corespunzător, puteți naviga efectiv la secțiune, sărind peste celelalte secțiuni.

Dar apoi, pe lângă 1000 de pagini, veți avea nevoie de mai mult

10 pagini pentru afișarea paginii index, deci numai 1010 de pagini.

Astfel, indexul este o secțiune separată care stochează datele înregistrărilor indexate într-o ordine ordonată pentru o căutare eficientă.

Totul este simplu în școli, nu-i așa? P







Trimiteți-le prietenilor: