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:
Štai ką reiškia šie rezultatai:
Field
apibūdina stulpelio pavadinimą;Type
apibūdina stulpelio duomenų tipą;Null
nurodo ar stulpelyje gali būtiNULL
reikšmių;Key
nurodo ar stulpelis indeksuotas;Default
nurodo stulpelio numatytąją vertę;Extra
nurodo 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:
Štai ką reiškia šie rezultatai:
id
nurodo užklausos ID;select_type
nurodoSELECT
užklausos tipą (t.y ar tai paprastaSELECT
užklausa? Ar tai –UNION
užklausos rezultatas? Ar tai išvestinė lentelė? Ar tai išvestinė lentelė, priklausanti nuo kitos lentelės? ir pan.);table
nurodo naudojamą lentelę;partitions
nurodo naudojamas particijas (skaidinius);type
nurodo join tipą;possible_keys
nurodyti galimus naudoti indeksus;key
nurodo naudojamą indeksą;key_len
nurodo naudojamo indekso ilgį;ref
nurodo stulpelius arba konstantas, kurie naudoja indeksą tam, kad gautų duomenis iš lentelės;rows
nurodo apytikslį įrašų kiekį prie kurio bus prieinama;filtered
nurodo apytikslį procentą įrašų prie kurių bus prieinama;Extra
nurodo 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:
Iš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.