Cum indexează indexurile mysql, cod q - un rus (en)

Practic, indicele din tabel funcționează ca un indice din cartea (de unde a venit numele):

Să presupunem că aveți o carte despre bazele de date și doriți să găsiți câteva informații despre depozit. Fără index (fără ajutor suplimentar, cum ar fi un tabel cuprins) trebuie să treacă prin pagini unul câte unul, până când găsiți subiectul (această scanare completă tabel). Pe de altă parte, indicele este o listă de cuvinte cheie, astfel încât vă referiți la index și a vedea ce stocare este menționat la paginile 113-120, 231 și 354. Apoi, puteți merge direct la paginile respective, fără a căuta (o căutare utilizând indexul, un pic mai repede ).







Desigur, cât de util este indexul depinde de multe lucruri - mai multe exemple, folosind comparația de mai sus:

  • Dacă aveți o carte despre bazele de date și ați indexat cuvântul "bază de date", veți vedea că aceasta este menționată la paginile 1-59,61-290 și 292-400. În acest caz, indicele nu ajută prea mult și se poate mișca mai repede prin paginile unul câte unul (în baza de date aceasta este "selectivitate slabă").
  • Pentru o carte de 10 pagini are nici un sens să elaboreze un index, astfel încât să puteți obține o carte de 10 pagini cu prefixul 5 pagini, e doar prostie - scana doar 10 pagini și să le facă,
  • Indicele ar trebui să fie, de asemenea, util - de obicei, nu există nici un punct în indexarea, de exemplu, frecvența literei "L" pe pagină.

Primul lucru pe care ar trebui să știți este că indexurile sunt o modalitate de a evita scanarea întregii mese pentru a obține rezultatul pe care îl căutați.

Există diferite tipuri de indici și sunt implementați la nivelul de stocare, astfel încât nu există un standard între acestea și depind, de asemenea, de mecanismul de stocare utilizat.

Indicele InnoDB și B + Tree

Pentru InnoDB, cel mai frecvent tip de index este indicele B + Tree, care stochează elementele în ordine ordonată. În plus, nu este nevoie să accesați tabelul real pentru a obține valori indexate, ceea ce va accelera interogarea.

"Problema" în acest tip de index este că trebuie să interogați valoarea din stânga pentru a utiliza indexul. Deci, dacă indexul dvs. are două coloane, de exemplu ultim_name și first_name, ordinea pe care o solicitați în aceste câmpuri este de mare importanță.

Deci, având în vedere următorul tabel:

Această interogare va utiliza indexul:

Deoarece mai întâi solicitați prima coloană prima și aceasta nu este coloana din stânga din index.

Acest ultim exemplu este și mai rău:

Pentru că acum comparați partea dreaptă a câmpului din dreapta în index.

Indicele hash

Acesta este un alt tip de index, care, din păcate, suportă doar memoria. E rapidă, dar este utilă doar pentru căutare completă, ceea ce înseamnă că nu o puteți utiliza pentru operații ca>. <или LIKE.

Deoarece funcționează doar pentru memorie în memorie, probabil că nu o veți folosi prea des. Cazul de bază pe care pot să-l gândesc acum este să creeze o tabelă temporară în memorie cu un set de rezultate dintr-o altă selecție și să execute multe alte mostre în acest tabel temporar folosind indici de hash.

Problema cu exemplul de mai sus este că, din moment ce funcția CRC32 generează un hash destul de mic, veți obține multe coliziuni în valorile hashed. Dacă aveți nevoie de valori exacte, puteți remedia această problemă făcând următoarele:

Încă aveți elemente de tip hash, chiar dacă numărul de coliziuni este mare, deoarece veți efectua doar oa doua comparație (șir) împotriva hashes duplicate.

Din păcate, utilizând această metodă, trebuie să loviți tabelul pentru a compara câmpul url.

împacheta

Unele fapte pe care le puteți lua în considerare de fiecare dată când doriți să discutați despre optimizare:

O comparație întreg este mai rapidă decât compararea șirurilor. Acest lucru poate fi ilustrat prin exemplul de emulare a indexului de hash în InnoDB.

Poate că adăugarea mai multor pași în proces o face mai rapidă, nu mai lentă. Acest lucru poate fi ilustrat de faptul că puteți optimiza SELECT. împărțind-o în două etape, în primul rând prin realizarea valorilor de stocare în tabelul nou creat în memorie, iar apoi efectuați cererile mai grele în al doilea tabel.

MySQL are și alți indici, dar cred că B + Tree este unul dintre cele mai utilizate vreodată și un hash este un lucru bun, dar puteți găsi și alții în documentația MySQL.

Vă recomandăm cu insistență să citiți cartea "MySQL de înaltă performanță", răspunsul de mai sus a fost în mod cert bazat pe capitolul despre indici.

Deci, ceea ce este indicele Ei bine, indicele - o structură de date (cel mai adesea este B-tree), care stochează valori pentru o anumită coloană în tablitse.Indeks tablitsy.Itak creată în coloana, punctele cheie care trebuie amintit că este faptul că indexul constă în valorile coloanelor dintr-o tabelă și că aceste valori sunt stocate în structura de date. Indexul este o structură de date - amintiți-vă acest lucru.







Să începem tutorialul nostru și să explicăm de ce aveți nevoie de un index de bază de date, după un exemplu foarte simplu. Să presupunem că avem un tabel de baze de date numit Angajat cu trei coloane - Employee_Name, Employee_Age și Employee_Address. Să presupunem că tabela Employee are mii de rânduri.

Acum, să presupunem că vrem să executăm interogarea pentru a găsi toate detaliile oricărui angajat numit "Isus"? Deci, am decis să începem o interogare simplă, după cum urmează:

Ce se va întâmpla fără indexul de pe masă?

De îndată ce executăm această interogare, ce se întâmplă exact pe scenă pentru a găsi angajați numiți Isus? Ei bine, software-ul bazei de date ar trebui literalmente să se uite la fiecare rând din tabelul angajaților. ce se întâmplă exact în spatele scenei pentru a găsi angajați numiți Isus? Ei bine, software-ul bazei de date ar trebui literalmente să se uite la fiecare rând din tabelul angajaților. Și pentru că vrem să facem fiecare rând cu numele „Isus“ în interiorul acestuia, nu ne putem opri doar în căutarea cât mai curând vom găsi doar o singură linie cu numele „Isus“, deoarece pot exista și alte linii cu numele lui Isus. Astfel, fiecare linie la ultima linie trebuie sa fie gasita `- ceea ce inseamna ca mii de linii din acest script ar trebui verificate de baza de date pentru a gasi liniile numite" Isus ". Aceasta este ceea ce se numește scanare completă a mesei.

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

Care structură de date este un index?

B-arbori sunt utilizate cel mai frecvent structuri de date pentru indeksov.Prichina la care B-arbori sunt structuri de date cele mai populare pentru indicele, deoarece acestea sunt eficiente în timp - ca de căutare, îndepărtarea și inserția poate fi realizată într-un vremeni.I logaritmică încă un motiv important de ce B-copacii sunt mai des folosite, este faptul că datele care sunt stocate în B-arbore poate fi otsortirovany.SURBD determină, de obicei, care structură de date este, de fapt utilizate într-un non indeksa.No script-uri Otori cu RDBMS specifice, puteți specifica ce fel de structură de date pe care doriți să utilizați baza de date pentru a crea indexul în sine.

Cum îmbunătățește indexul performanța?

Cum se creează un index în SQL:

Iată ce ar arăta SQL propriu-zis pentru a crea un index în coloana Employee_Name din exemplul nostru înainte:

Cum se creează un index cu mai multe coloane în SQL:

De asemenea, am putea crea un index în două coloane din tabelul Angajat, după cum se arată în acest SQL:

Practic, indexul este o hartă a tuturor cheilor, sortată în ordine. Cu lista în ordine, apoi în loc de a verifica fiecare cheie, se poate face ceva de genul:

1: Du-te la mijlocul listei - deasupra sau sub ceea ce caut?

2: Dacă este mai mare, mergeți la punctul intermediar dintre mijloc și partea inferioară, dacă este inferioară, mijlocie și superioară

3: Este mai mare sau mai mică? Din nou, du-te la punctul de mijloc, și așa mai departe.

Folosind această logică, puteți găsi elementul în lista sortată în aproximativ 7 pași în loc de a verifica fiecare element.

Evident, există dificultăți, dar asta vă oferă ideea de bază.

Un index de baze de date sau pur și simplu un index ajută la accelerarea extragerii datelor din tabele. Când solicitați date dintr-o tabelă, mai întâi MySQL verifică dacă există indici, atunci MySQL utilizează indicii pentru a selecta rândurile fizice de potrivire a tabelului în locul scanării întregului tabel.

Indexul bazei de date este similar cu indexul cărții. Dacă doriți să găsiți un subiect, parcurgeți mai întâi indexul, apoi deschideți pagina cu subiectul fără a naviga prin întreaga carte.

Este recomandat să creați un index în coloanele din tabel, de la care solicitați adesea date. Rețineți că toate coloanele cheii primare din indexul principal al tabelului sunt automat.

Dacă indexul ajută la accelerarea datelor de interogare, de ce nu folosim indexuri pentru toate coloanele? Dacă creați un index pentru fiecare coloană, MySQL trebuie să construiască și să mențină un tabel de index. Ori de câte ori modificați înregistrările într-un tabel, MySQL trebuie să reconstruiască indexul, ceea ce necesită timp și, de asemenea, reduce performanța serverului bazei de date. Crearea unui index MySQL

Adeseori creați indexuri atunci când creați tabele. MySQL adaugă automat la index orice coloană care este declarată ca PRIMARY KEY, KEY, UNIQUE sau INDEX. În plus, puteți adăuga indexuri la tabele care au deja date.

Pentru a crea indexuri, utilizați instrucțiunea CREATE INDEX. Sintaxa instrucțiunii CREATE INDEX este următoarea: 1 2 3

Mai întâi, specificați un index pe baza tipului de tabel sau depozit:

UNIQUE înseamnă că MySQL va crea o restricție pe care toate valorile din index trebuie să fie unice. O valoare dublă NULL este permisă în toate mecanismele de stocare, cu excepția BDB. Indicele FULLTEXT este acceptat numai de mecanismul de stocare MyISAM și este acceptat numai într-o coloană cu tip de date CHAR, VARCHAR sau TEXT. Indicele SPATIAL susține o coloană spațială și este disponibil pentru motorul de stocare MyISAM. În plus, valoarea coloanei nu trebuie să fie NULL.

Apoi specificați indexul, și tipul său, după cuvântul cheie utilizând, cum ar fi btree, HASH sau RTREE, pe baza motorului de stocare de tabelă.

Mai jos mecanisme de stocare de masă cu tipurile respective autorizate de indici: acceptate indici de stocare MyISAM btree, RTREE InnoDB btree MEMORIE / HEAP HASH, btree NDB HASH

În al treilea rând, declarați numele tabelului și coloanele listei pe care doriți să o adăugați la index. Exemplu de creare a unui index în MySQL

Exemplul de baze de date, puteți adăuga un tabel angajat coloana OfficeCode în indexul folosind INDEX CREATE, după cum urmează: 1

CREATE INDEX officeCode ON angajați (officeCode)

În plus față de crearea unui index, puteți șterge și indexul folosind instrucțiunea DROP INDEX. Interesant este că instrucțiunea DROP INDEX este de asemenea mapată la expresia ALTER TABLE. Următoarea este sintaxa pentru ștergerea indexului: 1

DROP INDEX index_name ON tabel_name

De exemplu, dacă doriți să eliminați indicele OfficeCode al tabelului de angajați pe care l-am creat mai sus, puteți rula următoarea interogare: 1

DROP INDEX officeCode ON angajați

Modul în care funcționează este prea larg pentru a acoperi un post SO.

Iată una dintre cele mai bune explicații pentru indiciile pe care le-am văzut. Din păcate, aceasta este pentru SQL Server, nu pentru MySQL. Nu sunt sigur cât de asemănătoare sunt cele două.

Simpla indexare. Puteți crea un index unic în tabel. Un indice unic înseamnă că două rânduri nu pot avea aceeași valoare a indexului. Aici este sintaxa pentru crearea unui index pe o tabelă

Puteți utiliza una sau mai multe coloane pentru a crea un index. De exemplu, putem crea un index pe tutorials_tbl folosind tutorial_author.

Puteți crea un index simplu în tabel. Pleacă doar cuvântul cheie UNIQUE din interogare pentru a crea un index simplu. Un index simplu vă permite să duplicați valorile într-un tabel.

Dacă doriți să indexați valorile într-o coloană în ordine descrescătoare, puteți adăuga cuvântul rezervat DESC după numele coloanei.







Articole similare

Trimiteți-le prietenilor: