Kaixo! MySQL mundu mailan gehien erabiltzen den datu-baseetako bat da, bere abiaduragatik eta erabiltzeko erraztasunagatik ezaguna. Hala ere, garatzaile askok bere potentzialaren zati txiki bat baino ez dute erabiltzen. Taula handi baten aurka gaizki idatzitako kontsulta batek zerbitzari bat belauniko jar dezake.
Gaur, zure MySQL kontsultak azkarragoak, garbiagoak eta eraginkorragoak izan daitezen lagunduko dizuten bost aholku zehatz partekatuko ditut zurekin. Goazen!
1. Aholkua: Bihurtu EXPLAIN zure lagunik onena
Arazoa: Zure SELECT kontsulta motel doa, baina ez dakizu zergatik. Index bat falta da? Taula osoa irakurtzen ari da?
Irtenbidea: EXPLAIN komandoa erabiltzea. Zure SELECT kontsultaren aurretik EXPLAIN hitza jartzen baduzu, MySQL-k ez du kontsulta exekutatuko; horren ordez, kontsulta hori nola exekutatzeko asmoa duen azalduko dizu, urratsez urrats.
Adibidea:
EXPLAIN SELECT * FROM erabiltzaileak WHERE abizena = 'Agirre';
Zertan fijatu emaitzan:
- type: Zutabe honek MySQL-k taulak nola lotuko dituen adierazten du. ALL balioa (taula osoaren eskaneatzea) ikusten baduzu, normalean seinale txarra da. ref, eq_ref edo const bezalako balioak askoz hobeak dira.
- key: Kontsulta egiteko erabiliko den indizea (index) erakusten du. NULL bada, esan nahi du ez dela indexik erabiltzen, eta hori da, seguruenik, zure arazoa.
- rows: MySQL-k zenbat errenkada eskaneatu beharko dituela uste duen adierazten du. Zenbaki handi batek arazo bat adieraz dezake.
Onura: Kontsulta motelak diagnostikatzeko eta konpontzeko tresna nagusia da. Datu-baseekin serio lan egiteko ezinbestekoa.
2. Aholkua: Indizeak ez dira magia, estrategia baizik
Arazoa: "Kontsultak motel doaz, beraz zutabe guztiei indize bat gehituko diet". Hau akats handia da. Indizeek irakurketa azkartzen duten arren, idazketa (INSERT, UPDATE) eragiketak moteldu egiten dituzte.
Irtenbide zehatza: Indize konposatuak (composite indexes) ulertzea. (zutabeA, zutabeB) indize bat ez da bi indize bereizi ((zutabeA) eta (zutabeB)) bezalakoa.
Gakoa: Indize konposatu batean zutabeen ordenak garrantzi handia du. Telefono-gida baten antzera funtzionatzen du. (abizena, izena) indize bat baduzu, oso eraginkorra izango da abizena-gatik bilatzeko, edo abizena ETA izena-gatik bilatzeko. Baina ez du balioko izena-gatik bakarrik bilatzeko.
Onura: Ondo diseinatutako indizeak dira irakurketa-errendimendua hobetzeko modurik eraginkorrena. Pentsatu zure WHERE klausulak nola erabiltzen dituzun indize egokiak sortzeko.
3. Aholkua: INSERT + UPDATE dotorea, ON DUPLICATE KEY UPDATE-rekin
Arazoa: "UPSERT" logika klasikoa: errenkada berri bat txertatu nahi duzu, baina gako primario edo bakar (primary/unique key) berbera duen errenkada bat jada existitzen bada, eguneratu egin nahi duzu.
Irtenbidea: MySQL-ren ON DUPLICATE KEY UPDATE sintaxi dotorea erabiltzea.
Adibidea: Erabiltzaileen puntuazioak eguneratzeko.
INSERT INTO erabiltzaile_puntuazioak (erabiltzaile_id, puntuazioa)
VALUES (123, 50)
ON DUPLICATE KEY UPDATE puntuazioa = puntuazioa + 50;
Honek saiatuko da erabiltzaile_id = 123 errenkada berri bat txertatzen. Gako hori jada existitzen bada, puntuazioa zutabea eguneratuko du, balio berria gehituz.
Onura: Hainbat kontsulta eta aplikazio-mailako logika ordezkatu ditzakezu datu-baseko komando bakar, atomiko eta oso irakurgarri batekin.
4. Aholkua (MySQL 8+): Antolatu kontsulta konplexuak CTE-ekin
Arazoa: Irakurtzeko eta mantentzeko zailak diren subkontsulta habiratu eta nahasiak.
Irtenbidea: Common Table Expressions (CTE) erabiltzea WITH klausularekin. Kontuan izan hau MySQL 8.0 bertsiotik aurrera bakarrik dagoela eskuragarri.
Adibidea:
WITH sail_gastuak AS (
SELECT saila, SUM(gastua) AS guztira
FROM langile_gastuak
GROUP BY saila
)
SELECT saila, guztira
FROM sail_gastuak
WHERE guztira > 10000;
Onura: Zure SQL kodea modularra, irakurgarria eta arazteko errazagoa bihurtzen du, MySQL SQL estandar modernoetara hurbilduz.
5. Aholkua (MySQL 8+): Egin analisi aurreratua Leiho Funtzioekin
Arazoa: Erlazionatutako errenkaden "leiho" baten gainean kalkuluak egin behar dituzu, hala nola ranking-ak, batuketa metatuak, etab.
Irtenbidea: Leiho Funtzioak (Window Functions) erabiltzea, hauek ere MySQL 8.0 bertsiotik aurrera eskuragarri.
Adibidea: Erabiltzaile bakoitzaren azken saio-hasiera aurkitzeko.
SELECT erabiltzaile_id, saio_hasiera
FROM (
SELECT
erabiltzaile_id,
saio_hasiera,
ROW_NUMBER() OVER (PARTITION BY erabiltzaile_id ORDER BY saio_hasiera DESC) as rn
FROM saio_log
) AS subquery
WHERE rn = 1;
PARTITION BY-k erabiltzaile bakoitzerako zenbaketa berrabiarazten du, eta ORDER BY-k saio-hasiera berrienari 1. postua ematen dio.
Onura: Datu-basearen barruan analisi-gaitasun izugarriak desblokeatzen ditu, lehenago auto-lotura konplexuak edo aplikazio-mailan datuak prozesatzea eskatzen zutenak.
Amaiera: MySQL, abiadura baino askoz gehiago
Aholku hauek erakusten dutenez, MySQL abiadura handiko biltegi bat baino askoz gehiago da. EXPLAIN bezalako tresnekin zure kontsulten erraietara iritsi zaitezke, eta MySQL 8.0 bertsiotik aurrera, CTE eta Leiho Funtzioekin, SQL kode moderno, dotore eta izugarri indartsua idatz dezakezu.
Animatu zaitez tresna hauek zure eguneroko lanean probatzera. Zure datu-basea menperatzea edozein garatzailerentzat funtsezko trebetasuna da!
๋๊ธ