10 Këshilla për MySQL - Guida | Tutoriale

×
Albanian Forums, Zerion Zeri yt Zeri Info, Forumi Shqiptar Al Virtual, Diskutime, Biseda, Chat Njofje, Informatika, Teknologjia, Gazeta Tema, Gazetat Shqiptare, Bota Sot, www Channel Albania, Telegrafi Kosovo, Ballkani Web, Gazeta Lajme shqip, Lajmet e Fundit Shqiperia Kosova, Dita, Panorama, Kryeartikull, Faqja Kryesore, Video Shqip, Muzike Shqipe, Njoftime, Lajmerime, Temat Online, Gazetat, Kosovare, Shtypi Ditor, Sporti Shqiptar, Dashuria, Pyetje Pergjigje, Keshilla, Ndihme, Webmaster Shqiptar, Familja, Shqiptaria, Muzika, Receta Gatimi, Imazhe, Vipat-shqiptar, Aktualiteti
Media Sociale
Mesazhe Private
Shqiptaret duke lexuar tema interesante dhe te ndryshme
Tema re

10 Këshilla për MySQL

10 Këshilla për MySQL

· 1 · 449

  • Postime: 28589
  • Karma: +48/-5
  • Gjinia: Mashkull

ne: 24-05-2010, 01:03:55
MySQL është databaza Open-Source që të gjithe e duam dhe e përdorim në aplikacionet tona. Programoni aplikacione të vogla apo të mëdha, ndiqni 10 këshillat që po ju jap për të optimizuar query-t tuaja e për ti bërë ato aplikacionet të egzekutohen më shpejtë e të përdorin më pak resurse të vlefshme. Jam i sigurt që do gjeni diçka që nuk dinit, apo e kishit mësuar gabim.

MySQL është databaza jonë e preferuar open-source e si rrjedhim është zgjidhja direkte për çdo aplikacion web (apo jo!) që krijojmë. Thjeshtësia dhe filozofia në krijimin e saj (pra është open-source) e bën praktikisht të pandashme nga PHP, që ndan të njëjtat tipare. Megjithatë, janë gjërat e vogla që i neglizhojmë apo thjeshtë nuk i dimë që na krijojnë probleme. Më poshtë ju kam paraqitur 10 këshilla për të optimizuar databazën e për të punuar në mënyrë më efikase me to. Hidhini një sy, fiksjoni, lexoni manualin e MySQL dhe eksperimentoni.
1. Mos ruani të dhëna binare

Kam vënë re shpesh programues që zgjedhin ti ruajnë skedarët (foto, dokumenta, etj) në databazë si të dhëna binare. Vërtetë kjo mundësi egziston, por në praktikë do të ishte një zgjidhje vërtetë e keqe. Mos i shtoni ngarkesë serverit dhe faqes tuaj, thjeshtë ruajini skedarët në server dhe aksesojini ashtu si keni bërë gjithmonë. I vetmi rast ku ruajtja si binarë ka disi kuptim është nëse doni të ruani lidhjen e skedarëve me një përdorues, produkt, apo diçka tjetër. Megjithatë, edhe kjo mund të arrihet shumë lehtë duke shtuar një tabelë tjetër të ilustruar më poshtë.

id – skedari – perdoruesi_id (reference e fushes “id” ne tabelen “perdoruesit”)
—————————-
1 – foto1.jpg – 10
2 – dokument.pdf – 15
2. Mos e lini MySQL pa fjalëkalim

Pas instalimit, MySQL nuk vendos fjalëkalim për përdoruesin kryesor (root). Të jeni të sigurtë që kjo do jetë gjëja e parë që një sulmues do provojë për të përfituar akses në serverin tuaj MySQL. Vendoseni fjalëkalimin duke përdorur komandën më poshtë:

Windows
shell> mysql -u root
mysql> SET PASSWORD FOR ‘root’@'localhost’ = PASSWORD(‘fjalekalimiri’);
mysql> SET PASSWORD FOR ‘root’@'%’ = PASSWORD(‘fjalekalimiri’);

Unix
shell> mysql -u root
mysql> SET PASSWORD FOR ‘root’@'localhost’ = PASSWORD(‘fjalekalimiri’);
mysql> SET PASSWORD FOR ‘root’@'host_name’ = PASSWORD(‘fjalekalimiri’);
3. Normalizoni tabelat

Kjo është ndoshta këshilla më e vlefshme që mund t’ju jap, duke qenë se ju ndihmon ti ruani të dhënat më lehtë, por gjithashtu për të optimizuar databazën. Normalizimi në MySQL është metoda e ndarjes së informacioneve në tabela të ndryshme të cilat referencojnë njëra tjetrën. Ok, nuk e di sa kuptim pati fjalia e fundit, por më lejoni t’ju jap 2 shembuj.

Tabelë e pa normalizuar

id – emri – produkti
——————–
1 – Beni – celular
2 – Beni – kamera
3 – Beni – laptop
4 – Tani – televizor
5 – Tani – radio

Tabela të normalizuara

(Tabela “perdoruesit”) id – emri
——————————–
1 – Beni
2 – Tani

(Tabela “produktet”) id – titulli
———————————
1 – celular
2 – kamera
3 – laptop
4 – televizor
5 – radio

(Tabela “produkte_blera” id – perdorues_id – produkt_id
——————————————————-
1 – 1 – 1
2 – 1 – 2
3 – 1 – 3
4 – 2 – 4
5 – 2 – 5

Në pamje të parë, jam i sigurt që po pyesni veten pse është me efikase të përdor 3 tabela kur mund të përdor vetëm një. Pyetje e drejtë! Në rastin e parë, përfitimi i një liste emrash dhe produktesh do ishte i bezdisshëm dhe i mundur vetëm përmes DISTINCT dhe GROUP BY; editimi ose fshirja e një emri apo produkti përfshin editimin ose fshirjen e të gjithë rreshtave në lidhje me atë emër apo produkt. Tani imagjinoni një rast praktik, ku do t’ju duheshin më shumë të dhëna si për përdoruesit (mbiemri, email, etj), ashtu edhe për produktet (përshkrim, foto, etj); tërësisht jo praktike. Ndërsa në rastin e tabelave të normalizuara, kemi tabela të veçanta për produktet dhe emrat, dhe një ekstra për produktet e blera. Fushat “perdorues_id” dhe “produkt_id” në tabelën “produktet_blera” janë referenca (FOREIGN KEYS) respektivisht për fushën “id” në tabelën “perdoruesit” dhe fushën “id” për tabelën “produktet”.
4. Përdorni LIMIT 1 kur merrni vetëm një rezultat

Nëse bëni query të cilat jeni të sigurtë që do kthejnë vetëm një rezultat, ateherë shtoni LIMIT 1 në fund. Në këtë mënyrë MySQL e përfundon kërkimin atëherë kur gjen 1 rezultat, pa skanuar të gjitha rreshtat. Është diçka e vogël, por mund të bëhet e dukshme për query të shumta në tabela të mëdha.
view source
print?
1   <?php
2   $rezultatet = mysql_query("SELECT emri FROM perdoruesit WHERE id=10 LIMIT 1");
3   ?>
5. Përdorni INDEX dhe FULLTEXT

Praktika standarte e programuesve është ta indeksojnë si PRIMARY id-në dhe kjo është gjë e mirë sepse optimizon tabelën. Megjithatë, jo të gjithë e dinë që indeksimi mund ti optimizojë kërkimet edhe për fushat e tjera. Në varësi të aplikacioneve që kodoni, veçoni fushat ku kërkoni më tepër dhe bëjini ato INDEX. Përfitimi në shpejtësi në tabela të mëdha është i konsiderueshëm.

Ndërsa INDEX-i funksionon shumë mirë në informacione dhe kërkime të shkurtra, për kërkime në tekste të gjata nuk përfitoni asgjë. Këtu vjen në ndihmë aftësia FULLTEXT e MySQL e cila është krijuar për të kërkuar në vëllime të mëdha informacioni duke ruajtur optimizimin në mendje. Përveç të tjerave, me FULLTEXT mund të krijoni motorë kërkimi të plotë për faqet tuaja të cilët përdorin booleans (AND, OR, NOT) dhe i rendisin logjikisht rezultatet.
6. Mos rendisni me RAND()

Të them të drejtën edhe unë në fillim isha kënaqur me RAND() e me thjeshtësinë që mund të përfitoja rezultate të rastësishme. Megjithatë, kjo ndryshoi pasi lexova plot këshilla optimizimi ku thuhej qartë se ngarkesa që MySQL merr e bën RAND() praktikisht të pa përdorshme. Ajo çfarë RAND() bën në një mjedis real është se merr të gjitha rreshtat e tabelës, i rendit në një mënyrë të çrregullt dhe në fund kthen 1 (apo më shumë) rezultate. Besoj se e imagjinoni ngarkesën e shtuar, por për fat të mirë mund ta replikojmë RAND() pa shumë telashe.

Përdorimi i RAND()
view source
print?
1   <?php
2   //query kthen vetem nje rezultat te rastesishem nga tabela
3   $rezultatet = mysql_query("SELECT emri FROM perdoruesit ORDER BY RAND() LIMIT 1");
4   ?>

Alternativa më e mirë
view source
print?
01   <?php
02   //query per te marre totalin e rreshtave
03   $rezultatet = mysql_query("SELECT COUNT(*) AS totali FROM perdoruesit");
04   $vlerat = mysql_fetch_array($rezultatet);
05   
06   ////gjenerojme nje numer te rastesishem me min: 0 dhe maks: totali rreshtave - 1
07   $rast = mt_rand(0, $vlerat['totali'] - 1);
08   
09   //perfitojme vetem nje rezultat duke qene se e limitojme (numri i rastesishem), 1
10   $rezultatet = mysql_query("SELECT emri FROM perdoruesit LIMIT $rast, 1");
11   ?>

Ky rast është shembulli konkret që tregon se pak nuk është e barabartë me mirë.
7. Mos përdorni NULL

Personalisht nuk i kam përdorur ndonjëherë (edhe pa ditur anët negative) sepse thjeshtë nuk më kanë hyrë në punë. Duke e lënë një fushë bosh (apo 0 për numra), praktikisht kam një vlerë e cila është e njëjtë me NULL. Jam i sigurt që edhe shumë të tjerë kanë të njëjtën praktikë, por ata që e përdorin duhet të dinë se NULL zë hapësirë ekstra e cila është totalisht e pa nevojshme dhe e evitueshme.
8. SELECT * është për dembelë

Mendoj se është e qartë për këdo se duke përdorur SELECT * zgjidhni të gjitha kolonat në një tabelë (përfshi ato që s’duhen) dhe si rrjedhim shtoni ngarkesën. Përveç rasteve ku ndërtoni query për të testuar, gjithmonë shmangeni përdorimin e SELECT *.

Kod i keq
view source
print?
1   <?php
2   $rezultatet = mysql_query("SELECT * FROM perdoruesit");
3   ?>

Kod i mirë
view source
print?
1   <?php
2   $rezultatet = mysql_query("SELECT id, emri, emaili FROM perdoruesit");
3   ?>
9. Kuptojini query-t me EXPLAIN

EXPLAIN është një fjalë kyçe e cila ju jep informacione për planin e egzekutimit të query-t që keni krijuar. Përmes saj, do merrni informacione si çelësat e prekuar, cilat tabela janë lidhur (JOIN) dhe në çfarë renditjeje, numrin e rreshtave, etj. Përdoreni në një query të ndërlikuar dhe shihni rezultatet.
view source
print?
1   EXPLAIN SELECT p.emri, pr.titulli FROM perdoruesit AS p
2   INNER JOIN produktet AS pr ON (pr.perdoruesi_id = p.id)
10. Beni query që nuk çaktivizojnë Query Cache

Nëse e keni aktivizuar Query Cache (që duhet ta keni aktivizuar!), atëherë e dini se MySQL i ruan query-t që egzekutohen shpesh në cache dhe i servir ato direkt pa patur nevojë të ri-kërkojë nëpër tabela. Megjithatë, duke përdorur funksione si CURDATE(), CURTIME(), NOW(), RAND(), etj, MySQL e çaktivizon Query Cache meqë rezultatet e kthyera janë gjithmonë të ndryshme. Si alternativë, mund të përdorni funksionet e PHP për të marrë datën, orën, etj, dhe të përdorni vlerën e kthyer ne një query.

Shpresoj t’ju kem dhënë disa këshilla të mira e të vlefshme për të përmirësuar sado pak aplikacionet tuaja. Fusha e optimizimit është e madhe e çdo ditë prodhohen teknika të reja, prandaj nëse keni një këshillë për të shtuar, mos hezitoni.

Burimi: http://www.feniksi.com/web/mysql/10-keshilla-per-mysql

Temat e fundit