Në një projekt, një faktor shumë i rëndësishëm është shpejtësia e punës së tij.
Një nga metodat për të rritur shpejtësinë e një projekti është: përshpejtimi i kohës që duhet për të përfunduar një kërkesë Baza e të dhënave MySql, duke reduktuar kohën e përgjigjes gjatë ekzekutimit të një pyetjeje të bazës së të dhënave.
Sot do të njihemi me një mjet të tillë si " Indekset".
Përdorimi i indekseve do të reduktojë kohën e përgjigjes së bazës së të dhënave MySql, e cila na jep avantazhe të mëdha kur kampionojmë të dhëna nga një i madh DB dhe do të jetë me përfitim të madh kur përdoret në projekte të mëdha me ngarkesë të lartë.
Le të shohim se çfarë janë indekset, çfarë lloje indeksesh ekzistojnë dhe çfarë përfitimesh mund të merrni prej tyre.
Indeksi MySqlështë një mjet i rëndësishëm dhe i dobishëm që ju lejon të optimizoni përzgjedhjen nga baza e të dhënave. Përdorimi i indekseve redukton ndjeshëm kohën e ekzekutimit të pyetjeve, duke ju lejuar të rikuperoni të dhënat më shpejt.
Ndryshimi i dukshëm gjatë përdorimit Indekset MySql mund të shihet kur punoni me tavolina të mëdha.
Indeksiështë një strukturë që ruan vlerat e një ose më shumë kolonave A tabelat [s] dhe referenca për rreshtat ku ndodhen këto vlera. Për të ruajtur indekset, " pemë binare".
Le të shohim një shembull se si funksionojnë indekset:
Ju mund të përjetoni përfitimet e indekseve duke vrapuar ZGJIDH kërkesë me kusht KU.
Ne kemi një tabelë që ruan informacione për përdoruesit.
Tabela ka kolona:
Pajtohu që të presësh 10 sekonda për një rezultat të pyetjes është një kohë mjaft e gjatë.
Tani le të përcaktojmë " indeks kolona " mosha dhe përsëris kërkesën.
Koha e ekzekutimit të pyetjes ishte 0.031 sekonda, që është dukshëm më e shpejtë se më parë.
Kështu, ne shohim një rritje të konsiderueshme të shpejtësisë gjatë përdorimit indekset.
Llojet e indekseve MySql:
Në artikujt e mëparshëm kam përmendur shpesh indekset në MySQL. dhe ju premtova se do t'ju tregoja për to së shpejti. Pra, kjo kohë ka ardhur, dhe sot do të mësoni rreth Indekset MySQL, për qëllimin e tyre dhe mënyrën e krijimit të tyre.
Indekset përdoren për të shpejtuar marrjen e të dhënave nga tabelat e bazës së të dhënave. Në fakt, indeks në MySQL- kjo është renditja e një fushe specifike në një tabelë. Kjo do të thotë, nëse një fushë është bërë një indeks, atëherë e gjithë tabela do të renditet sipas kësaj fushe. Pse është kjo e dobishme?
Le të themi se tabela jonë përmban 1000000 rekorde. Çdo hyrje ka një identifikues unik ID. Dhe le të themi se duhet të nxjerrim një rekord nga ID = 530124. Nëse nuk ka indeks, atëherë MySQL do të përsërisë të gjitha shënimet në tabelë derisa të gjejë atë që i nevojitet. Në rastin më të keq, ai do të detyrohet të zgjidhet 1000000 rekorde. Sigurisht, kjo do të jetë një kohë shumë e gjatë. Dhe nëse do të kishte një indeks (d.m.th., fusha do të renditej), atëherë rekordi do të zgjidhej mesatarisht në 100,000 herë më shpejt. Siç mund ta shihni, përfitimet janë të dukshme.
Megjithatë, indekset kanë një të metë të rëndësishme, e cila nuk lejon që çdo fushë tabele të indeksohet. Në fakt, një indeks është një tabelë tjetër, por thjesht me fushën përkatëse të renditur. Kjo do të thotë, duke bërë një indeks në një fushë, ju krijoni një tabelë tjetër saktësisht të njëjtë, e cila do të marrë hapësirë shtesë në disk.
Një tjetër minus i vogël indekset në MySQL Problemi është se kërkesat për të futur rekorde të reja detyrojnë tabelën të renditet përsëri. Si rezultat, futja e rekordeve të reja do të zgjasë pak më shumë se zakonisht. Por mos harroni se në shumicën e rasteve ju duhet ta bëni këtë shumë më rrallë sesa marrja e mostrave, kështu që ky minus nuk është i rëndësishëm.
Si të krijoni një indeks në MySQL?
Për çelësat kryesorë ( ÇELËSI PRIMAR) indeksi krijohet automatikisht, por për fushat e tjera sekuenca e veprimeve është PHPMyAdmin tjetër:
Dhe së fundi, do të doja të bëja një përmbledhje të shkurtër në mënyrë që të kuptoni: " Kur të krijohen indekset MySQL":
Dhe një gjë tjetër. Nëse papritmas shihni se kërkesat tuaja për marrjen e mostrave janë shumë të ngadalta, atëherë analizoni arsyen për këtë. Me shumë mundësi, ju vetëm duhet të shtoni një indeks. Në përgjithësi, provojeni dhe gjithçka do të bëhet e qartë.
Indekset përdoren për të gjetur shpejt rreshta me një vlerë të caktuar në një kolonë. Pa një indeks, një tabelë lexohet në të gjithë tabelën duke filluar me regjistrimin e parë derisa të gjenden rreshtat që përputhen. Sa më e madhe të jetë tavolina, aq më e madhe është kostoja. Nëse tabela përmban një indeks në kolonat në fjalë, atëherë MySQL mund të përcaktojë shpejt pozicionin e kërkimit në mes të skedarit të të dhënave pa kaluar nëpër të gjitha të dhënat. Për një tabelë që përmban 1000 rreshta, kjo do të jetë të paktën 100 herë më e shpejtë në krahasim me përsëritjen në të gjitha rekordet në mënyrë sekuenciale. Megjithatë, në rastin kur pothuajse të gjitha 1000 rreshtat duhet të aksesohen, leximet vijuese do të jenë më të shpejta sepse nuk kërkohen kërkime në disk.
Të gjithë indekset MySQL (PRIMARY, UNIQUE dhe INDEX) ruhen si pemë B. Vargjet kompresohen automatikisht, duke hequr parashtesat dhe hapësirat pasuese (shih seksionin 6.5.7 KRIJO SINtaksë të deklaratës së INDEKSIT).
Indekset përdoren për:
Supozoni se deklarata e mëposhtme SELECT quhet:
Mysql> SELECT * FROM tbl_name WHERE col1=val1 DHE col2=val2;
Nëse një indeks me shumë kolona ekziston në kolonat col1 dhe col2, atëherë rreshtat përkatës mund të zgjidhen drejtpërdrejt. Në rastin kur ekzistojnë indekse të veçanta në kolonat col1 dhe col2, optimizuesi përpiqet të gjejë indeksin më kufizues duke përcaktuar se cili indeks gjen më pak rreshta dhe e përdor atë indeks për të marrë ato rreshta.
Nëse një tabelë e caktuar ka një indeks me shumë kolona, atëherë çdo parashtesë më e majtë e atij indeksi mund të përdoret nga optimizuesi për të gjetur rreshta. Për shembull, nëse keni një indeks në tre kolona (col1,col2,col3), atëherë ekziston mundësia për kërkime të indeksuar në (col1), (col1,col2) dhe (col1,col2,col3).
Në MySQL, nuk mund të përdorni një indeks të pjesshëm nëse kolonat nuk formojnë prefiksin më të majtë të atij indeksi. Le të supozojmë se keni komandat SELECT të paraqitura më poshtë:
Mysql> SELECT * FROM tbl_name WHERE col1=val1; mysql> SELECT * FROM tbl_name WHERE col2=val2; mysql> SELECT * FROM tbl_name WHERE col2=val2 DHE col3=val3;
Nëse një indeks ekziston në (col1,col2,col3), atëherë vetëm pyetja e parë e paraqitur më sipër e përdor atë indeks. Pyetjet e dyta dhe të treta përfshijnë kolona të indeksuara, por (col2) dhe (col2,col3) nuk janë pjesa më e majtë e prefikseve (col1,col2,col3).
MySQL përdor gjithashtu indekse për LIKE krahasimet nëse argumenti në shprehjen LIKE është një varg konstant që nuk fillon me një karakter wildcard. Për shembull, komandat e mëposhtme SELECT përdorin indekse:
Mysql> SELECT * FROM tbl_name WHERE key_col LIKE "Patrick%"; mysql> SELECT * FROM tbl_name WHERE key_col LIKE "Pat%_ck%";
Komanda e parë shikon vetëm rreshtat me "Patrick"
Komandat e mëposhtme SELECT nuk do të përdorin indekse:
Mysql> SELECT * FROM tbl_name WHERE key_col LIKE "%Patrick%"; mysql> SELECT * FROM tbl_emri KU key_col LIKE other_col;
Në komandën e parë, vlera LIKE fillon me një karakter wildcard. Në komandën e dytë, vlera LIKE nuk është konstante.
MySQL 4.0 prezanton një optimizim të ndryshëm në shprehjen LIKE. Nëse përdoret shprehja... LIKE "%string%" dhe gjatësia e vargut është më e madhe se 3 karaktere, atëherë MySQL do të përdorë algoritmin Turbo Boyer-Moore për të inicializuar një model për vargun dhe më pas do ta përdorë atë model për të kryer kërkimi më i shpejtë.
Kur kërkoni duke përdorur emrin e kolonës IS NULL, indekset do të përdoren nëse emri i kolonës është një indeks.
MySQL zakonisht përdor indeksin që gjen më pak rreshta. Indeksi përdoret në kolonat që krahasohen duke përdorur operatorët e mëposhtëm: =, >, >=,
Nëse një indeks nuk mbulon të gjitha nivelet DHE në klauzolën WHERE, atëherë ai nuk përdoret për të optimizuar pyetjen. Me fjalë të tjera: që një indeks të jetë i përdorshëm, prefiksi i atij indeksi duhet të shfaqet në secilin grup AND.
Klauzolat e mëposhtme WHERE përdorin indekse:
WHERE index_part1=1 AND index_part2=2 AND other_column=3 ... WHERE index=1 OSE A=10 AND index=2 /* index = 1 OR index = 2 */ ... WHERE index_part1="përshëndetje" DHE index_part_3= 5 /* optimizuar si "index_part1="përshëndetje"" */ ... WHERE index1=1 dhe index2=2 ose index1=3 dhe index3=3; /* Ju mund të përdorni një indeks në indeksin 1, por jo në indeksin 2 ose indeksin 3 */
Klauzolat e mëposhtme WHERE Jo përdorni indekset:
WHERE index_part2=1 AND index_part3=2 /* index_part_1 nuk përdoret */ ... WHERE index=1 OSE A=10 /* Indeksi nuk përdoret në të dyja pjesët e DHE */ ... WHERE index_part1=1 OSE index_part2 =10 /* Nuk ka indeks që mbulon të gjitha rreshtat*/
Në disa raste, MySQL nuk përdor një indeks edhe pse është e mundur. Disa shembuj të situatave të tilla janë dhënë më poshtë:
Komanda CREATE INDEX në versionet e MySQL para 3.22 nuk bën asgjë. Në versionin 3.22 e më vonë, CREATE INDEX është ekuivalente me komandën ALTER TABLE për sa i përket krijimit të indekseve. Shih seksionin 6.5.4 Sintaksa e Deklaratës së Deklaratës TABELA ALTER.
Në mënyrë tipike, të gjitha indekset krijohen në një tabelë kur vetë tabela krijohet me komandën CREATE TABLE. Shih seksionin 6.5.3 KRIJO TABELA e sintaksës së deklaratës. CREATE INDEX ju lejon të shtoni indekse në tabelat ekzistuese.
Një listë e kolonave të formës (col1,col2,...) krijon një indeks në kolona të shumta. Vlerat e indeksit formohen duke bashkuar vlerat e kolonave të specifikuara.
Për kolonat CHAR dhe VARCHAR, parametri col_name(length) mund të përdoret për të krijuar indekse që përdorin vetëm një pjesë të kolonës (për kolonat BLOB dhe TEXT, duhet të specifikoni gjatësinë). Komanda e mëposhtme krijon një indeks duke përdorur 10 karakteret e para të kolonës së emrit:
Mysql> CREATE INDEX part_of_name ON klienti (emri(10));
Meqenëse shumica e emrave zakonisht ndryshojnë nga njëri-tjetri në 10 karakteret e para, ky indeks nuk duhet të jetë shumë më i ngadalshëm se ai i krijuar nga e gjithë kolona e emrit. Përveç kësaj, duke përdorur kolona të pjesshme për indekset, mund ta bëni skedarin e indeksit shumë më të vogël, gjë që kursen hapësirën në disk dhe gjithashtu rrit shpejtësinë e operacioneve INSERT!
Ju lutemi vini re se në MySQL 3.23.2 dhe më vonë, për tabelat MyISAM, mund të shtoni një indeks vetëm në kolonat që mund të pranojnë vlera NULL ose në kolonat BLOB/TEXT.
Për më shumë informacion se si MySQL përdor indekset, shihni seksionin 5.4.3 Përdorimi i Indekseve në MySQL.
Opsioni FULLTEXT mund të përdoret për të indeksuar vetëm kolonat VARCHAR dhe TEXT dhe vetëm në tabelat MyISAM. Ky funksion disponohet vetëm në versionin 3.23.23 të MySQL dhe më të lartë. Shih seksionin
Indeksimi i tabelave përdoret për të reduktuar kohën e kërkimit të të dhënave. Pa indekse, kërkimi ndodh thjesht duke numëruar të gjitha vlerat e tabelës, gjë që kërkon mjaft kohë.
Llojet e mëposhtme të indekseve përdoren në tabelat mysql:
Përveç indekseve të mësipërme, përdoret gjithashtu indeksi i tekstit të plotë, por nuk diskutohet në këtë artikull.
Çelësi primar përdoret për të identifikuar në mënyrë unike të dhënat në një tabelë. Ndër pikat kryesore në lidhje me çelësin primar, duhet të theksohen sa vijon:
1. një tabelë nuk mund të ketë vetëm një çelës unik;
2. vlera kryesore duhet të jetë unike brenda tabelës;
3. Çelësi primar nuk mund të jetë i tipit NULL.
Shembull i krijimit të një çelësi primar:
Krijimi i një çelësi primar kur krijoni një tabelë në përshkrimin e fushës
Shembulli 3:
Nëse çelësi kryesor është një fushë teksti, atëherë duhet të tregoni në kllapa numrin e karaktereve të përfshira në indeksimin.
Shembulli 5:
Nëse tabela është krijuar tashmë, atëherë mund të shtoni një indeks primar si më poshtë.
|
Përveç indeksit primar, një tabelë mund të përmbajë edhe indekse të rregullta dhe unike. Ndryshe nga indeksi primar, mund të ketë disa nga këto indekse. Dallimi midis një indeksi të rregullt dhe një indeksi unik është se një indeks unik nuk mund të ketë vlera identike.
Deklarimi i indekseve të rregullta bëhet duke përdorur fjalë kyçe kyç ose indeks. Nëse keni nevojë të deklaroni një indeks unik, atëherë më parë kyç ose indeksështë vënë fjala kyçe unike.
Shembulli 6:
Krijoni një indeks unik
Heqja e indekseve kryhet duke përdorur komandën e indeksit të rënies, duke përdorur atë, çdo indeks fshihet.
Shembulli 8:
$connection = mysqli i ri ("localhost", "root", "", "mybase"); |