DESCRIBE ir EXPLAIN užklausos yra vieni labiausiai paplitusių MySQL našumo problemų sprendimo būdų. Jei paklaustumėte žmonių kaip optimizuoti Jūsų SQL užklausą, galite būti beveik garantuoti, kad šios užklausos bus paminimos ne vieną ir ne du kartus. Jas patyrinėsime šiame straipsnyje.
Supraskime DESCRIBE
DESCRIBE užklausa naudojama tada, kai atsiranda poreikis sužinoti informaciją apie lentelės struktūrą. DESCRIBE užklausos rezultatai atrodo šitaip:

DESCRIBE Užklausos Rezultatų PavyzdysŠtai ką reiškia šie rezultatai:
Fieldapibūdina stulpelio pavadinimą;Typeapibūdina stulpelio duomenų tipą;Nullnurodo ar stulpelyje gali būtiNULLreikšmių;Keynurodo ar stulpelis indeksuotas;Defaultnurodo stulpelio numatytąją vertę;Extranurodo papildomą informaciją apie stulpelius (pavyzdžiui, jei stulpelis turi parinktįAUTO_INCREMENT, vertė busauto_increment).
DESCRIBE užklausa gali būti naudinga jei turite prieigą prie MySQL serverio per SSH ir nežinote kokius stulpelius turi duomenų bazė.
Supraskime EXPLAIN
Užklausa EXPLAIN pateikia informaciją apie tai, kaip MySQL vykdo užklausas. Ši užklausa veikia su SELECT, DELETE, INSERT, REPLACE, UPDATE užklausomis, o nuo MySQL 8.0.19 ir aukštesnių versijų – taip pat ir su TABLE užklausomis.
Štai kaip atrodo EXPLAIN užklausos rezultatai:

EXPLAIN Užklausos Rezultatų PavyzdysŠtai ką reiškia šie rezultatai:
idnurodo užklausos ID;select_typenurodoSELECTužklausos tipą (t.y ar tai paprastaSELECTužklausa? Ar tai –UNIONužklausos rezultatas? Ar tai išvestinė lentelė? Ar tai išvestinė lentelė, priklausanti nuo kitos lentelės? ir pan.);tablenurodo naudojamą lentelę;partitionsnurodo naudojamas particijas (skaidinius);typenurodo join tipą;possible_keysnurodyti galimus naudoti indeksus;keynurodo naudojamą indeksą;key_lennurodo naudojamo indekso ilgį;refnurodo stulpelius arba konstantas, kurie naudoja indeksą tam, kad gautų duomenis iš lentelės;rowsnurodo apytikslį įrašų kiekį prie kurio bus prieinama;filterednurodo apytikslį procentą įrašų prie kurių bus prieinama;Extranurodo papildomą informaciją.
Užklausa EXPLAIN yra naudojama su užklausa kurią reikia paaiškinti norint pamatyti užklausos vykdymo planą.
DESCRIBE Alternatyvos
DESCRIBE užklausa pateikia informaciją apie lentelės stulpelius. Ši užklausa nėra vienitelė, kurią galima naudoti norint sužinoti iš ko susideda lentelė – gali būti naudojamos ir kelios kitos užklausos, pavyzdžiui DESC užklausa (sutrumpinta DESCRIBE užklausa) ir SHOW COLUMNS užklausa.
Norėdami gauti daugiau informacijos apie lentelės struktūrą prie SHOW COLUMNS užklausos galime pridėti ir FULL raktinį žodį, tada visa užklausa gali atrodyti šitaip:
SHOW FULL COLUMNS FROM demo_table;
SHOW COLUMNS taip pat gali būti naudojamas stulpelių filtravimui su LIKE arba WHERE užklausomis:
SHOW COLUMNS FROM demo_table LIKE ...;
SHOW COLUMNS FROM demo_table WHERE ...;
Tai reiškia, kad stulpelių filtravimas gali būti naudojamas ir tada, kai reikia, pavyzdžiui, pamatyti tik stulpelius kurie prasideda tam tikra raide ar skaičiumi, taip pat galime naudoti sąlygą WHERE norėdami nurodyti duomenų bazei rasti įrašus, atitinkančius tam tikrą sąlygą.
Plačiau Apie EXPLAIN
EXPLAIN užklausa dažnai naudojama norint gauti užklausos vykdymo planą, tačiau šios užklausos veiksmingumas tuo nesibaigia – ši užklausa taip pat gali būti naudojama norint gauti informaciją apie jau vykdomas užklausas. Tarkime, kad mūsų duomenų bazėje vykdoma ši užklausa (SLEEP teiginys įdėtas specialiai – jis sulėtina užklausą):
SELECT COUNT(*), SLEEP(10) FROM demo_table WHERE field_1 LIKE '%Demo%';
Mes galime naudoti užklausą EXPLAIN FOR CONNECTION tam, kad vykdytume EXPLAIN užklausą šiuo metu vykdomoms užklausoms – tai gali būti labai naudinga kai turime užklausą kurios vykdymas užtrunka ilgą laiko tarpą, bet nesuprantame, kodėl.
Norėdami sumodeliuoti tokį scenarijų, mes naudosime dvi atskiras sesijas, kurios jungiasi prie duomenų bazės – viena sesija vykdys mūsų lėtą užklausą (žr. aukščiau), kitoje bus vykdoma EXPLAIN FOR CONNECTION užklausa.
Štai kaip atrodo šios užklausos rezultatai:

EXPLAIN FOR CONNECTION Užklausos Rezultatų PavyzdysIšvados
DESCRIBE užklausa yra naudojama tada, kai norime gauti informaciją apie lentelės struktūrą, o EXPLAIN užklausa padeda mums įgyti daugiau žinių apie užklausų vykdymo planus. DESCRIBE užklausa gali būti naudinga jei norite gauti daugiau informacijos apie lentelės struktūrą, o EXPLAIN užklausa gali būti naudinga kai žinote, jog užklausa yra vykdoma ilgą laiką, tačiau nežinote kodėl.