MySQL Užklausų Efektyvumo Optimizavimas Naudojant DESCRIBE ir EXPLAIN

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:

  • Field apibūdina stulpelio pavadinimą;
  • Type apibūdina stulpelio duomenų tipą;
  • Null nurodo ar stulpelyje gali būti NULL 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ė bus auto_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:

  • id nurodo užklausos ID;
  • select_type nurodo SELECT užklausos tipą (t.y ar tai paprasta SELECT 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:

EXPLAIN FOR CONNECTION Užklausos Rezultatų Pavyzdys

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.

Leave a Reply

Your email address will not be published. Required fields are marked *