Ghid de referință MySQL

5.4.3. Folosind indexul MySQL

Toți indicii MySQL (PRIMARĂ. UNICE. Și INDEX) stocate într-un B-arbore. Șiruri sunt comprimate în mod automat pentru a elimina lacunele din prefixele și spațiile rămase în urmă (a se vedea secțiunea 6.5.7, «CREATE INDEX Sintaxa").

Indecșii sunt utilizate pentru:

Găsiți rapid rândurile care se potrivesc cu o clauză WHERE.

Extras linii din alte tabele atunci când efectuează asociere.

Pentru a sorta, sau gruparea în tabel, în cazul în care aceste operațiuni sunt efectuate pe un prefix al cheii din stânga folosite (de exemplu, ORDER BY key_part_1, key_part_2). În cazul în care ar trebui să DESC toate părțile-cheie. Cheia este citită în ordine inversă (a se vedea secțiunea 5.2.7, „Cum MySQL Optimizeaz ORDER BY»).

În unele cazuri, interogarea poate fi optimizat pentru a prelua valori fără a consulta fișierul de date. Dacă toate coloanele folosite în unele tabel sunt numerice și formează un prefix pentru o cheie de capătul din stânga, pentru a oferi o viteză mare, valoarea dorită poate fi preluată direct din arborele de index:

Să presupunem că emite următoarea declarație SELECT.

Dacă există un index mai multe coloane pe col1 și col2, rândurile corespunzătoare nu pot fi preluate direct. În cazul col1 coloanei și col2 există coduri distincte, optimizatorul încearcă să găsească indicele cel mai restrictiv prin determinarea indicelui care găsește mai puține rânduri și utilizează indexul pentru a prelua aceste linii.

Dacă tabelul are un indice de mai multe coloane, orice prefix al indicelui stânga poate fi utilizat de optimizator pentru a găsi rânduri. De exemplu, în cazul în care există un index pe cele trei coloane (col1, col2, Col3), atunci există potențialul pentru o căutare indexată (col1), (col1, col2) și (col1, col2, Col3).

MySQL nu se poate utiliza un indice parțial în cazul în care coloanele nu formează un prefix al indicelui extremitatea stângă. Să presupunem că există o instrucțiune SELECT. prezentat mai jos:

Dacă există un index pe (col1, col2, Col3), numai prima interogare prezentată mai sus folosește indexul. A doua și a treia solicitări de acest fel includ coloane indexate, dar (col2) și (col2, Col3) nu este capătul din stânga prefixele de piese (col1, col2, Col3).

MySQL utilizează indici, de asemenea, pentru comparații cum ar fi. dacă argumentul în expresia LIKE reprezintă un șir constant nu începe cu un simbol șablon. De exemplu, următoarele afirmații SELECT folosesc indici:

Numai rânduri sunt luate în considerare în prima echipă cu „Patrick“ <= key_col <"Patricl". а во второй - только строки с "Pat" <= key_col <"Pau".

Următoarele instrucțiuni SELECT nu se vor utiliza indici:

În prima echipa, valoarea LIKE începe cu un caracter wildcard. A doua comandă ca valoare nu este o constantă.

In versiunea de MySQL 4.0 este produsă o altă optimizare pe expresia LIKE. Dacă utilizați o expresie. Cum ar fi „%% șir de caractere“, iar lungimea șirului (șir) mai mult de 3 caractere, MySQL va utiliza un algoritm Turbo Boyer-Moore pentru a inițializa un șablon șir și apoi să utilizați acest șablon pentru a efectua o căutare mai rapidă.

Atunci când căutați folosind COLUMN_NAME IS NULL va folosi indexurile în cazul în care COLUMN_NAME este un index.

MySQL utilizează în mod normal, indicele care găsește cel mai mic număr de rânduri. Indicele este folosit pentru coloanele pe care le compara cu următorii operatori: =,>,> =, <, <=, BETWEEN и LIKE с префиксом, не содержащим шаблонного символа, такого как something%.

În cazul în care indicele nu acopera toate și nivelurile în clauza WHERE. nu este folosit pentru a optimiza interogare. Cu alte cuvinte: pentru a putea folosi indexul, un prefix de index trebuie să fie incluse în fiecare și de grup.

Următoarele clauza WHERE folosesc indici:

Următoarele clauze WHERE nu utilizează indici:

În unele cazuri, MySQL nu va folosi un index, chiar dacă este posibil. Câteva exemple de astfel de situații este prezentată mai jos: