Mysql 5

5.2.1. Sintaxa instrucțiunii EXPLAIN (obținerea informațiilor despre SELECT)

EXPLAIN tbl_name este sinonim cu DESCRIBE tbl_name și SHOW COLUMNS FROM tbl_name.







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.

Ar trebui să executați de multe ori TABLA ANALIZĂ, astfel încât statisticile despre tabele să fie actualizate, cum ar fi cardinalitatea cheilor care pot afecta alegerea optimizatorului. Vezi secțiunea 4.5.2, "Sintaxă pentru comanda ANALIZARE TABEL".

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.

În MySQL 4.1, ieșirea EXPLAIN a fost modificată pentru a funcționa mai bine cu construcțiile tip UNION. subchetări și tabele moștenite (secundare, derivate). Schimbarea cea mai notabilă a fost introducerea a două noi coloane: id și select_type.







Ieșirea comenzii EXPLAIN include următoarele coloane:

SELECT ID. Numărul de serie al acestui SELECT special în interogare.

SELECT tipul de instrucțiune. care poate fi una dintre următoarele:

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 (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 luat î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 fi contactați.

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, atât coloana și tt.ActualPC et.EMPLOYID sunt de tip 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 rândului 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.







Articole similare

Trimiteți-le prietenilor: