Aprobat de cei mai buni programatori ruși

Dacă instrucțiunea SELECT este precedată de cuvântul cheie EXPLAIN. MySQL vă va spune cum este procesată SELECT-ul. și să furnizeze informații privind ordinea și metoda de conectare a tabelelor.







Folosind EXPLAIN, puteți afla când trebuie să indexați tabelele pentru a obține o selecție mai rapidă care utilizează indicii pentru a găsi înregistrări. În plus, puteți verifica cât de bine a fost selectată ordinea conectării tabelelor de către optimizator. Pentru a forța optimizatorul să lega tabelele în ordinea specificată, puteți utiliza instrucțiunea STRAIGHT_JOIN.

Pentru conexiuni necomplicate, EXPLAIN returnează un șir de informații despre fiecare dintre tabelele utilizate în instrucțiunea SELECT. Tabelele sunt listate în ordinea în care vor fi citite. MySQL efectuează toate legăturile într-o singură trecere (metoda se numește "multi-join"). Acest lucru se face astfel: MySQL citește un șir din primul tabel, găsește un șir de potrivire în al doilea tabel, apoi - în al treilea tabel și așa mai departe. Când procesarea tuturor tabelelor este completă, MySQL emite coloanele selectate și traversează lista tabelelor în ordine inversă până când se găsește tabela cu cea mai mare potrivire a rândurilor. Următorul rând este citit din acest tabel, iar procesul continuă în tabelul următor.

Ieșirea comenzii EXPLAIN include următoarele coloane:

Următoarele sunt diferitele tipuri de legare, ordonate de la cel mai bun la cel mai rău:

Următorul exemplu arată modul în care puteți optimiza treptat JOIN folosind ieșirea de informații prin instrucțiunea EXPLAIN.

Să presupunem că aveți următoarea instrucțiune SELECT. pe care trebuie să o investiți cu ajutorul comenzii EXPLAIN.

Pentru acest exemplu, se presupune că:

  • Coloanele care au fost comparate au fost declarate după cum urmează:

CUSTNMBR (cheia primară)

  • Valorile lui tt.ActualPC nu sunt distribuite uniform.






  • În stadiul inițial, înainte de a efectua orice optimizare, instrucțiunea EXPLAIN va afișa următoarele informații:

    Deoarece fiecare tabel este de tip ALL. Din rezultatul de mai sus, puteți vedea că MySQL va face o obligație completă a tuturor tabelelor! Acest lucru va dura mult timp, deoarece pentru a efectua această legare, produsul din numărul de rânduri din fiecare tabel trebuie să fie luate în considerare! Pentru cazul nostru, această lucrare este de 74 * 2135 * 74 * 3872 = 45268558720 linii. Dacă tabelele sunt mari, este dificil să vă imaginați cât timp vor comunica.

    O problemă aici este că MySQL nu poate (încă) să aplice efectiv indici la coloane dacă sunt declarați diferit. În acest context, tipul VARCHAR și tipul CHAR sunt aceleași dacă nu sunt declarate cu lungimi diferite. Deoarece coloana tt.ActualPC este declarată ca CHAR (10). și et.EMPLOYID - ca CHAR (15). există o discrepanță în lungimea valorilor.

    Pentru a rezolva această discrepanță între lungimile coloanelor, utilizați comanda ALTER TABLE pentru a extinde coloana ActualPC de la 10 caractere la 15 caractere:

    Acum ambele coloane tt.ActualPC și et.EMPLOYID sunt de tipul VARCHAR (15). Atunci când instrucțiunea EXPLAIN este executată din nou, va fi afișat următorul rezultat:

    Acest lucru nu este ideal, dar este mult mai bine (produsul valorilor liniilor a scăzut acum de 74 de ori). Această legare va fi finalizată în câteva secunde.

    Puteți face o altă modificare - pentru a elimina discrepanța dintre lungimile coloanelor pentru comparații tt.AssignedPC = et_1.EMPLOYID și tt.ClientID = do.CUSTNMBR.

    Acum, instrucțiunea EXPLAIN va afișa astfel de informații:

    E aproape perfect.

    Mai rămâne o problemă. Consta in faptul ca implicit MySQL accepta ca valorile din coloana tt.ActualPC sunt distribuite la intervale regulate, dar in tabelul tt nu este asa. Din fericire, pentru a informa MySQL despre acest lucru poate fi foarte simplu:

    Acum, legarea este perfectă, iar instrucțiunea EXPLAIN va afișa acest rezultat:

    Notă: rândul cu rânduri din instrucțiunea EXPLAIN este ipoteza expertului optimizatorului de legături MySQL. Pentru a optimiza interogarea, trebuie să verificați dacă numerele sunt aproape de real. Dacă nu, puteți obține o performanță mai bună utilizând conexiunea STRAIGHT_JOIN în instrucțiunea SELECT și încercând să specificați o ordine diferită a tabelelor din clauza FROM.

    MySQL.RU. Aprobat de cei mai buni programatori ruși






  • Articole similare

    Trimiteți-le prietenilor: