Sunteți pe pagina 1din 29

200 Partea l Utilizarea general a sistemului MySQL

WHERE
col_d e!"resie #$ o coloan adec%at
&oloanele "e care le selecta'i si coloanele "e care le (olosi'i )n clauza WHERE "ot (i ide tice* desigur+ ,deea este
c a"ari'ia unei coloane )n lista de selec'ie nu re"rezint o su- gestie "entru inde!area acesteia+
&oloanele care a"ar )n clauzele de unire sau )n e!"resii de (orma coli co.2 sur e!trem de adec%ate "entru
inde!are+ &oloanele col_/ 0i col_c din interogarea "rezei tat anterior sunt e!em"le )n acest sens+ 1ac MySQL
"oate o"timiza o interog (olosind coloane unite* atunci reduce semni(icati% "osi/ilele com/ina'ii ta/el2r3ni4 "rin
eliminarea /aleierilor com"lete ale ta/elului+
5 6olosi'i inde!uri unice+ 73ndi'i2% la domeniul de %alori al unei coloane+ ,nde!ur (unc'ioneaz cel mai /ine
"entru coloane cu %alori unice* res"ecti% cel mai sla/ )n # zul coloanelor care "rezint numeroase %alori
du"licate+ 1e e!em"lu* dac o coloa con'ine %3rste si are numeroase %alori di(erite* un inde! %a (ace imediat
di(eren'a )ntr r3nduri+ Un inde! nu %a (i de mare a4utor dac o coloan este (olosit "entru a )nreg tra se!ul unei
"ersoane 0i con'ine numai cele dou %alori 8M8 si 868 9indi(erent de %44i4 loarea "e care o cuta'i* oricum %e'i
o/'ine cam 4umtate din r3nduri:+
5 6olosi'i inde!uri scurte+ 1ac inde!a'i o coloan 0ir* s"eci(ica'i o lungime a "re(i!ti'- lui ori de c3te ori situa'ia
o "ermite+ 1e e!em"lu* dac a%e'i o coloan &H;R 9200:* n#4 inde!a'i )ntreaga coloan dac "rimele <0 sau 20
de caractere dintr2o %aloare suri(- unice+ Prin inde!area "rimelor <0 sau 20 de caractere se %a economisi o mare
cantitat de s"a'iu )n (i0ierul inde! 0i "ro/a/il c interogrile %or de%eni 0i ele mai ra"ide+ U3l inde! mai mic
necesit mai "u'ine o"era'ii de intrare2ie0ire cu discul* iar %alorile scurte "ot (i com"arate mai ra"id+ Mai
im"ortant este c* dac %alorile c=eilor sunt scurte* /locurile din zona cac=e a inde!ului "ot con'ine mai multe
%alori ale c=eilo>l deci MySQL "oate stoca )n memorie mai multe c=ei simultan+ ;st(el* cre0te "ro/a/ili?. tatea
de localizare a r3ndurilor (r a mai (i necesar citirea de /locuri su"limentai din inde!+ 91ori'i s % (olosi'i si
/unul sim'* desigur+ ,nde!area numai a "rimului racter dintr2o coloan nu este c=iar at3t de util* deoarece )n
inde! nu %or e!ista multe %alori distincte+:
5 Utiliza'i "re(i!ele de st3nga+ &3nd crea'i un inde! cu n coloane* de (a"t crea'i inde!uri "e care MySQL le "oate
(olosi+ Un inde! "entru mai multe coloane est ec=i%alent cu mai multe inde!uri* deoarece orice set de coloane de
st3nga ale inde!uri lui se "oate (olosi "entru sta/ilirea cores"onden'ei cu anumite r3nduri+ Un asemene@. set se
nume0te "re(i! de st3nga< 9)n original le(tmost "re(i! 2 A+B+:+
S "resu"unem c a%e'i un ta/el cu un inde! "entru coloane denumite stat* ora0 0i cod_"ostal+ R3ndurile din
inde! sunt sortate )n ordinea statCorasCcod_"ostal* de sunt automat sortate at3t )n ordinea statCora0* c3t 0i )n
(unc'ie de stat+ ;ceast )nseamn c MySQL "oate /ene(icia de inde! c=iar daca s"eci(ica'i )ntr2o interogare.
numai %alorile din coloana stat* res"ecti% numai %alorile din coloanele stat 0i oras+@- ;st(el* inde!ul "oate (i
(olosit "entru a cuta urmtoarele com/ina'ii de coloaneD
< ;ceast o"era'ie este di(erit de inde!area "re(i!ului unei coloane* care (olose0te "rimele n caract ale coloanei
"entru %alorile din inde!+ 2 A+;+
&a"itolul E F"timizarea interogrilor 20<
stat* ora0* cod_"ostal
stat* ora0
stat
MySQL nu "oate (olosi inde!ul "entru cutri care nu im"lic un "re(i! de st3nga+ 1e e!em"lu* )n cazul )n care
cuta'i )n (unc'ie de ora0 sau cod_"ostal* inde!ul nu %a (i (olosit+ 1ac sunte'i )n cutarea unui stat dat 0i al unui
anumit cod "ostai 9coloanele l 0i G ale inde!ului:* inde!ul nu "oate (i (olosit "entru com/ina'ia de %alori
res"ecti%+ Botu0i* MySQL "oate reduce domeniul de cutare (olosind inde!ul "entru a gsi r3ndurile care con'in
statul cutat+
5 Au (olosi'i inde!ul )n mod e!cesi%+ Au inde!a'i tot ce %ede'i cu oc=ii* "ornind de la zicala Hcu c3t mai mult* cu
at3t mai /ine8+ Este o2gre0eal+ 6iecare inde! su"limentar ocu" s"a'iu "e disc 0i a(ecteaz "er(orman'ele
o"era'iilor de scriere* a0a cum s2a artat de4a+ ,nde!urile tre/uie actualizate si e%entual reorganizate atunci c3nd
modi(ica'i con'inutul ta/elelor dumnea%oastr* o"era'ie care are o durat direct "ro"or'ional cu numrul
inde!urilor+ 1ac a%e'i un inde! care este (olosit rareori sau niciodat* diminua'i )n mod inutil %iteza de e(ectuare
a modi(icrilor din ta/el* )n "lus* MySQL ia )n considerare inde!urile atunci c3nd genereaz un "lan de e!ecu'ie
"entru regsiri+ &rearea de inde!uri su"limentare )nseamn mai mult munc "entru utilitarul de o"timizare a
interogrilor+ Este de asemenea "osi/il 9de0i im"ro/a/il: ca MySQL s nu aleag cel mai /un inde! "entru
utilizare atunci c3nd a%e'i "rea multe inde!uri+ Pstrarea numai a inde!urilor de care a%e'i ne%oie a4ut utilitarul
de o"timizare a interogrilor s e%ite asemenea gre0eli+
1ac % g3ndi'i s aduga'i un inde! la un ta/el care este de4a inde!at* g3ndi'i2% dac inde!ul "e care % g3ndi'i
s2< aduga'i nu este un "re(i! de st3nga al unui inde! "e mai multe coloane de4a e!istent* )n acest caz* nu %
mai deran4a'i s aduga'i inde!ul* deoarece* )n realitate* )l a%e'i+
5 Iine'i cont de ti"urile de com"ara'ii "e care le e(ectua'i cu %alorile dintr2o coloan+ ,nde!urile sunt (olosite
"entru o"era'iile #* #* * $* $ 0i JEBWEEA+ ,nde!urile sunt de asemenea (olosite "entru o"era'iile L,KE*
atunci c3nd modelul are un "re(i! literal+ 1ac (olosi'i o coloan numai "entru alte categorii de o"era'ii* cum ar
(i SBR&MP 9:* nu are nici un sens s o inde!a'i+
Utilitarul de o"timizare a interogrilor din MySQL
&3nd emite'i o interogare "entru selectarea r3ndurilor* MySQL o analizeaz "entru a %edea dac "oate /ene(icia
de o"timizri care s2i "ermit s "relucreze interogarea mai ra"id* )n aceast sec'iune* %om e!amina modul de
(unc'ionare al utilitarului de o"timizare+ Pentru in(orma'ii su"limentare* consulta'i ca"itolul HF/'inerea unui
ni%el ma!im de "er(orman' din utilizarea sistemului MySQL8 din manualul de re(erin' MySQL+ &a"itolul
res"ecti% descrie di(erite msuri de o"timizare "e care le ia MySQL+ La acest ca"itol sunt adugate ocazional
alte in(orma'ii* deoarece dez%oltatorii MySQL continu s )m/unt'easc utilitarul de o"timizare* deci merit s
reciti'i ca"itolul din c3nd )n c3nd* "entru a %edea dac n2au a"rut "onturi noi "e care s le utiliza'i+ 9Lersiunea
electronic a manualului MySQL* de la adresa =tt"DCCMMM+mysNl+comC* este )n "ermanen' actualiza'i:
2O+ O@.@+P4G i *>@2@Q@
202 Partea l Utilizarea general a sistemului MySQL
Utilitarul de o"timizare a interogrilor din MySQL utilizeaz inde!urile* desigur* da (olose0te 0i alte in(orma'ii+
1e e!em"lu* dac emite'i urmtoarea interogare* MySQL l %a e!ecuta (oarte ra"id* indi(erent de dimensiunea
ta/eluluiD
SELE&B @ 6RFM nume4ta/el WHERE < F )n acest caz* MySQL e!amineaz clauza WHERE* sesizeaz c
nici un r3nd nu "oate satis (ace interogarea 0i nici mcar nu se mai o/ose0te s caute )n ta/el+ Pute'i %edea acest
luc cu a4utorul instruc'iunii EPPL;,A* care cere sistemului MySQL s a(i0eze unele in(ormat des"re modul )n
care ar e!ecuta o instruc'iune SELE&B* (r a o e!ecuta e(ecti%+ Pent (olosi EPPL;,A* "ur 0i sim"lu insera'i
cu%3ntul EPPL;,A )n (a'a instruc'iunii SELE&BD
EPPL;,A SELE&B @ 6RFM nume_ta/el WHERE < F Rezultatul instruc'iunii EPPL;,A este
urmtorulD
&omment
,m"ossi/le WHERE
9clauz WHERE im"osi/ila:
)n mod normal* EPPL;,A returneaz mai multe in(orma'ii dec3t cea "rezentat mai si inclusi% date des"re
inde!urile care %or (i (olosite "entru /aleierea ta/elelor* ti"urile di uniri care %or (i (olosite* res"ecti% estimeaz
numrul de r3nduri care %or tre/ui "arcur din (iecare ta/el+
Modul de (unc'ionare a utilitarului de o"timizare
Utilitarul de o"timizare a interogrilor din MySQL are numeroase sco"uri* dar "rir "ala sa menire este de a (olosi
inde!urile ori de c3te ori este "osi/il* "recum si de a (olc inde!ul cel mai restricti%* "entru a elimina c3t mai
multe r3nduri )ntr2un tim" c3t scurt+ Poate "rea ciudat* deoarece* atunci c3nd emite'i instruc'iuni SELE&B*
sco"ul du nea%oastr este de a gsi r3nduri* nu de a le elimina+ Moti%ul "entru care utilitarul o"timizare
(unc'ioneaz )n acest mod este urmtorulD cu c3t "ot (i scoase din disc r3nduri )ntr2o manier mai e!"editi%* cu
at3t "ot (i gsite mai ra"id r3ndurile care sa'is (ac criteriile de cutare+ ,nterogrile "ot (i "relucrate mai ra"id
dac testele cele restricti%e se "ot e(ectua "rimele+ S "resu"unem c a%e'i o interogare care testeaz doii
coloane* am/ele coloane (iind dotate cu inde!D
WHERE coli 8o %aloare8 ;A1 co.2 8o alta %aloare8
S "resu"unem c testul a"licat asu"ra coloanei l gse0te R00 de r3nduri* c testul a"lid asu"ra coloanei 2 gse0te
G00 de %alori* 0i c am/ele teste reu0esc )n cazul a G0 de r3ndi 1ac testa'i mai )nt3i coloana l* tre/uie s
e!amina'i R00 de r3nduri "entru a le gsi cele G0 care cores"und 0i %alorii din coloana 2+ ;sta )nseamn ST0 de
teste ratate+ 1aU4 testa'i mai )nt3i coloana 2* tre/uie s e!amina'i numai G00 de r3nduri "entru a le gsi 4 cele G0
care de asemenea cores"und %alorii din coloana <+ Aumrul testelor ratate )nV caz este de 2T0* ceea ce im"lic
mai "u'ine calcule si o"era'ii de intrare2ie0ire cu disc
Pute'i a4uta utilitarul de o"timizare s (oloseasc inde!urile (olosind urmtoarele )ndrur 5 &om"ara'i coloane de
acela0i ti"+ &3nd (olosi'i coloane inde!ate )n com"ara'ii* ut liza'i coloane de acela0i ti"+ 1e e!em"lu* &H;R 9<0:
este considerat identic cu &H;R 9K sau L;R&H;R9,F:* dar di(erit de &H;R9<2: sau L;R&H;R9<2:+ ,AB este
di(erit de J,7,,@
&a"itolul E F"timizarea interogrilor 20G
Utilizarea coloanelor de acela0i ti" este o cerin' o/ligatorie )n %ersiunile de MySQL anterioare %ersiunii G+2G* )n
caz contrar inde!urile "entru coloane ne(iind (olosite* )nce"3nd de la %ersiunea G+2G* acest lucru nu este strict
necesar* dar ti"urile de coloane identice % %or o(eri "er(orman'e su"erioare ti"urilor de coloane di(erite* )n cazul
)n care coloanele "e care le com"ara'i sunt de ti"uri di(erite* "ute'i (olosi ;LBER B;JLE )n sco"ul de a modi(ica
unul dintre ele* "entru a o/'ine asemnarea+ 5 )ncerca'i s singulariza'i coloanele inde!ate )n com"ara'ii+ 1ac
(olosi'i o coloan )ntr2un a"el la o (unc'ie sau )ntr2o e!"resie aritmetic* MySQL nu "oate (olosi inde!ul*
deoarece tre/uie s calculeze %aloarea e!"resiei "entru (iecare r3nd+ Uneori acest lucru este ine%ita/il* dar de
multe ori "ute'i rescrie o interogare "entru a o/'ine c=iar coloana inde!at+
Urmtoarele clauze WHERE ilustreaz acest as"ect* )n "rima linie* utilitarul de o"timizare %a sim"li(ica e!"resia
EC2 la %aloarea 2* a"oi %a (olosi un inde! "e coloana4nea "entru a desco"eri ra"id %alorile mai mici dec3t 2+ )n a
doua e!"resie* MySQL tre/uie s regseasc %aloarea din coloana4nea "entru (iecare r3nd* s multi"lice cu 2 0i
a"oi s com"are rezultatul cu E+ Au se "oate (olosi nici un inde!* deoarece tre/uie regsit (iecare %aloare din
coloan* ast(el )nc3t e!"resia din mem/rul st3ng al com"ara'iei s "oat (i e%aluatD
WHERE coloana4nea # E C 2
WHERE coloana4nea @ 2 # E
S ne g3ndim la un alt e!em"lu+ S "resu"unem c a%e'i o coloan inde!at data_col+ 1ac emite'i o interogare
"recum urmtoarea* inde!ul nu este (olositD
SELE&B @ 6RFM ta/elul4neu WHERE WE;R9data_col: # <RR0 E!"resia nu com"ar %aloarea dintr2o coloan
inde!at cu <RR0V se com"ar o %aloare calculat din %aloarea coloanei* iar %aloarea res"ecti% tre/uie calculat
"entru (iecare r3nd+ &a rezultat* inde!ul "e coloana data_col nu "oate (i (olosit+ &are este remediul? 6olosi'i o
datS literal* 0i inde!ul "entru coloana data 4Vol %a (i utilizatD
WHERE data_col # 8<RR020<20<8
1ar s "resu"unem c nu a%e'i o dat "recizat* )n sc=im/* sunte'i interesat )n gsirea )nregistrrilor a cror dat
se a(l la un anumit numr de zile de data de astzi+ E!ist numeroase metode de scriere a unei interogri "recum
aceasta* dar nu toate la (el de /une+ Sunt trei "osi/ilit'iD
WHERE BF_1;WS9data_&Fl: 2 BFX:;WS9&URREAB_1;BE: # limita
WHERE BF_1;WS9data_col: # limita Y BFX:;WS9&URREABX:;BE:
WHERE data_&Fl # 1;BE_;119&URREABX:;BE* ,ABERL;L limita 1;W: Pentru "rima linie* nu %a (i
(olosit nici un inde!* deoarece coloana tre/uie regsit "entru (iecare r3nd* "entru a "ermite calculul %alorii
BFX:;WS9data4Gol:+ ; doua linie este mai /un+ ;t3t limita c3t si BF_1;WS9&URREAB_1;BE:sunt constante*
deci mem/rul dre"t al com"ara'iei "oate (i calculat o singur dat de utilitarul de o"timizare )nainte de
"relucrarea interogrii nu "entru (iecare r3nd )n "arte+ 1ar coloana data_col a"are )ntr2un a"el la o (unc'ie* deci
inde!ul nu este (olosit+ &ea de2a treia linie este metoda ideal+ 1in nou* mem/rul dre"t al com"ara'iei "oate (i
calculat o singura dat* (iind o constant* )naintea e!ecu'iei interogrii* dar acum %aloarea este o
20E Partea l Utilizarea general a sistemului MySQL
dat calendaristic+ ;cea %aloare "oate (i com"arat direct cu %alorile din coloaiS data_col* care nu mai tre/uie
con%ertite )n zile+ )n acest caz* se "oate (olosi inde!
5 Au (olosi'i caractere de )nlocuire la )nce"utul unui model L,KE+ Uneori oamer44 caut 0iruri (olosind o clauz
WHERE de (orma urmtoareD
WHERE nume_coloana L,KE 8ZsirL ;ceasta este o o"era'ie corect dac dori'i s gsi'i 0irul 0ir indi(erent
unde a"li acesta )n interiorul coloanei+ 1ar nu insera'i caracterul Z de am/ele "r'i doar d o/i0nuin'+ 1ac )ntr2
ade%r cuta'i 0irul numai atunci c3nd acesta a"are la )nce"ut coloanei* atunci nu mai scrie'i "rimul caracter Z+
1e e!em"lu* )n cazul )n care caut )ntr2o coloan care con'ine nume de (amilie acele nume care )nce" cu 8Mac8*
ser clauza WHERE ast(elD
WHERE nume L,KE 8MacZ8 Utilitarul de o"timizare e!amineaz "artea literal ini'ial a modelului 0i (olosii
inde!ul "entru a gsi r3ndurile care cores"und acestuia* ca si cum a'i (i scris urni toarea e!"resie* care se a(l
)ntr2o (orm ce "ermite utilizarea unui inde! "eni coloana numeD
WHERE nume $ 8Mac8 ;A1 nume # 8Mad8
;ceast o"timizare nu se a"lic o"era'iilor de sta/ilire a cores"onden'elor cu model care (olosesc o"eratorul
RE7EPP+
5 ;4uta'i utilitarul de o"timizare s e(ectueze estimri mai /une ale e(icien'ei inde
lui+ )n mod "resta/ilit* c3nd com"ara'i %alorile din coloanele inde!ate cu o const utilitarul de o"timizare %a
"resu"une c %alorile c=eilor sunt distri/uite )n mod uni(otO )n inde!+ 1e asemenea* utilitarul de o"timizare %a
%eri(ica ra"id inde!ul* "entru a esti(l numrul de intrri din inde! care %or (i (olosite atunci c3nd se determin
dac inde!ul < /uie (olosit sau nu "entru com"ara'iile cu %alori constante+ Pute'i (urniza utilitaruluil) o"timizare
in(orma'ii mai /une (olosind o"'iunea 2 2analyze cu myisamc=[ sau isa "entru a analiza distri/u'ia %alorilor
c=eil/r+ 6olosi'i myisamc=[ "entru ta/ele res"ecti% isamc=[ "entru ta/ele ,S;M+ Pentru a e(ectua analiza
c=eilor* tre/uie s \ desc=ide o sesiune de lucru la gazda ser%erului MySQL si tre/uie s a%e'i acces de i la
(i0ierele ta/elului+
5 Utiliza'i instruc'iunea EPPL;,A "entru a %eri(ica (unc'ionarea utilitarului de # mizare+ Leri(ica'i dac )n
interogrile dumnea%oastr sunt (olosite inde!urile "e eliminarea cu ra"iditate a r3ndurilor+ 1ac nu* "ute'i
)ncerca s (olosi'i SBR;,7HB_X "entru a (or'a e(ectuarea unei uniri (olosind ta/ele )ntr2o anumit ordine*
interogarea )n di(erite moduri "entru a % (orma o o"inieV s2ar "utea ca MySQ,i- ai/ un moti% solid "entru a nu
(olosi inde!urile )n ordinea "e care dumnea%oast considera'i cea mai /un+
5 Besta'i (orme alternati%e ale interogrilor* dar rula'i2le de mai multe ori+ &3nd l ta'i (ormele alternati%e ale unei
interogri* rula'i2le de mai multe ori )n (iecare (c 1ac rula'i am/ele %ariante ale unei interogri c3te o singur
dat "e (iecare*O ] desco"eri (rec%ent c a doua %ariant este mai ra"id* 0i aceasta numai deoarece ir ma'iile de la
"rima interogare se a(l )nc )n zona cac=e a discului 0i nu tre/uie e(ecti% citite de "e disc+ 1e asemenea* tre/uie
s )ncerca'i s rula'i interogrile at
&a"itolul E F"timizarea interogrilor 20Q
c3nd )ncrcarea sistemului este relati% sta/il* "entru a e%ita e(ectele datorate altor acti%it'i din sistemul
dumnea%oastr+
;nularea e(ectelor o"timizrii
Poate "rea ciudat* dar e!ist situa'ii c3nd dori'i s contracara'i te=nicile de o"timizare ale sistemului MySQL+
Unele din aceste circumstan'e sunt descrise )n sec'iunea de (a'D
5 Pentru a (or'a sistemul MySQL s 0tearg )ncet con'inutul unui ta/el+ &3nd dori'i s 0terge'i com"let con'inutul
unui ta/el* acesta "oate dis"rea cel mai re"ede dac se (olose0te o instruc'iune 1ELEBE (r nici o clauz
WHERED
1ELEBE 6RFM nume_ta/el
MySQL o"timizeaz acest caz s"ecial de instruc'iune 1ELEBEV "ur 0i sim"lu re2creeaz (i0iere de date 0i (i0iere
inde! %ide "ornind de la zero* (olosind* descrierea ta/elului din (i0ierul cu in(orma'ii "ri%ind ta/elul+ ;ceast
o"timizare mre0te e!trem de mult %iteza o"era'iei de 0tergere* deoarece MySQL nu mai tre/uie s 0tearg
(iecare r3nd )n "arte+ Botu0i* o"era'ia are unele e(ecte care nu sunt de dorit )n anumite circumstan'eD
5 MySQL ra"orteaz numrul r3ndurilor a(ectate de instruc'iune ca (iind zero* c=iar dac ta/elul nu era %id+ )n
ma4oritatea cazurilor* acest as"ect nu conteaz 9de0i "oate (i derutant dac nu % a0te"ta'i la a0a ce%a:* dar "entru
a"lica'ii care au e(ecti% ne%oie s cunoasc numrul real de r3nduri* aceast o"'iune nu este adec%at+
5 1ac ta/elul con'ine o coloan ;UBF_,A&REMEAB* numerotarea sec%en'ei din coloan este reini'ializat
"entru a )nce"e de la <+ ;cest lucru este ade%rat c=iar 0i )n condi'iile )m/unt'irii metodelor de mani"ulare a
atri/utului ;UBF_,A&REMEAB* introduse )n MySQL %ersiunea G+2G 0i e!"use )n sec'iunea HLucrul cu
sec%en'e8 a ca"itolului 2* HLucrul cu date )n MySQL8+
Pute'i Hdeo"timiza8 o instruc'iune 1ELEBE adug3nd o clauz WHERE <$0D 1ELEBE 6RFM nume_ta/el
WHERE < $ F
;ceast instruc'iune (or'eaz sistemul MySQL s e!ecute o 0tergere r3nd cu r3nd+ ,nterogarea se e!ecut mult
mai lent* dar %a returna numrul real de r3nduri 0terse+ 1e asemenea* %a conser%a numerotarea curent a
sec%en'ei ;uBF_,A&REMEAB* de0i numai "entru ta/elele MylS;M 9dis"oni/ile )n MySQL %ersiunea G+2G 0i
)n %ersiunile ulterioare:+ Pentru ta/elele ,S;M* din "cate* sec%en'a este totu0i reini'ializat+
@ Pentru a e%ita un ciclu de actualizare in(init+ 1ac actualiza'i o coloan inde!at* este "osi/il ca r3ndurile care
sunt actualizate s (ie actualizate la in(init* )n cazul )n care coloana este (olosit )n clauza WHERE 0i c3nd
actualizarea mut %aloarea inde!ului )n "artea din domeniu care nu a (ost )nc "relucrat+ S "resu"unem c
ta/elul ta/elul4neu are o coloan )ntreag col_c=eie care este inde!at+ ,nterogri ca urmtoarea "ot cauza
"ro/lemeD
UP1;BE ta/elul4neu SEB col_c=eie col_c=eieY<
WHERE col_c=eie $ 0V
Solu'ia )n acest caz este utilizarea coloanei col_c=eie )ntr2o e!"resie din clauza WHERE* ast(el )nc3t MySQL s
nu "oat (olosi inde!ulD
20^ Partea l Utilizarea general a sistemului MySQL
UP1;BE ta/elul4neu SEB col_c=eie col_c=eieY<
WHERE col_c=eieY0 $ 0V
1e (a"t* mai e!ist o solu'ieD trece'i la %ersiunea MySQL G+2G+2 sau la o %ersiune D recent* ceea ce %a a%ea ca
e(ect remedierea "ro/lemei+
5 Pentru a regsi rezultate )ntr2o ordine aleatoare* )nce"3nd de la %ersiunea MyS9 G+2G+2* "ute'i (olosi (unc'ia
FR1ER JW R;A19: "entru sortarea aleatoare a rezultatel F alt te=nic* util "entru %ersiuni mai %ec=i de
MySQL* este de a selecta o coloa de numere aleatoare 0i de a sorta )n (unc'ie de coloana res"ecti%+ Botu0i* dac
scrii interogarea du" cum urmeaz* utilitarul de o"timizare contracareaz inten'ia dui] nea%oastrD
SELE&B +++* R_A19: ;S ratld_col 6RFM +++ FR1ER JW rand_&Fl Pro/lema )n acest caz este c
MySQL H%ede8 c res"ecti%a coloan este un a"el la 4 (unc'ie* crede c %aloarea coloanei %a (i o constant si
o"timizeaz clauza FR1ER c=iar din interogare. Pute'i induce )n eroare utilitarul de o"timizare (c3nd re(erirel
interiorul e!"resiei la o coloan din ta/el+ 1e e!em"lu* dac ta/elul dumnea%oa are o coloan denumit %3rsta*
"ute'i scrie interogarea ast(elD
SELE&B %arsta@0YR;A19: ;S rand_col
6RFM +++ FR1ER JW rand_col
5 Pentru a anula ordinea de unire a ta/elelor sta/ilit de utilitarul de o"timiza 6olosi'i SBR;,7HB_XF,A "entru
a (or'a utilitarul de o"timizare s (oloseasc ta/ele )ntr2o anumit ordine+ 1ac "roceda'i ast(el* tre/uie s
ordona'i ta/elele de manier )nc3t "rimul ta/el s (ie cel din care %a (i selectat cel mai mic numr de r3u duri+
91ac nu sunte'i sigur care este acest ta/el* trece'i ta/elul cu numrul cel mare de r3nduri "e "rima "ozi'ie din
list+: &u alte cu%inte* )ncerca'i s ordona ta/elele ast(el )nc3t selec'ia cea mai restricti% s se a"lice "rima+
,nterogrile des(0oar mai /ine dac "ute'i elimina c3t mai ra"id r3ndurile candidate "osi/ile* uita'i s )ncerca'i
interogarea )n am/ele sensuriV "ot e!ista moti%e "entru care utilit de o"timizare nu une0te ta/elele )n modul )n
care crede'i c ar tre/ui s "rocedeze* ii instruc'iunea SBR;,7HB_XF,A "oate s nu (ie de "rea mare a4utor+
;legerea ti"urilor de coloan si e(icien'a interogrilor
;ceast sec'iune (urnizeaz unele instruc'iuni "entru alegerea coloanelor care "ot # tri/ui la e!ecutarea mai
ra"id a interogrilor2D
5 6olosi'i coloane cu lungime (i!* nu coloane cu lungime %aria/il+ ;cest lucru 5 %ala/il mai ales "entru ta/elele
care sunt modi(icate (rec%ent si care sunt* ca atare* 4 su"use la (ragmentare+ 1e e!em"lu* trans(orma'i toate
coloanele caracter )n col' &H;R* nu L;R&H;R+ &om"romisul este acela c ta/elul dumnea%oastr %a (olosi
mult s"a'iu* dar* dac % "ute'i "ermite s"a'iul su"limentar* r3ndurile cu lungime i "ot (i "relucrate mai ra"id
dec3t r3ndurile cu lungime %aria/il+
2 )n aceast e!"unere* "rin Hti"uri JLFJ8 se %or )n'elege at3t ti"urile JLFJ* c3t 0i ti"urile BEPB+ 2 A+;+
&a"itolul E F"timizarea interogrilor 20T
5 Au (olosi'i coloane mai lungi atunci c3nd se "ot utiliza 0i coloane mai scurte+ 1ac (olosi'i coloane &H;R de
lungime (i!* nu le (ace'i inutil de lungi+ 1ac %aloarea cea mai scurt "e care o stoca'i )ntr2o coloan este de E0
caractere* nu o declara'i su/ (orma &H;R92QQ:V declara'i2o su/ (orma &H;R9E0:+ 1ac "ute'i (olosi
ME1,UM,AB )n loc de J,7,AB* ta/elul dumnea%oastr %a (i mai mic 9ceea ce im"lic mai "u'ine o"era'ii de
intrare2ie0ire cu discul:* iar %alorile %or (i "relucrate mai ra"id )n cadrul calculelor+
5 1eclara'i coloanele ca AFB AULL+ ;st(el* o/'ine'i o %itez de "relucrare mai mare 0i a%e'i ne%oie de un s"a'iu
de stocare mai redus+ 1e asemenea* %a sim"li(ica uneori interogrile* deoarece nu tre/uie s trata'i AULL ca "e
un caz s"ecial+
5 Lua'i )n calcul utilizarea de coloane EAUM+ 1ac a%e'i o coloan 0ir care con'ine numai un numr limitat de
%alori distincte* lua'i )n considerare con%ersia acesteia la o coloan EAUM+ Lalorile EAUM "ot (i "relucrate
ra"id* deoarece sunt re"rezentate intern su/ (orm de %alori numerice+
5 6olosi'i PRF&E1URE ;A;LWSE9:+ 1ac dis"une'i de MySQL %ersiunea G+2G sau de o %ersiune ulterioar*
rula'i (unc'ia PRF&E1URE ;A;LWSE.: "entru a "rimi in(orma'ii des"re coloanele din ta/elul
dumnea%oastrD8
SELE&B @ 6RFM nume_ta/el PRF&E1URE_;A;LWSE9:
SELE&B @ 6RFM nume_ta/el PRF&E1URE_;A;LWSE9<^*2Q^:
Una dintre coloanele datelor de ie0ire este o sugestie a ti"ului o"tim de coloan "entru (iecare dintre coloanele
ta/elului dumnea%oastr+ &el de2al doilea e!em"lu indic (unc'iei PRF&E1URE ;A;LWSE 9: s nu sugereze
ti"uri EAUM care con'in mai mult de <^ %alori sau care ocu" mai mult de 2Q^ octe'i 9"ute'i modi(ica %alorile
du" cum dori'i:+ 6r asemenea restric'ii* datele de ie0ire "ot (i (oarte lungiV declara'iile EAUM sunt deseori
di(icil de citit+
)n (unc'ie de datele de ie0ire ale (unc'iei PRF&E1URE ;A;LWSE F* "ute'i desco"eri c ta/elul dumnea%oastr
"oate (i modi(icat "entru a /ene(icia de un ti" mai e(icient+ 6olosi'i ;LBER B;JLE dac dori'i s modi(ica'i un
ti" de coloan+
5 H)m"ac=eta'i8 date )ntr2o coloan JLFJ+ Utilizarea unui ti" JLFJ "entru a stoca date "e care le )m"ac=eta'i 0i
le des"ac=eta'i )n a"lica'ia dumnea%oastr % "oate "ermite s o/'ine'i toate datele "rintr2o singur o"era'ie de
regsire* )n loc de mai multe asemenea o"era'ii+ Utilizarea ti"ului JLFJ "oate (i de asemenea de (olos "entru
datele care nu sunt u0or de re"rezentat )ntr2o structur de ta/el standard sau care se modi(ic )n tim"+ )n
e!"unerea instruc'iunii ;LBER B;JLE din ca"itolul G* unul din e!em"le a/orda un ta/el (olosit "entru stocarea
rezultatelor din c3m"urile unui c=estionar /azat "e We/+ E!em"lul res"ecti% "rezenta modul )n care "ute'i (olosi
instruc'iunea ;LBER B;JLE "entru a aduga coloane la ta/el ori de c3te ori aduga'i )ntre/ri la c=estionar+
F alt modalitate de a/ordare a acestei "ro/leme este de a determina "rogramul de a"lica'ie care "relucreaz
(ormularul We/ s H)m"ac=eteze8 datele )ntr2un (el de structur de date* iar a"oi s le insereze )ntr2o singur
coloan JLFJ+ ;st(el* a"lica'ia ca"t su"rasarcina de codi(icare a datelor 90i de decodi(icare a acestora mai
t3rziu* atunci c3nd regsi'i )nregistrri din ta/el:* dar se sim"li(ic structura ta/elului 0i se elimin necesitatea de
modi(icare a structurii ta/elului atunci c3nd c=estionarul se modi(ic+
20S Partea l Utilizarea general a sistemului MySQL
Pe de alt "arte* %alorile JLFJ "ot "ro%oca "ro"riile lor "ro/leme* mai ales dac e(U tua'i o mul'ime de o"era'ii
de ti" 1ELEBE 0i UP1;BE+ `tergerea unui JLFJ "oate lsa i mare gol )n ta/el* gol care %a (i um"lut ulterior
cu o )nregistrare sau )nregistrri ' dimensiuni "ro/a/il di(erite+
5 6olosi'i instruc'iunea FPB,M,aE B;JLE "entru ta/ele su"use la (ragment
Ba/elele care su(er numeroase modi(icri* mai ales acelea care con'in coloane lungime %aria/il* sunt su"use
(ragmentrii+ 6ragmentarea nu este indicat* deoarU] duce la a"ari'ia unor s"a'ii nedorite )n /locurile de "e disc
(olosite "entru stoca ta/elului dumnea%oastr* )n tim"* tre/uie s citi'i mai multe /locuri "entru a o/'ii44 r3ndurile
%alide* iar "er(orman'ele sunt diminuate+ ;cest lucru este ade%rat "en' orice ta/el cu r3nduri de lungime
%aria/il* dar este %ala/il mai ales "entru coloane JLFJ* deoarece dimensiunea acestora "oate %aria (oarte mult+
Utilizarea sistematic i instruc'iunii FPB,M,aE B;JLE contri/uie la )m"iedicarea degradrii "er(orman'ele
ta/elului+
5 6olosi'i un inde! sintetic+ &oloanele unui inde! sintetic "ot (i uneori utile+ F te=r este de a crea o %aloare =as=G
)n (unc'ie de alte coloane 0i de a o stoca )ntr2o coloar se"arat+ ;"oi* "ute'i gsi r3nduri "rin cutarea %alorilor
=as=+ ;cest "rocedeu est util numai "entru interogrile care caut cores"onden'e e!acte cu un model dat-
9Lalorile =as= sunt inutile "entru cutri )ntr2un domeniu cu o"eratori "recum # sa $+: Lalorile =as= "ot (i
generate )n MySQL G+2G sau )n %ersiunile ulterioare (olosii (unc'ia M1Q 9:+
Un inde! =as= "oate (i deose/it de util )n ceea ce "ri%e0te coloanele JLFJ+ Unul dii' moti%e este c nu "ute'i
inde!a aceste ti"uri anterior %ersiunii MySQL G+2G+2+ c=iar 0i )n %ersiunea G+2G+2 sau )n %ersiunile ulterioare*
%alorile JLFJ "ot (i mai u0or d- gsit (olosind o %aloare =as= ca identi(icator dec3t "rin cutarea )n coloana
JLFJ+
5 E%ita'i s regsi'i %alori JLFJ sau BEPB "rea mari* cu e!ce"'ia situa'iilor c3nd suni te'i o/ligat s o (ace'i+ 1e
e!em"lu* o interogare SELE&B @ nu este o idee "rea /ur dec3t dac sunte'i sigur c clauza WHERE %a limita
rezultatele la r3ndurile "e care ,4 dori'i* )n caz contrar* este "osi/il s de"lasa'i "rin re'ea %alori JLFJ "osi/il
(oarte 4 (r a/solut nici un rost+ ;ceasta este o alt situa'ie c3nd in(orma'ia de identi(icare %alorilor JLFJ*
stocat )ntr2o alt coloan* "oate (i util+ Pute'i cuta )n coloana res"ec2l ti% "entru a determina r3ndul sau
r3ndurile "e care le dori'i* du" care regsi'i %alNaE- rea JLFJ din r3ndurile cores"unztoare+
5 1e"lasa'i %alorile JLFJ )ntr2un ta/el se"arat* )n anumite situa'ii* este 4usti(icat mutarea coloanelor JLFJ
dintr2un ta/el )n alt ta/el secundar* dac acest lucru % "e mite s con%erti'i ta/elul )ntr2un (ormat cu r3nduri de
lungime (i! "entru coloane rmase+ ;cest "rocedeu %a reduce (ragmentarea )n ta/elul "rimar si* de asemenea*
"ermite s "ro(ita'i de "lusul de "er(orman' determinat de r3ndurile cu lungime (i!ll
G Laloare numeric rezultat "rintr2o trans(ormare cunoscut su/ numele de (unc'ie =as= 9)n cazul nos2-- tru
M1Q: care con%erte0te un identi(icator sau o c=eie* care au o anumit semni(ica'ie "entru utiliza2i)i* tor* )ntr2o
%aloare care indic locul ocu"at de date )ntr2un ta/el+ 9&(+ 1ic'ionar de calculatoare*> Editura Beora* <RRR+: 2
A+B+ O OS
&a"itolul E F"timizarea interogrilor 20R
)ncrcarea e(icient a datelor
Pro/a/il c )n ma4oritatea tim"ului %e'i (i "reocu"at de o"timizarea interogrilor SELE&B* deoarece acestea sunt
cele mai (olosite ti"uri de interogri si deoarece modul de o"timizare a acestora nu este )ntotdeauna sim"lu de
intuit+ Prin com"ara'ie* )ncrcarea datelor )n /aza dumnea%oastr de date este o o"era'ie sim"l+ Botu0i* e!ist
strategii "e care le "ute'i (olosi "entru a )m/unt'i e(icien'a o"era'iunilor de )ncrcare a datelor+ Princi"iile de
/az sunt urmtoareleD
5 )ncrcarea unor mari cantit'i de date este mai ra"id dec3t )ncrcarea unui singur r3nd* deoarece zona cac=e a
inde!ului nu tre/uie golit du" )ncrcarea (iecrei )nregistrriV golirea "oate a%ea loc la )nc=eierea lotului de
)nregistrri+
5 )ncrcarea este mai ra"id atunci c]nd un ta/el nu are inde!uri dec3t atunci c3nd este inde!at+ 1ac e!ist
inde!uri* este necesar nu numai adugarea )nregistrrii la (i0ierul de date* dar (iecare inde! tre/uie modi(icat
"entru a re(lecta adugarea noii )nregistrri+
5 ,nstruc'iunile SQL mai scurte sunt mai ra"ide dec3t instruc'iunile mai lungi* deoarece im"lic o analiz mai
redus din "artea ser%erului 0i deoarece "ot (i trimise mai ra"id "rin re'ea de la client la ser%er+
Unii din ace0ti (actori "ot "rea minori 9mai ales ultimul:* dar* dac )ncrca'i o mul'ime de date* c=iar si micile
trucuri de s"orire a e(icien'ei determin o di(eren'+ Putem (olosi "rinci"iile generale anterioare "entru a trage
numeroase concluzii "ractice cu "ri%ire la modul cel mai ra"id de )ncrcare a datelorD
5 ,nstruc'iunea LF;1 1;B;* )n toate (ormele sale* este mai e(icient dec3t ,ASERB* deoarece )ncarc r3ndurile
)n cantit'i mari+ 7olirea zonei cac=e a inde!ului are loc mai "u'in (rec%ent 0i ser%erul tre/uie s analizeze 0i s
inter"reteze o singur instruc'iune* )n loc de mai multe+
5 LF;1 1;B; este mai e(icient dec3t LF;1 1;B; LF&;L+ 1ac se (olose0te instruc'iunea LF;1 1;B;*
(i0ierul tre/uie s se a(le )n ser%er 0i dumnea%oastr tre/uie s a%e'i "ri%ilegiul 6,LE* dar ser%erul "oate citi
(i0ierul direct de "e disc+ &u instruc'iunea LF;1 1;B; LF&;L* clientul cite0te (i0ierul si )l trimite )n re'ea
ser%erului* ceea ce re"rezint o o"era'ie mai lent+
5 1ac tre/uie s (olosi'i ,ASERB* utiliza'i (orma care "ermite s"eci(icarea mai multor r3nduri )n aceea0i
instruc'iuneD
,ASERB ,ABF nume_ta/el L;LUES9 +++:*9+++:*+++
&u c3t se "ot s"eci(ica numere de r3nduri mai mari )n cadrul instruc'iunii* cu at3t mai /ine+ ;st(el se reduce
numrul total de instruc'iuni de care a%e'i ne%oie 0i se reduce numrul de goliri ale zonei cac=e a inde!ului+
1ac (olosi'i mysNldum" "entru a genera (i0iere co"ii de siguran' "entru /aza de date* (olosi'i o"'iunea
22e!tended 2insert* ast(el )nc3t (i0ierul de descrcare s con'in instruc'iuni ,ASERB "entru mai multe r3nduri+ 1e
asemenea* "ute'i (olosi 2 2o"t 9o"timizare:* care acti%eaz o"'iunea 2 2e!tended 2insert+ Pe de alt "arte* e%ita'i
utilizarea o"'iunii 2 2com"lete 2insert cu mysNldum"V instruc'iunile ,ASERB rezultante %or (i "entru r3nduri
indi%iduale* %or (i mai lungi 0i %or necesita un %olum su"limentar de analiz dec3t instruc'iunile generate (r 2
2com"lete2insert+
J2 $O+m
'i+W>i
2<0 Partea l Utilizarea general a sistemului MySQL
5 6olosi'i "rotocolul clientCser%er com"rimat "entru a reduce cantitatea de date trec "rin re'ea+ Pentru ma4oritatea
clien'ilor MySQL* acest lucru se "oate s"eci(ic (olosind o"'iunea "entru linia de comand 22com"ress* )n general*
acest "rotocol i %a (olosi numai "e re'elele lente* deoarece com"rimarea (olose0te o mare "arte tim"ul
"rocesorului+
5 Lsa'i sistemul MySQL s insereze automat %alorile "resta/iliteV nu s"eci(ica'i* instruc'iunile ,ASERB*
coloanele crora le %a (i oricum atri/uit %aloarea "resta/ilii. )n medie* instruc'iunile dumnea%oastr %or (i mai
scurte* ceea ce %a reduce numr. de caractere trimise "rin re'ea ctre ser%er* )n "lus* deoarece instruc'iunile
con'in i "u'ine %alori* ser%erul e!ecut un %olum de analiz mai redus 0i con%ersii de %alori i "u'ine+
5 1ac un ta/el este inde!at* "ute'i diminua su"rasarcina determinat de inde!are "ti0 utilizarea inser'iilor
gru"ate "e loturi 9instruc'iunea LF;1 1;B; sau instruc'iuni ,ASE "entru mai multe r3nduri:+ ;cestea reduc la
minimum im"actul actualizrii inde!uli: deoarece zona cac=e a inde!ului tre/uie golit numai du" ce toate
r3ndurile auO+ "relucrate* nu du" (iecare r3nd )n "arte+
5 1ac tre/uie s )ncrca'i (oarte multe date )ntr2un ta/el nou "entru a2< "o"ula* mai ra"id s crea'i ta/elul (r
inde!uri* s )ncrca'i datele 0i a"oi s crea'i inde!ur Este mai ra"id s crea'i toate inde!urile simultan* )n loc de a
le modi(ica "entru (ie r3nd )n "arte+
5 )ncrcarea datelor )ntr2un ta/el inde!at "oate (i mai ra"id dac 0terge'i sau dez %a'i inde!urile )nainte de
)ncrcare 0i le reconstrui'i sau le reacti%a'i ulterior+
1ac dori'i s (olosi'i strategia de 0tergere sau dezacti%are a inde!urilor "entru ) carea datelor* "regti'i2% s
(ace'i unele e!"erimente* "entru a %edea dac merit* i )ncrca'i o cantitate mic de date )ntr2un ta/el mare*
construirea inde!urilor "oatel mai mult tim" dec3t )ncrcarea datelor+:
Pute'i 0terge si reconstrui inde!uri cu 1RFP ,A1EP si &RE;BE ,A1EP+ F metod alt ti% este de a dezacti%a
si reacti%a inde!urile (olosind myisamc=[ sau isamc=[+ metod % im"une s a%e'i un cont )n calculatorul gazd
al ser%erului MySQL 0i s i acces de scriere )n (i0ierele ta/elului+ Pentru a dezacti%a inde!urile unui ta/el*
catalogul adec%at al /azei de date 0i rula'i una din urmtoarele comenziD
Z myisamc=[ 22[eys2used0 nume_ta/el
Z isamc=[ 22[eys2used0 nume_ta/el 6olosi'i myisamc=[ "entru ta/elele MylS;M* care au un (i0ier inde! cu
e!tensia +< res"ecti% isamc=[ "entru ta/elele ,S;M* care au un (i0ier inde! cu e!tensia + ,SM+ )ncrcarea
ta/elului cu date* reacti%a'i inde!urileD
Z myisamc=[ 22reco%er 22Nuic[ 22[eys2usedn nume_ta/el
Z isamc=[ 22reco%er 22Nuic[ 22[eys2usedn nume_ta/el n este numrul de inde!uri "e care )l are ta/elul+ Pute'i
determina aceast %aloareO in%ocarea utilitarului adec%at cu o"'iunea 5 2descri"tionD %((-
Z myisamc=[ 22descri"tion nume_ta/el
Z isamc=[ 22descri"tion nume_ta/el
&a"itolul E F"timizarea interogrilor 2<<
1ac decide'i s (olosi'i dezacti%area 0i acti%area inde!urilor* tre/uie s (olosi'i "rotocolul de /locare "entru
re"ararea ta/elului* descris )n ca"itolul <G* H)ntre'inerea 0i re"ararea /azelor de date8* "entru a )m"iedica ser%erul
s modi(ice ta/elul )n acela0i tim" cu dumnea%oastr+ 91e (a"t nu re"ara'i ta/elul* dar )l modi(ica'i )ntr2o
manier similar cu "rocedura de re"arare a ta/elelor* deci este adec%at (olosirea aceluia0i "rotocol+:
Princi"iile "rezentate anterior de )ncrcare a datelor se a"lic 0i )n mediile cu interogri mi!te* care im"lic
clien'i ce e!ecut di(erite categorii de o"era'ii+ 1e e!em"lu* )n general dori'i s e%ita'i interogri SELE&B care
dureaz mult "e ta/ele care sunt actualizate (rec%ent+ ;st(el* rezult o com"eti'ie acer/ )ntre clien'ii care scriu
date si o "er(orman' redus a acestora+ F modalitate "osi/il de a e%ita aceast situa'ie* dac scrierile dum2
nea%oastr sunt )n ma4oritate o"era'ii ,ASERB* este de a aduga noi )nregistrri )ntr2un ta/el tem"orar 0i a"oi de
a aduga "eriodic acele )nregistrri )n ta/elul "rinci"al+ ;ceasta nu este o strategie %ia/il dac dori'i s o/'ine'i
acces imediat la noile )nregistrri* dar* dac % "ute'i "ermite s le lsa'i inaccesi/ile "entru o scurt "erioad de
tim"* utilizarea ta/elului tem"orar % %a (i de (olos din dou "uncte de %edere+ PrimulD reduce com"eti'ia )ntre
interogrile SELE&B care au loc asu"ra ta/elului "rinci"al* deci acestea se e!ecut mai ra"id+ ;, doileaD este
necesar un tim" total mai redus "entru )ncrcarea unui lot de )nregistrri din ta/elul tem"orar )n ta/elul "rinci"al
dec3t cel necesar "entru )ncrcarea indi%idual a )nregistrrilorV zona cac=e a inde!ului tre/uie s (ie golit
numai la (inalul (iecrui lot* nu du" (iecare r3nd )n "arte+
F a"lica'ie a acestei strategii este atunci c3nd consemna'i )n 4urnal numrul de desc=ideri al "aginii We/ din
ser%erul dumnea%oastr We/ )ntr2o /az de date MySQL+ )n acest caz* "ro/a/il c nu este (oarte im"ortant s %
asigura'i c intrrile a4ung imediat )n ta/elul "rinci"al+
F alt strategie "entru a reduce numrul de goliri ale zonei cac=e a inde!ului este de a (olosi o"'iunea de creare a
ta/elului 1EL;WE1_KEW_WR,BE "entru ta/elele MylS;M* dac datele dumnea%oastr sunt de a0a natur
)nc3t nu este a/solut esen'ial ca (iecare )nregistrare s (ie inserat )n cazul unei )nc=ideri anormale a sistemului+
9;ceast situa'ie "oate a"rea dac (olosi'i MySQL "entru consemnri )n 4urnale+: F"'iunea determin golirea
ocazional a zonei cac=e a inde!ului* nu du" (iecare inser'ie+
1ac dori'i s (olosi'i golirea )nt3rziat a zonei cac=e a inde!ului la ni%el de ser%er* lansa'i utilitarul mysNld cu
o"'iunea 22delayed2[ey2Mrite+ )n acest caz* scrierile )n /locul inde! sunt )nt3rziate "3n c3nd /locurile tre/uie
e%acuate "entru a (ace loc altor %alori ale inde!ului* "3n la e!ecu'ia unei comenzi ( lus=2ta/les sau "3n la
)nc=iderea ta/elului inde!at+
Pro/leme de "lani(icare si de /locare
Sec'iunile anterioare s2au concentrat mai ales asu"ra cre0terii %itezei interogrilor indi%iduale+ MySQL % mai
"ermite s modi(ica'i "riorit'ile de "lani(icare a e!ecu'iei instruc'iunilor* ceea ce "oate duce la o mai /un
cola/orare )ntre interogrile care "ro%in de U di(eri'i clien'i* ast(el )nc3t clien'ii indi%iduali s nu rm3n /loca'i
"entru o "erioad Prea lung de tim"+ 1e asemenea* modi(icarea "riorit'ilor "oate garanta (a"tul c anumite
categorii de interogri sunt "relucrate mai ra"id+ Lom e!amina mai )nt3i "olitica de
2<2 Partea l Utilizarea general a sistemului MySQL
"lani(icare "resta/ilit a sistemului MySQL 0i a"oi %om %edea care sunt o"'iunile* care le a%e'i la dis"ozi'ie
"entru in(luen'area acestei "olitici+ Pentru aceast e!"unere*. client care e!ecut o regsire 9o instruc'iune
SELE&B: este un client de citire+ Un cli'4 care e!ecut o o"era'ie care modi(ic un ta/el 9instruc'iunile 1ELEBE*
,ASERB* REPL sau UP1;BE: este un client de scriere+
)n esen'* "olitica de "lani(icare din MySQL "oate (i rezumat ast(elD
5 &ererile de scriere tre/uie s (ie "relucrate )n ordinea )n care sosesc+
5 Scrierile au o "rioritate mai mare dec3t citirile+
Politica de "lani(icare este im"lementat cu a4utorul /locrilor de ta/el+ 1e (iecare dl c3nd un client o/'ine
accesul la un ta/el* mai )nt3i este necesar "rocurarea unei /lo- "entru ta/elul res"ecti%+ Se "oate (ace acest lucru
)n mod e!"licit* cu a4utorul instruct nii LF&K B;JLES* dar )n mod normal utilitarul de gestionare a /locrilor
din ser "rocur automat /locrile* con(orm necesita'ilor+ &3nd clientul a terminat lucrul cu X ta/el* /locarea
ta/elului "oate (i eliminat+ F /locare o/'inut )n mod e!"licit este elii nat cu instruc'iunea UALF&K
B;JLES* dar 0i )n acest caz ser%erul eli/ereaz autoi /locrile "e care le2a o/'inut+
@+
Un client care e(ectueaz o o"era'ie de scriere tre/uie s dis"un de o /locare "e acces e!clusi% la ta/el+ Ba/elul
este )ntr2o stare nede(init )n tim"ul des(0urrii o"era( deoarece )nregistrrile de date sunt 0terse* adugate sau
modi(icate* iar toate inde din ta/el tre/uie actualizate "entru a re(lecta modi(icrile+ ; "ermite altor clien'i sV
acces la ta/el )n tim" ce acesta se a(l )n (lu! )nseamn a "ro%oca "ro/leme+ Este goric contraindicat a se "ermite
la doi clien'i s scrie )n ta/el )n acela0i tim"* deoar ast(el ta/elul s2ar deteriora ra"id* trans(orm3ndu2se )ntr2o
dezordine inutiliza/il+ - este recomandat nici citirea de ctre un client a unui ta/el a(lat )n (lu!* deoareceD
"osi/il ca ta/elul s se modi(ice e!act )n regiunea )n care este citit* ceea ce )nseamn- rezultatele ar (i incorecte+
Un client care e(ectueaz o o"era'ie de citire tre/uie s dis"un de o /locare* "entt )m"iedica "e al'i clien'i s
scrie )n ta/el* ast(el )nc3t ta/elul s nu se modi(ice )n este citit+ Botu0i* /locarea nu tre/uie s (urnizeze acces
e!clusi% "entru citire+ Jlc "oate "ermite citirea ta/elului de ctre al'i clien'i )n acela0i tim"+ Prin citire ta/eliy se
modi(ic* deci nu e!ist nici un moti% "entru care clien'ii de citire tre/uie )m"iedice reci"roc s o/'in acces la
ta/el+
MySQL % "ermite sa in(luen'a'i "olitica sa de "lani(icare "rin intermediul a nur modi(icatori de interogare+
Unul din ace0tia este cu%3ntul c=eie LFW_PR,FR,BW 9"ri"i redus: "entru instruc'iunile 1ELEBE* ,ASERB*
LF;1 1;B;* REPL;&E 0i UP1;BE+ Un altul cu%3ntul c=eie H,7H_PR,FR,BW 9"rioritate ridicat: "entru
instruc'iunile SELE&B* de2al treilea este cu%3ntul c=eie 1EL;WE1 9am3nat: "entru instruc'iunile ,AS
REPL;&E+
&u%3ntul c=eie LFW_PR,FR,BW in(luen'eaz "lani(icarea o"era'iilor du" cum urme mod normal* dac o
o"era'ie de scriere )ntr2un ta/el a4unge )n tim" ce ta/elul est clientul de scriere se /loc=eaz "3n c3nd clientul
de citire )0i termin e!ecu'ia d? o interogare* o dat "ornit* nu "oate (i )ntreru"t+ 1ac sose0te o alt cerere de
tim" ce clientul de scriere a0tea"t* se %a /loca 0i clientul de citire deoarece* conD
&a"itolul E F"timizarea interogrilor 2<G
"oliticii de "lani(icare "resta/ilite* clien'ii de scriere au "rioritate mai mare dec3t clien'ii de citire+ &3nd "rimul
client de citire 0i2a terminat e!ecu'ia* clientul de scriere )0i )nce"e e!ecu'ia* iar c3nd acesta din urm termin* al
doilea client de citire )0i )nce"e e!ecu'ia+
)n cazul )n care cererea de scriere este o cerere cu "rioritate redus* se consider c scrierea nu are o "rioritate
mai ridicat dec3t citirile+ ,n acest caz* dac o a doua cerere de citire sose0te )n tim" ce clientul de scriere
a0tea"t* al doilea client de citire este autorizat s treac )naintea clientului de scriere+ &lientul de scriere are
"ermisiunea de a continua numai atunci c3nd nu mai e!ist clien'i de citire+ F im"lica'ie a acestei modi(icri )n
"lani(icarea o"era'iilor este aceea c* teoretic* este "osi/il ca scrierile cu "rioritate redus s (ie /locate la in(init+
1ac sosesc noi cereri de citire c3nd cererile anterioare sunt )nc )n curs de des(0urare* noile cereri %or a%ea
"ermisiunea de a (i e!ecutate anterior scrierii cu "rioritate redus+
&u%3ntul c=eie H,7H_PR,FR,BW "entru interogrile SELE&B este similarV "ermite unei instruc'iuni SELE&B
s (ie e!ecutat anterior unei scrieri a(late )n a0te"tare* c=iar dac scrierea are "rioritate normal+
Modi(icatorul 1EL;WE1 "entru instruc'iunea ,ASERB se com"ort ast(elD atunci carid "entru un ta/el sose0te o
cerere ,ASERB 1EL;WE1* ser%erul a0az r3ndurile )ntr2o coad 0i returneaz imediat clientului o stare* ast(el
)nc3t clientul s20i "oat )nce"e e!ecu'ia c=iar )nainte de inser'ia r3ndurilor* )n cazul )n care clien'ii citesc din
ta/el* r3ndurile din coad sunt "strate+ &3nd nu mai e!ist clien'i de citire* ser%erul )nce"e s insereze r3ndurile
din coada cu r3nduri am3nate+ Fcazional* ser%erul (ace o "auz* "entru a %edea dac au sosit cereri de citire noi
0i dac acestea se a(l )n a0te"tare* )n acest caz* coada cu r3nduri am3nate este sus"endat 0i clien'ilor de citire li
se "ermite s20i )ncea" e!ecu'ia+ &3nd nu au mai rmas clien'i de citire* ser%erul re)nce"e s insereze r3ndurile
am3nate+ ;cest "roces continu "3n c3nd coada se gole0te+
Modi(icatorii de "lani(icare nu au a"rut )n MySQL to'i deodat+ Ba/elul urmtor "rezint ace0ti modi(icatori 0i
%ersiunea "rogramului MySQL )n care au a"rut+ Pute'i (olosi acest ta/el "entru a determina caracteristicile
%ersiunii dumnea%oastr de MySQL+
Bi"ul instruc'iunii
1ELEBE LFW_PR,FR,BW
,ASERB LFW_PR,FR,BW
,ASERB 1EL;WE1
LF;1 1;B; LFW_PR,FR,BW
LF&K B;JLES +++ LFW_PR,FR,BW
REPL;&E LFW_PR,FR,BW
REPL;&E 1EL;WE1
SELE&B +++ H,7H PR,FR,BW
UP1;BE LFW PR,FR,BW
SEB SQL LFW PR,FR,BW UP1;BES
Lersiunea "rimei a"ari'ii
G+22+Q
G+22+Q
G+22+<Q
G+2G+0
G+22+S
G+22+Q
G+22+<Q
G+22+R
G+22+Q
G+22+Q
2<E Partea l Utilizarea general a sistemului MySQL
E(ecte de margine "e "arte de client ale instruc'iunii ,ASERB 1EL;WE1
,nstruc'iunea ,ASERB 1EL;WE1 este util dac al'i clien'i ruleaz instruc'iuni SELE&B lungi 0i nu i s /loca'i
al'i clien'i )n a0te"tarea (inalizrii insertiei+ &lientul care emte instruc'iunea ,ASERB 1EL;W se "oate e!ecuta
mai ra"id* deoarece ser%erul "ur 0i sim"lu asaz la coad r3ndul care tre/uie in
Botu0i* tre/uie s cunoa0te'i 0i alte di(eren'e )ntre instruc'iunile ,ASERB normale 0i com"ortarea ir unii ,ASERB
1EL;WE1+ &lientul "rime0te o eroare dac instruc'iunea ,ASERB con'ine o eroare de i ta!* dar alte in(orma'ii
care erau dis"oni/ile )n mod normal nu mai sunt acum accesi/ile+ 1e e!em"lu*> %e'i "utea o/'ine %aloarea
;UBF_,A&REMEAB atunci c3nd instruc'iunea retumeaz+ 1e asemenea* 4 %e'i o/'ine un numr de du"licate al
%alorilor din inde!urile unice+ ;ceasta se )nt3m"l deoarece o"en de inser'ie retumeaz o stare )nainte de
(inalizarea e(ecti% a o"era'iei+ F alt im"lica'ie este aceeaOd dac r3ndurile din instruc'iunile ,ASERB
1EL;WE1 sunt "use la coad )n tim" ce a0tea"t s (ie i rate 0i ser%erul su(er o cdere sau este su"rimat 9cu
instruc'iunea [ill 2R:* r3ndurile se %or - ;cest (a"t nu este %ala/il "entru o su"rimare BERM normalV )n situa'ia
res"ecti%* ser%erul %a insera i durile )nainte de a20i )nc=eia e!ecu'ia+
F"timizare "entru administratori
Sec'iunile anterioare au descris o"timizri care "ot (i e(ectuate de ctre utiliza o/i0nui'i ai sistemului MySQL*
"ri%ind o"era'iile de creare 0i inde!are a ta/elelor* legate de interogri+ E!ist )ns si o"timizri care "ot (i
e(ectuate numai de ctre adr tratorii MySQL si de sistem* care de'in controlul asu"ra ser%erului MySQL sau
calculatorului "e care ruleaz acesta+ Unii "arametri ai ser%erului au o legtur dire "relucrarea interogrilor si
"ot (i a4usta'i* du" cum anumite as"ecte legate de con(igur com"onentelor =ardMare au un e(ect direct asu"ra
%itezei de "relucrare a interogrile
Parametrii ser%erului
Ser%erul are "arametri 9%aria/ile: generali "e care )i "ute'i modi(ica "entru a2i in(= modul de o"erare+ F
e!"unere general re(eritoare la a4ustarea "arametrilor ser%e este dat )n ca"itolul <<* H;dministrarea general a
sistemului MySQL8* dar o "ar'e4 ace0ti "arametri sunt corela'i mai ales cu "relucrarea interogrilor 0i merit o se
"rezentare )n acest cadruD
5 delayed_Nueue_size
;cest "arametru determin numrul de r3nduri din instruc'iunile ,ASERB 1Ei care %or (i stocate )n coad
anterior /locrii clien'ilor care e!ecut alte inst ,ASERB 1EL;WE1+ Mrirea acestei %alori "ermite ser%erului s
acce"te mai multe 44 duri de la acest ti" de cerere* ast(el )nc3t clien'ii s se "oat e!ecuta (r /locare* 4
5 [ey_/u((er_size
;ceasta este dimensiunea /u((erului (olosit "entru stocarea /locurilor de inde!* 4 dis"une'i de memoria necesar*
mrirea acestei %alori tre/uie s )m/unt'easc i %alul de tim" necesar "entru crearea si modi(icarea inde!ului+
Lalori mai ridicat acestui "arametru "ermit sistemului MySQL s stoc=eze )n memorie mai42Vi /locuri de inde!
simultan* ceea ce mre0te "ro/a/ilitatea de gsire a %alorilor c=(iS memorie* (r a (i necesar citirea unui /loc
nou de "e disc+ >
&a"itolul E F"timizarea interogrilor 2<Q
)n MySQL G+2G 0i )n %ersiunile ulterioare* dac mri'i dimensiunea /u((erului "entru stocarea c=eilor* "ute'i
"orni ser%erul (olosind o"'iunea 22init2(ile+ ;ceasta "ermite s"eci(icarea unui (i0ier de instruc'iuni SQL* care s
(ie e!ecutate la "ornirea ser%erului+ 1ac a%e'i ta/ele numai "entru citire "e care dori'i s le stoca'i )n memorie*
le "ute'i co"ia )n ta/ele HE;P* "entru a e!ecuta cutri (oarte ra"ide )n inde!+
;s"ecte legate de com"onentele =ardMare
Pentru )m/unt'irea "er(orman'elor ser%erului* % "ute'i (olosi com"onentele =ardMare )ntr2o manier mai
e(icientD
5 ,nstala'i o cantitate mai mare de memorie )n calculatorul dumnea%oastr+ ;ceasta % "ermite s mri'i
dimensiunile zonei cac=e 0i a /u((erelor din memoria ser%erului+ 1e asemenea* "ermite ser%erului s (oloseasc
mai (rec%ent in(orma'iile stocate )n memorie 0i s necesite mai "u'ine o"era'ii de "reluare a in(orma'iilor de "e
disc+
5 Recon(igura'i sistemul ast(el )nc3t s elimine toate dis"oziti%ele de sc=im/ de memorie cu discul* dac a%e'i o
cantitate de R;M su(icient "entru a e(ectua toate o"era'iile de sc=im/ )ntr2un sistem de (i0iere din memorie* )n
caz contrar* unele sisteme %or continua s H)m"rumute8 memorie de "e disc* c=iar dac a%e'i o cantitate
su(icient de memorie R;M "entru o"era'iile de sc=im/+
5 ;duga'i discuri mai ra"ide "entru a )m/unt'i laten'a ,CF+ )n mod caracteristic* tim"ul de cutare este
elementul =otr3tor "entru "er(orman' )n acest caz+ 1e"lasarea ca"etelor de citire )n lateral este o o"era'ie lentV
odat ca"etele "ozi'ionate* citirea /locurilor din a(ara "istei este* com"arati%* mai ra"id+
5 )ncerca'i s redistri/ui'i acti%itatea discului "e dis"oziti%e (izice+ 1e e!em"lu* dac % "ute'i stoca dou dintre
cele mai solicitate /aze de date ale dumnea%oastr "e unit'i (izice se"arate* "roceda'i )n acest sens+ Re'ine'i c
utilizarea a di(erite "arti'ii "e acela0i dis"oziti% (izic nu este su(icient+ ;cest lucru nu % %a (i de (olos* deoarece
"arti'iile %or continua s concureze "entru aceea0i resurs (izic 9)n s"e' ca"etele discului:+ Procedura "entru
mutarea /azelor de date este descris )n ca"itolul <0* H&atalogul de date MySQL8+
)nainte de a muta datele )ntr2un alt dis"oziti%* asigura'i2% c )n'elege'i caracteristicile de )ncrcare ale sistemului
dumnea%oastr+ 1ac o alt acti%itate im"ortant este de4a )n curs de des(0urare "e un anumit dis"oziti% (izic*
inser'ia unei /aze de date )n acel dis"oziti% nu ar (ace dec3t s )nrut'easc "er(orman'ele+ 1e e!em"lu* nu %e'i
o/'ine nici un a%anta4 glo/al dac "relucra'i o mare cantitate de tra(ic We/ 0i muta'i o /az de date )n
dis"oziti%ul unde este localizat ar/orele document al ser%erului dumnea%oastr We/+ 91ac dis"une'i numai de o
singur unitate* nu a%e'i cum s "roceda'i la o redistri/uire a acti%it'ii discului* desigur+:
5 &3nd construi'i MySQL* con(igura'i2< ast(el )nc3t s (oloseasc /i/lioteci statice* nu /i/lioteci "arta4ate+
6i0ierele /inare dinamice care (olosesc /i/liotecile "arta4ate determin economii de s"a'iu "e disc* dar (i0ierele
/inare statice sunt mai ra"ide+ 9Botu0i* nu "ute'i (olosi (i0iere /inare statice dac dori'i s )ncrca'i (unc'ii de(inite
de utilizator* deoarece mecanismul U16 se /azeaz "e legturi dinamice+:
JE>
@s $baSc@

P;RBE; ;2ll ;
Utilizarea inter(e'elor de "rogramare
ale sistemului MySQL
Q ,ntroducere )n "rogramarea MySQL
^ ,nter(a'a ;P, MySQL "entru &
T ,nter(a'a ;P, "entru Perl 1J,
S ,nter(a'a ;P, "entru PHP
&;P,BFLUL Q
,ntroducere )n "rogramarea MySQL
)n aceast "arte a cr'ii* %om discuta des"re ceea ce tre/uie s 0ti'i "entru a % scrie "r "riile dumnea%oastr
"rograme care o/'in accesul la /azele de date MySQL+ MyS& %ine cu un set de "rograme utilitare+ 1e e!em"lu*
mysNldum" e!"ort con'inutul de(ini'iile structurii ta/elelor* msNlim"ort )ncarc (i0ierele de date )n ta/ele*
mysNladm44 e!ecut o"era'ii administrati%e* iar mysNl % "ermite s interac'iona'i cu ser%erul "ent a e!ecuta
interogri ar/itrare+ 6iecare din utilitarele standard din MySQL este conce ca un "rogram mic* cu o anumit
(inalitate 0i cu o (unc'ie s"eci(ic* limitat+ ;cest luc este ade%rat c=iar 0i "entru mysNl* care este mai (le!i/il
dec3t celelalte utilitare* )n se sul c )l "ute'i (olosi "entru a e!ecuta orice numr de interogri di(eriteD este conce
cu sco"ul unic de a % "ermite s emite'i instruc'iuni SQL direct ctre ser%er 0i s< liza'i rezultatele+
;ceast natur limitat a clien'ilor MySQL nu este un nea4uns* ci deri% din "roiect Programele sunt utilitare de
uz generalV nu sunt menite a antici"a toate "osi/ilele cer "e care le "ute'i a%ea+ 1ez%oltatorii sistemului MySQL
nu sunt ade"'i ai "rinci"iului - a scrie "rograme imense* de dimensiuni e!cesi%e* care )ncearc s (ac orice a'i
"utea d#- s (ace'i 9s(3r0ind ast(el "rin a include mari cantit'i de "rogram "entru lucruri care i % intereseaz
c3tu0i de "u'in:+ &u toate acestea* uneori a"lica'iile au cerin'e care nu 4 (i rezol%ate "rin (unc'ionalit'ile
"rogramelor client standard+ Pentru a a/orda cazuri* MySQL (urnizeaz o /i/liotec de "rogramare a clien'ilor+
;ceasta % "ermit % scrie'i "ro"riile dumnea%oastr "rograme 0i % o(er (le!i/ilitatea de a satis(ace 5 cerin'ele
s"ecializate "e care a"lica'iile dumnea%oastr le2ar "utea a%ea+ F(erindu acces la ser%erul MySQL* /i/lioteca
client desc=ide "osi/ilit'i limitate numai de "ria dumnea%oastr imagina'ie+
&are sunt acele (unc'ionalit'i s"eci(ice "e care le "ute'i acumula scriindu2% "ro"l "rograme? S e!aminm
aceast )ntre/are com"arati% cu (unc'ionalit'ile clier mysNl 0i a inter(e'ei sale sim"le cu ser%erul MySQLD
5 Pute'i "ersonaliza metodele de mani"ulare a datelor de intrare+ &u mysNl* ii duce'i instruc'iuni SQL /rute+ &u
"ro"riile dumnea%oastr "rograme* "ute'i utilizatorului metode de introducere a datelor mai intuiti%e 0i mai u0or
de (oi Programul "oate elimina necesitatea ca utilizatorul s cunoasc lim/a4ul SQL 0i i "e aceea de a cunoa0te
rolul /azei de date )n o"era'ia care se e!ecut+
&olec'ia de date de intrare "oate (i ce%a rudimentar* ca un ciclu de citire a "rom( 0i a %alorilor introduse )ntr2o
inter(a' )n stil linie de comand* res"ecti% ce%a D cat* ca un (ormular de introducere a datelor /azat "e ecran*
im"lementat (olosir
&a"itolul Q ,ntroducere )n "rogramarea MySQL 2<R
"ac=et de gestiune a ecranului "recum curses sau S2Lang* un sistem P 9MindoM: care (olose0te BclCB[ sau un
(ormular dintr2un /roMser We/+
Pentru ma4oritatea utilizatorilor* s"eci(icarea "arametrilor de cutare este cu mult mai sim"l "rin com"letarea
unui (ormular dec3t "rin emiterea unei instruc'iuni SELE&B+ 1e e!em"lu* un agent imo/iliar care caut case
care se )ncadreaz )ntr2un anumit domeniu de "re'* construite )ntr2un anumit stil sau am"lasate )ntr2o anumit
loca'ie nu dore0te dec3t s introduc "arametrii de cutare )ntr2un (ormular si s "rimeasc o(ertele
cores"unztoare cu un minimum de deran4+ Pentru introducerea de noi )nregistrri sau actualizarea )nregistrrilor
e!istente* sunt %ala/ile considera'ii similare+ F dactilogra( dintr2un de"artament de introducere a datelor nu
tre/uie s cunoasc sinta!a SQL "entru instruc'iunile ,ASERB* REPL;&E sau UP1;BE+
Un moti% su"limentar "entru inter"unerea unui ni%el de colectare a datelor de intrare )ntre utilizatorul (inal si
ser%erul MySQL este acela c "ute'i %alida datele de intrare introduse de utilizator+ 1e e!em"lu* "ute'i %eri(ica
datele* "entru a % asigura c acestea cores"und (ormatului a0te"tat de MySQL* sau "ute'i im"une com"letarea
anumitor c3m"uri+
$ Pute'i "ersonaliza datele de ie0ire* )n esen'* datele de ie0ire ale "rogramului mysNl sunt ne(ormatateV "ute'i
alege un stil ta/ular 9sau delimitat "rin ta/ulatori:+ 1ac dori'i date de ie0ire )ntr2un (ormat mai estetic* tre/uie s
le (ormata'i dumnea%oastr "ersonal+ ;ceast (ormatare %ariaz )ntre o"era'ii sim"le 9cum ar (i a scrie
H,ne!istent8 )n loc de AULL: si "3n la cerin'e mai com"le!e de generare a ra"oartelor+ S lum )n considerare
urmtorul ra"ortD
Stat Fra0 L3nzri
;a Mesa P=oeni! REGSE*2E US1
<TG2S*2S US1
su/total <<TT<2*Q2 US1
&; Los ;ngeles
Fa[land
<<S<RS*<S US1
GSSGS*G^ US1
Su/total <QT0G^*QE US1
BFB;L 7EAER;L 2TETER*0^ US1
;cest ra"ort include numeroase elemente s"ecializateD
5 ;ntete "ersonalizate+
5 Eliminarea %alorilor care se re"et )n coloana Stat* ast(el )nc3t %alorile s (ie a(i0ate numai atunci c3nd se
modi(ic+
5 &alcule de su/total 0i total general+
5 6ormatarea numerelor* cum este REGSE*2E* ca %alori e!"rimate )n dolari* adic REGSE*2E US1+
Pentru unele categorii de sarcini* nici mcar nu a%e'i ne%oie de date de ie0ire+ Poate c "ur 0i sim"lu regsi'i
in(orma'ii "entru a calcula un rezultat "e care )l insera'i )ntr2un alt ta/el din /aza de date+ Poate c=iar dori'i ca
datele de ie0ire s a4ung )n alt "arte
220 Partea a ll2a Utilizarea inter(e'elor de "rogramare ale sistemului MySQL
dec3t la utilizatorul care ruleaz interogarea+ 1e e!em"lu* dac e!trage'i nume 0i adres' de e2mail "entru a
alimenta )n mod automat un "roces care genereaz scrisori ti" "en- tru mesa4e de e2mail )n cantit'i mari*
"rogramul dumnea%oastr "roduce date de ie0ir 1ar datele de ie0ire sunt alctuite din mesa4e care se de"laseaz
la destinatarii mesa4e de e2mail* nu la "ersoana care ruleaz "rogramul+
5 Pute'i e%ita restric'iile im"use de natura intrinsec a lim/a4ului SQL+ SQL nu i
un lim/a4 "rocedural* cu un set de structuri de control al (lu!ului* cum st condi'ionalele* ciclurile sau su/rutinele+
Scri"turile SQL sunt com"use dintr2un set # instruc'iuni care se e!ecut una c3te una* de la )nce"ut la s(3r0it* cu
o minim %er care a a"ari'iei erorilor+
1ac e!ecuta'i un (i0ier cu interogri SQL (olosind mysNl )n modul /atc=* mysNl (ie <<Q renun'a du" "rima
eroare* (ie 2 dac s"eci(ica'i o"'iunea 22(orce 2 e!ecut to3ts interogrile (r nici o discriminare* indi(erent de
numrul de erori care se "roduc+ "rogram "oate asigura controlul (lu!ului )n 4urul instruc'iunilor* ast(el )nc3t
duo"4 nea%oastr s % "ute'i ada"ta )n mod selecti% la starea de succes sau de e0e interogrilor+ Pute'i (ace
e!ecu'ia unei interogri inde"endent de reu0ita sau e0e alteia sau "ute'i lua decizii cu "ri%ire la urmtoarea
ac'iune )n (unc'ie de rezulta'' unei interogri anterioare+
SQL are o "ersisten' (oarte redus de2a lungul instruc'iunilor* (a"t care se mani(e 0i la mysNl+ Este di(icil
utilizarea rezultatelor unei interogri 0i a"licarea lor )ntr2o 4 interogare* res"ecti% coro/orarea rezultatelor mai
multor interogri+ 6unc L;SB_,ASERB_,19: se "oate (olosi "entru a o/'ine %aloarea ;UBF_,A&REMEAB cel
recent generat de o instruc'iune anterioar* dar cam asta e tot+++
Mai general* se "oate do%edi di(icil regsirea unui set de )nregistrri* urmat de Uzarea (iecreia ca /az "entru
o serie com"le! de alte o"era'ii+ 1e e!em"lu* regsii unei liste de clien'i si a"oi cutarea )ntr2un istoric detaliat
al creditului "entru (iec04 "ot im"lica mai multe interogri "entru (iecare client* )n anumite situa'ii* doritLii
"roduce'i o (actur "entru care tre/uie s asocia'i antetul (acturii cu in(orma'ii des"re client si des"re (iecare
articol comandat* mysNl nu este adec%at "entru ace categorii de o"era'ii* at3t deoarece a%e'i ne%oie de mai multe
interogri care de"ind rezultatele unor interogri anterioare* "recum si (iindc aceste o"era'ii de"0esc "e
/ilit'ile de (ormatare ale "rogramului mysNl+
)n general* "entru o"era'ii care im"lic rela'ii master2detaliu 0i care "rezint ce com"le!e de (ormatare a datelor
de ie0ire este ne%oie de un alt instrument dec3t my Un "rogram asigur liantul care coreleaz interogrile 0i care
% "ermite s (o[ datele de ie0ire ale unei interogri ca date de intrare "entru alta+
5 Pute'i integra MySQL )n orice a"lica'ie+ Multe "rograme )0i e!trag a%anta4ele ca"acitatea de a e!"loata
ca"acitatea unui sistem de /aze de date de a (urniza in(u ma'ii+ F a"lica'ie care tre/uie s %eri(ice un numr de
client sau s a(le dac un V mit articol se gse0te sau nu )n in%entar "oate e(ectua aceast o"era'ie "rin emit unei
interogri ra"ide+ F a"lica'ie We/ care "ermite unui client s solicite toate i scrise de un anumit autor le "oate
cuta "e acestea )ntr2o /az de date 0i a"oi "re ta rezultatele /roMserului clientului+
&a"itolul Q ,ntroducere )n "rogramarea MySQL 22<
Este "osi/il realizarea unui grad rudimentar de Hintegrare8 "rin utilizarea unui scri"t de inter"reter care in%oc
mysNl cu un (i0ier de intrare care con'ine instruc'iuni SQL* iar a"oi "rin "ost"rocesarea datelor de ie0ire (olosind
alte utilitare UA,P+ ;cest "rocedeu "oate de%eni neatracti%* "e msur ce o"era'ia dumnea%oastr "rogreseaz+
1e asemenea* "oate da o senza'ie de genul Hmerge* dar ce%a nu2i )n regul8 "e msur ce a"lica'ia e%olueaz
)ntr2o c3r"eal dezordonat+ 1e asemenea* su"rasarcina de creare de "roces a unui scri"t de inter"retor care
ruleaz alte comenzi "oate (i mai mare dec3t dori'i dumnea%oastr s o crea'i+ Poate (i mai e(icient s
interac'iona'i direct cu ser%erul MySQL* e!trg3nd e!act in(orma'iile de care a%e'i ne%oie "e msura nece2
sit'ilor* )n (iecare (az de e!ecu'ie a a"lica'iei dumnea%oastr+
)n ceea ce "ri%e0te /aza noastr de date demonstrati% sam"_d/ "e care am con(igurat2o )n ca"itolul l*
H,ntroducere )n MySQL si SQL8* am enumerat acolo numeroase deziderate care ne im"un s scriem "rograme
care s interac'ioneze cu ser%erul MySQL+ Unele din aceste deziderate sunt "rezentate )n urmtoarea listD
5 6ormatarea catalogului mem/rilor Ligii istorice )n %ederea ti"ririi
5 6acilitarea "rezentrii catalogului si a cutrii )n acesta din ,nternet
5 Brimiterea "rin e2mail a )n0tiin'rilor de "lat a cotiza'iei
5 ,ntroducerea cu u0urin' a "uncta4elor )n catalogul 0colar (olosind un /roMser We/
Un domeniu "e care )l %om trata )n detaliu )l constituie integrarea (unc'ionalit'ilor sistemului MySQL )ntr2un
mediu We/+ MySQL nu (urnizeaz su"ort direct "entru a"lica'ii We/ dar* "rin com/inarea acestuia cu
instrumentele adec%ate* /azele dumnea%oastr de date %or de%eni u0or accesi/ile "rin We/+ Pute'i s"eci(ica
interogri (olosind ser%erul dumnea%oastr de We/ 0i "ute'i ra"orta rezultatele /roMserului unui client+
E!ist dou "ers"ecti%e com"lementare ale Hcsniciei8 )ntre MySQL 0i We/D
5 ,nteresul dumnea%oastr "rimordial este /aza de date* iar dumnea%oastr dori'i s (olosi'i We/2ul ca instrument
"entru o/'inerea unui acces mai u0or la date+ Locul unui sistem de /aze de date )ntr2un atare scenariu este
e!"licit 0i e%ident* deoarece este "unctul (ocal al interesului dumnea%oastr+ 1e e!em"lu* "ute'i scrie "agini We/
care % "ermit s %ede'i care sunt ta/elele "e care le con'ine /aza dumnea%oastr de date* care este structura
(iecrui ta/el 0i care este con'inutul acestuia+ Ser%erul We/ )l (olosi'i "entru a )m/unt'i accesul la MySQL+
;cesta este "unctul de %edere "ro/a/il al unui administrator MySQL+
5 ,nteresul dumnea%oastr (undamental "oate (i situl We/* 0i "ute'i dori s (olosi'i MySQL ca instrument "entru a
s"ori %aloarea con'inutului sitului dumnea%oastr "entru "ersoanele care )l %iziteaz+ 1e e!em"lu* dac rula'i un
a%izier electronic sau o list de discu'ii "entru %izitatorii sitului* "ute'i (olosi MySQL "entru a 'ine e%iden'a
mesa4elor* )n acest caz* rolul sistemului de /aze de date este mai su/til si este "osi/il c=iar ca %izitatorii s nu2si
dea seama c acesta este angrenat )n ser%iciile "e care le o(eri'i+ 6olosi'i MySQL "entru a e!tinde
(unc'ionalit'ile ser%erului dumnea%oastr de We/+ ;cesta este* "ro/a/il* "unctul de %edere al dez%oltatorului
unui sit We/+
;ceste "ers"ecti%e nu sunt mutual e!clusi%e+ 1e e!em"lu* )n scenariul care im"lic Liga istoric* dorim s
(olosim We/2ul ca mi4loc "entru ca mem/rii s o/'in un acces ra"id la con'inutul catalogului cu mem/ri*
"un3nd ru/ricile catalogului la dis"ozi'ie "rin ,nternet+
222 Partea a ll2a Utilizarea inter(e'elor de "rogramare ale sistemului MySQL
;ceasta constituie o utilizare a We/2ului "entru (urnizarea accesului la /aza de date+. acela0i tim"* situl We/ al
Ligii este oarecum Hsu/dez%oltat8* deci inser'ia )n cadrul sitult a con'inutului catalogului mre0te %aloarea sitului
)n oc=ii mem/rilor+ ;ceasta este o uti( lizare a sistemului de /aze de date "entru e!tinderea ser%iciilor (urnizate
de sit+
,ndi(erent de modul )n care %ede'i integrarea sistemului MySQL cu We/2ul* im"leme tarea este similar+
&onecta'i inter(a'a 0icului dumnea%oastr We/ la com"onenta end MySQL* (olosind ser%erul We/ ca
intermediar+ Ser%erul We/ trimite o interogare # la utilizator ctre ser%erul MySQL* regse0te rezultatele
interogrii si a"oi le transmit clientului )n %ederea %izualizrii )ntr2un /roMser+
Au dori'i s % "une'i datele )n re'ea* desigur* dar uneori aceast o"era'ie )0i are a%anta4e sale* mai ales )n
com"ara'ie cu accesul la datele dumnea%oastr "rin intermediul "r gramelor client MySQL standardD
5 Persoanele care o/'in accesul la datele dumnea%oastr "rin intermediul We/2ului (olosi /roMserul "e care )l
"re(er* "e ti"ul de "lat(orm "e care )l "re(er+ Aimeni nu # o/ligat s (oloseasc numai sistemele "e care "ot
rula "rogramele client MySQL+8+ di(erent de aria de aco"erire a clien'ilor MySQL* /roMserele We/ sunt si mai
rs"3
5 Utilizarea unei inter(e'e We/ "oate de%eni mai sim"l dec3t un client autonc MySQL )n linie de comand+
5 F inter(a' We/ "oate (i "ersonalizat con(orm cerin'elor unei anumite a"lic &lien'ii MySQL sunt instrumente
de uz general* cu inter(a' (i!+
5 Paginile We/ dinamice e!tind "osi/ilit'ile sistemului MySQL de a e(ectua o"er care sunt di(icil sau im"osi/il
de realizat (olosind clien'ii MySQL+ 1e e!em"lud l "ute'i asam/la o a"lica'ie care )ncor"oreaz un Hcrucior de
cum"rturi8 electrc (olosind numai clien'i MySQL+
Pentru scrierea a"lica'iilor /azate "e We/ se "oate (olosi orice lim/a4 de "rogramare* @# unele sunt mai adec%ate
dec3t altele+ Lom %edea acest lucru )n sec'iunea H;legerea i inter(e'e de "rogramare a a"lica'iilor8+
,nter(e'e de "rogramare a a"lica'iilor 9;P,: dis"oni/ile "entru MySQL
Pentru (acilitarea dez%oltrii a"lica'iilor* MySQL (urnizeaz o /i/liotec client* scris4 lim/a4ul de "rogramare &*
care % "ermite s o/'ine'i accesul la /azele de date M: din interiorul oricrui "rogram scris )n &+ Ji/lioteca
client im"lementeaz o inter(a' "rogramare a a"lica'iilor 9;P,: care de(ine0te modul )n care "rogramele client
sta/'4 0i deruleaz comunica'iile cu ser%erul+
Botu0i* nu sunte'i o/ligat s (olosi'i numai lim/a4ul & "entru a scrie "rograme M$ Multe alte "rocesoare de
lim/a4 sunt (ie scrise )n &* (ie au ca"acitatea de a (olosi teci &* deci /i/lioteca client MySQL (urnizeaz
mi4loacele "rin care asocierile My "entru aceste lim/a4e "ot (i construite "e /aza inter(e'ei ;P, "entru &+ ;ceast
(a % o(er numeroase o"'iuni "entru scrierea a"lica'iilor care Hdiscut8 cu se MySQL+ ,nter(e'e ;P, client e!ist
"entru Perl* PHP* Xa%a* Pyt=on* &YY* Bel 0i*V
&a"itolul Q ,ntroducere )n "rogramarea MySQL 22G
&uta'i )n manualul de re(erin' MySQL sau )n situl We/ MySQL o list actualizat* deoarece ocazional sunt
adugate noi inter(e'e ;P, de lim/a4+
6iecare asociere de lim/a4 )0i de(ine0te "ro"ria sa inter(a'* care s"eci(ic regulile de acces la MySQL+ S"a'iul nu
ne "ermite s discutm des"re (iecare din inter(e'ele ;P, dis"oni/ile "entru MySQL* deci ne %om concentra
asu"ra a trei dintre cele mai "o"ulareD
5 ,nter(a'a ;P, a /i/liotecii client )n &+ ;ceasta este "rinci"ala inter(a' de "rogramare cu MySQL+
5 ,nter(a'a ;P, 1J, 91ata/ase ,nter(ace: "entru lim/a4ul de scri"ting de uz general Perl+ 1J, este im"lementat
ca un modul Perl* care inter(a'eaz cu alte module la ni%elul 1J1 91ata/ase 1ri%er:* (iecare modul (urniz3nd
acces la un anumit ti" de motor "entru /aze de date+ 9Modulul 1J1 "articular asu"ra cruia ne %om concentra
este cel care (urnizeaz su"ort "entru MySQL* desigur+: &ele mai comune utilizri ale 1J, "entru MySQL sunt
scrierea de clien'i autonomi care sunt in%oca'i de la linia de comand* "recum 0i de scri"turi destinate a (i
in%ocate de un ser%er We/ "entru a (urniza acces din We/ la MySQL+
5 ,nter(a'a ;P, "entru PHP+ PHP este un lim/a4 de scri"ting care (urnizeaz o modalitate con%ena/il de
)nglo/are a "rogramelor )n "aginile We/+ F asemenea "agin este "relucrat de PHP )nainte de a (i trimis
clientului* ceea ce "ermite scri"tului s genereze un con'inut dinamic* cum ar (i includerea )n "agin a
rezultatului unei interogri MySQL+ ,ni'ial* PHP a%ea semni(ica'ia 8Personal Home Page8 9"agin de /az
"ersonal:* dar acest lim/a4 s2a dez%oltat mult dincolo de umilele sale )nce"uturi+ Situl We/ PHP (olose0te acum
numele )n conte!tul 8PHPD Hy"erte!t Pre"rocessor8* care (ace re(erire la sine )nsu0i )n aceea0i manier ca 0i
7AU 987AUOs Aot UA,P8: 97AU nu este UA,P:+
&onstrui'i "ornind de la rezultatele muncii altora
&3nd clien'ii MySQL standard sunt insu(icien'i "entru necesit'ile dumnea%oastr* nu este necesar )ntotdeauna s
% scrie'i "ro"riile "rograme+ ;l'ii s2au ocu"at de4a cu scrierea unor "rograme* din care multe sunt dis"oni/ile
gratuit+ Lezi ;ne!a l* H,nstrumente utile "roduse de ter'e "r'i8* "entru unele e!em"le+ Este "osi/il s gsi'i
c3te%a care s % scuteasc de ce%a munc+
6iecare din aceste trei inter(e'e ;P, este "rezentat )n detaliu )n "ro"riul su ca"itol+ &a"itolul de (a' con'ine o
trecere )n re%ist com"arati% a inter(e'elor ;P,* "entru a descrie caracteristicile generale ale acestora 0i "entru a
% o(eri o idee "ri%ind alegerea uneia )n dauna alteia "entru o anumit a"lica'ie+
1esigur* nu a%e'i nici un moti% s % considera'i H)n'e"enit8 )ntr2o singur inter(a' ;P,+ )n%'a'i s cunoa0te'i
(iecare inter(a' si )narma'i2% cu acele cuno0tin'e care % "ermit s (ace'i o alegere )n'elea"t+ 1ac a%e'i un
"roiect de mari dimensiuni* cu numeroase com"onente* "ute'i (olosi mai multe inter(e'e ;P, 0i "ute'i scrie unele
com"onente )ntr2un lim/a4 si alte com"onente )ntr2un alt lim/a4* )n (unc'ie de alegerea cea mai adec%at "entru
=ecare "arte a "roiectului+ 1e asemenea* este instructi% s im"lementa'i o a"lica'ie )n mai multe moduri* dac
tim"ul % "ermite+ ;st(el* c"ta'i o e!"erien' direct )n utilizarea di(eritelor inter(e'e ;P,* "e msur ce acestea
se a"lic "ro"riilor dumnea%oastr a"lica'ii+
22E Partea a ll2a Utilizarea inter(e'elor de "rogramare ale sistemului MySQL
1ac tre/uie s % "rocura'i "rogramele necesare "entru utilizarea oricreia dintre intei (e'ele ;P, "e care dori'i
s le )ncerca'i* consulta'i ;ne!a ;* HF/'inerea si instalarea "i gramelor8* "entru a "rimi instruc'iuni+
G
,nter(a'a ;P, "entru &
,nter(a'a ;P, "entru & este (olosit )n conte!tul "rogramelor & com"ilate+ ;ceasta e0 o /i/liotec client care
(urnizeaz inter(a'a de ni%elul cel mai redus dis"oni/il "e=l` comunicarea cu ser%erul MySQL* o(erindu2%
(unc'ionalit'ile de care a%e'i ne%oie "e sta/ilirea unei cone!iuni cu ser%erul si con%ersa'ia cu acesta+
Predecesorii 1J, si PHP
Predecesorul Peri al 1J, este modulul MysNl"erl* 0i anume MysNl+ "m+ ;cest modul nu mai este ac tat 0i nu
tre/uie (olosit "entru dez%oltarea noilor "rograme MySQL Un moti% este acela c MysNl"erl # de"endent de
MySQL* )n tim" ce 1J, nu este+ 1ac scrie'i a"lica'ii Peri "entru MySQL 0i a"oi % i c dori'i s le (olosi'i cu
un alt motor "entru /aze de date* "ortarea scri"turilor 1J, este mai sim"l # aceea a scri"turilor MysNl"erl*
deoarece "rimele sunt mai "u'in de"endente de un anumit motor de4 de date+
1ac % "rocura'i un scri"t Perl "entru accesul la MySQL 0i desco"eri'i c* )n loc de a (i scris "entru 4 este scris
"entru MysNl"erl* "ute'i totu0i s (olosi'i 1J,+ 1J, "oate (i construit ast(el )nc3t s includ s de emulare "entru
MysNl"erl* deci nu este necesar s instala'i am/ele "ac=ete+
Predecesorul lui PHP G este PHPC6, 2+0 96, este a/re%ierea de la (orm inter"reter 2 inter"reter de < lare:+ &a 0i
MysNl"erl* PHPC6, este de"0it 0i nu %om mai discuta des"re el+ %'
Friginea inter(e'ei ;P, )n & cu MySQL
1ac a%e'i e!"erien' )n scrierea de "rograme "entru sistemul de gestiune a /azelor de date reia mSQL* %e'i
o/ser%a c inter(a'a ;P, )n & "entru MySQL este similar cu inter(a'a ;P, )n & cores toare "entru mSQL+ &3nd
dez%oltatorii MySQL au )nce"ut s20i im"lementeze motorul SQL "ro"riii> tru mSQL erau dis"oni/ile un numr
de utilitare gratuite+ Pentru a (ace "osi/il "ortarea acelor i mSQL ctre MySQL cu minimum de di(icultate*
inter(a'a ;P, MySQL a (ost "roiectat inten'ionat 9 )nc3t s (ie similar cu inter(a'a ;P, "entru mSQL+ 9MySQL
este c=iar dotat cu un scri"t msN.2n care e!ecut su/stitu'ii te!tuale sim"le al numelor de (unc'ii din inter(a'a
;P: "entru mSQL )n MySQL cores"unztoare+ ;ceast o"era'ie este relati% sim"l* dar e!ecut o /un "arte din
ac im"us de con%ersia unui "rogram mSQL )n %ederea utilizrii cu MySQL+:
&lien'ii & (urniza'i )n distri/u'ia MySQL sunt /aza'i "e aceast inter(a' ;P,+ XXi teca client & mai ser%e0te 0i
dre"t /az "entru asocierile MySQL cu alte lim/ai e!ce"'ia inter(e'elor ;P, "entru Xa%a+ 1e e!em"lu* dri%erul
s"eci(ic MySQL modulul Perl 1J, si "rogramul PHP au de%enit am/ele com"ati/ile cu MySQeM legarea
codului "entru /i/lioteca client )n & "entru MySQL+ 9;cest "roces este ilu- )n instruc'iunile de instalare a
modulelor 1J, 0i PHP din ;ne!a ;+:
,nter(a'a ;P, "entru modulul Perl 1J,
,nter(a'a ;P, "entru 1J, este (olosit )n conte!tul a"lica'iilor scrise "entru lim/d scri"ting Perl+ ;ceasta este
inter(a'a care con'ine ar=itectura "e cele mai multe eta4e]4 cele trei inter(e'e ;P, des"re care %om discuta*
deoarece )ncearc s lucreze cu uriOi
&a"itolul Q ,ntroducere )n "rogramarea MySQL 22Q
de sisteme de /aze de date c3t mai mare "osi/il* ascunz3nd )n acela0i tim" generatorului de scri"turi c3t mai
multe detalii s"eci(ice+
1J, este im"lementat "rin intermediul modulelor Perl care (olosesc o ar=itectur cu dou ni%eluri 9%ezi (igura
Q+<:D
5 Ai%elul 1J, 9inter(a' cu /aza de date:+ 6urnizeaz inter(a'a "entru scri"turi client+ ;cest ni%el (urnizeaz o
a/stractizare care nu (ace re(erire la motoare "entru /aze de date s"eci(ice+
5 Ai%elul 1J1 9dri%er "entru /aze de date:+ La acest ni%el este (urnizat un su"ort "entru di(erite motoare de /aze
de date* de ctre dri%ere care sunt s"eci(ice (iecrui motor de /aze de date+
Ai%el de a"lica'ieV
Scri"t Perl
]d/= 1J,2$connect 981J,DmSQLD+
+Usau+++
]d/= 1J,2$connect 981J,DmysNlD
+++sau+++
]d/= 1J,2$connect 981J,DPgD+++
Ai%el
de inter(a' cu /aza de dateV
Ai%elul dri%erului
"entru /aze
de date
Ai%elul
S7J1R i_________
6igura Q+< ;r=itectura 1J,+
Su"ortul MySQL "entru 1J, este (urnizat de ctre distri/u'ia MsNl2MysNl2modules+ ;cest modul o"ereaz la
ni%elul 1J1+ 1u" cum "ute'i intui din numele distri/u'iei 0i de asemenea din (igura Q+<* este "osi/il ca un
dri%er s (urnizeze su"ort "entru mai multe sisteme de gestiune a /azelor de date rela'ionale+ ,ni'ial* distri/u'ia
MsNl2MysNl2modules lusese scris "entru mSQL* a"oi e!tins ulterior 0i "entru MySQL+ ;cest (a"t re(lecta
asemnrile dintre inter(e'ele ;P, scrise )n & "entru mSQL 0i MySQL+ 1in moment ce inter(a'a ;P, scris )n &
"entru MySQL a (ost "roiectat asemntor cu inter(a'a ;P, )n & "entru mSQL* era logic s se e!tind dri%erul
"entru /aze de date mSQL 9care (olose0te inter(a'a ;P, "entru mSQL scris )n &: ast(el )nc3t acesta s lucreze cu
MySQL+
;r=itectura 1J, % "ermite s scrie'i a"lica'ii )ntr2o manier relati% general+ &3nd scrie'i un scri"t 1J,* (olosi'i
un set standard de a"eluri+ Stratul 1J, in%oc dri%erul adec%at de la ni%elul 1J1 "entru rezol%area cerin'elor
dumnea%oastr* iar dri%erul se ocu" de as"ectele s"eci(ice ale comunicrii cu ser%erul s"eci(ic de /aze de date
"e care
22^ Partea a ll2a Utilizarea inter(e'elor de "rogramare ale sistemului MySQL
dori'i s2< (olosi'i+ Ai%elul 1J1 transmite datele returnate de ser%er )na"oi ctre ni%el- 1J,* care "rezint datele
a"lica'iei dumnea%oastr+ 6orma datelor este consec%en> indi(erent de sistemul de /aze de date din care au
"ro%enit datele+
Rezultatul este o inter(a' care* din "unctul de %edere al creatorului a"lica'iei* ase di(eren'ele )ntre motoarele de
/aze de date* dar lucreaz cu o mare %arietate de motoa cu un numr egal cu acela al dri%erelor+ 1J, asigur o
inter(a' consec%ent cu client care mre0te "orta/ilitatea "ermi'3ndu2% s o/'ine'i accesul la (iecare /az de
date )nt manier uni(orm+
Singurul as"ect al redactrii scri"turilor care este )n mod o/ligatoriu s"eci(ic /azei de # a"are la desc=iderea unei
/aze de date+ &3nd sta/ili'i cone!iunea* indica'i dri%erul "e i )l (olosi'i+ 1e e!em"lu* "entru a (olosi o /az de
date MySQL* % conecta'i ast(elD
]d/= 1J,2$connect 981J,DmysNlD+++8:V Pentru a (olosi )n sc=im/ Postgres sau mSQL* % conecta'i ast(elD
]d/= 1J,2$connect 981J,DPgD+++8:V
]d/= 1J,2$connect 981J,DmSQLD+++8:V 1u" ce a'i sta/ilit cone!iunea* nu tre/uie s mai (ace'i nici o re(erire
s"eci(ic la driy* Lsa'i rezol%area detaliilor s"eci(ice /azelor de date )n seama modulului 1J, 0i a dri%er
;0a stau lucrurile* cel "u'in teoretic+ Botu0i* e!ist cel "u'in doi (actori care su/mine "orta/ilitatea scri"turilor
1J,D
5 ,m"lementrile SQL di(er )ntre motoarele S7J1R 0i este "er(ect "osi/il s se "entru un motor "rograme SQL
"e care alt motor nu le "oate )n'elege+ 1ac "rc mul dumnea%oastr SQL este su(icient de general* scri"turile
dumnea%oastr %or i mod cores"unztor* "orta/ile de la un motor la altul+ 1ac "rogramul dumneab tr SQL este
de"endent de motor* scri"turile %or (i de asemenea de"endente de mol 1e e!em"lu* dac (olosi'i instruc'iunea
SHFW B;JLES s"eci(ic sistemului MyS& scri"tul dumnea%oastr nu %a (unc'iona cu alte sisteme de /aze de
date+
5 Modulele 1J1 (urnizeaz deseori ti"uri de in(orma'ii s"eci(ice di(eritelor motoare* \ tru a "ermite creatorilor
de scri"turi s (oloseasc anumite caracteristici ale sistemeloi /aze de date+ 1e e!em"lu* modulul 1J1 "entru
MySQL asigur o modalitate deV la "ro"riet'ile coloanelor "rin rezultatul unei interogri* "recum lungimea m
(iecrei coloane* caracterul numeric sau ne2numeric al coloanelor etc+ ;ceste "ro"r nu tre/uie s ai/ %reun
analog )n alte sisteme de /aze de date+ &aracteristicile s"e modulului 1J1 sunt antitetice )n ra"ort cu
"orta/ilitatea* iar "rin utilizarea )ngreunat utilizarea )n alte sisteme de /aze de date a unui scri"t scris "entru
MyS&
)n ciuda "oten'ialului acestor doi (actori de a (ace din scri"turile dumnea%oastr ele s"eci(ice sistemelor de /aze
de date* mecanismul 1J, "entru (urnizarea acces /azele de date )ntr2o manier a/stract re"rezint un mi4loc
rezona/il de rea "orta/ilit'ii+ Este la latitudinea dumnea%oastr s decide'i )n ce msur dori'i s l (icia'i de
acest a%anta4+
< &u toate acestea* %e'i desco"eri c )n ca"itolul T* H,nter(a'a ;P, "entru Perl 1J,8* nu se D multe e(orturi "entru
a e%ita construc'iile s"eci(ice sistemului MySQL (urnizate de moduluA "entru MySQL+ ;ceasta deoarece tre/uie
s 0ti'i ce anume re"rezint construc'iile res"ecti%e* 4 a decide "ersonal dac le %e'i (olosi sau nu+ 2 A+;+
&a"itolul Q ,ntroducere )n "rogramarea MySQL
22T
,nter(a'a ;P, "entru PHP
&a 0i Perl* PHP este un lim/a4 de scri"ting+ S"re deose/ire de Perl* PHP este conce"ut )n mai mic msur ca
lim/a4 de uz general dec3t ca lim/a4 "entru scrierea a"lica'iilor We/+ ,nter(a'a ;P, "entru PHP este (olosit mai
ales ca mi4loc "entru )nglo/area scri"turilor e!ecuta/ile )n "aginile We/+ ;cest (a"t (aciliteaz dez%oltatorilor
We/ scrierea de "agini cu un con'inut generat dinamic+ &3nd un /roMser client trimite o cerere de "agin PHP
unui ser%er We/* PHP e!ecut toate scri"turile "e care le gse0te )n "agin 0i le )nlocuie0te cu datele de ie0ire ale
acestora+ Rezultatul este trimis /roMserului+ 1in acest moti%* "agina care a"are e(ecti% )n /roMser di(er )n
(unc'ie de circumstan'ele )n care a (ost solicitat+ 1e e!em"lu* c3nd urmtorul scri"t PHP scurt este )nglo/at )ntr2
o "agin We/* a(i0eaz adresa ,P a gazdei care a solicitat "aginaD
#?"=" ec=o ]REMFBE_;11RV 2?$
&a o a"lica'ie mai interesant si mai "u'in /anal* "ute'i (olosi un scri"t "entru a (urniza %izitatorilor in(orma'ii
de ultim moment* /azate "e con'inutul /azei dumnea%oastr de date+ E!em"lul urmtor "rezint un scri"t
sim"lu* cum este cel care ar "utea (i (olosit )n situl We/ al Ligii istorice+ Scri"tul emite o interogare "entru a
determina numrul curent de mem/ri ai Ligii 0i )l ra"orteaz "ersoanei care %iziteaz situl 9)n cazul "roducerii
unei erori* scri"tul "ur si sim"lu nu ra"orteaz nici un numr+:D
#HBML$
#HE;1$
#B,BLE$Liga istorica americana#CB,BLE$
#CHE;1$
#JF1W$
Semni(ica'ia a/re%ierilor 1J, 0i 1J1
1e0i ni%elul 1J, este inde"endent de sistemul de /aze de date* iar ni%elul 1J1 este de"endent de acest sistem*
nu aceasta este semni(ica'ia a/re%ierilor 1J,* res"ecti% 1J12+ Sensul lor este 8data/ase inter(ace8 9inter(a' cu
/aza de date:* res"ecti% 8data/ase dri%e( 9dri%er "entru /aze de date:+
#P$Jine a'i %enit la situl We/ al Ligii istorice+
#?"="
]lin[ fmysNl_"connect 98"it2%i"er+sna[e+net8* 8"aul<
or e!it9:V mysNl_select_d/ 98sam"_d/8:
or e!it9:V Sresult mysNl_Nuery 98SELE&B &FUAB9@: 6RFM mem/ru8:
or e!it9:V i( 9]roM mysNl_(etc=_array 9]result::
ec=o 8#P$,n "rezent* Liga are 8 + ]roMg0\ + 8 mem/ri mysNl_(ree_result 9]result:V ?$ #CJF1W$#CHBML$
secret8:
,n sensul c 1J, se mai "oate a/re%ia 9eronat: su/ (orma data/ase inde"endent 9inde"endent de sistemul de /aze
de date:* iar 1J1 se "oate inter"reta 9tot eronat: su/ (orma data/ase de"endent 9de"endent de sistemul de /aze
de date: 2 A+B+
22S Partea a ll2a Utilizarea inter(e'elor de "rogramare ale sistemului MySQL
)n mod caracteristic* scri"turile PHP arat ca "agini HBML cu scri"turi )nglo/ate )n' etic=etele #?"=" 0i ?$+ F
"agin "oate con'ine mai multe scri"turi+ ;cest "roced- (urnizeaz o a/ordare e!trem de (le!i/il "entru
dez%oltarea scri"turilor+ 1e e!em" dac dori'i* "ute'i scrie o "agin HBML normal "entru a construi cadrul
generalO "aginii* du" care aduga'i mai t3rziu con'inutul de scri"turi al "aginii+
PHP nu (ace nici un e(ort de a uni(ica inter(a'a cu di(erite motoare de /aze de date*V cum "rocedeaz 1J,+ )n
sc=im/* inter(a'a cu (iecare motor seamn (oarte mult l inter(a'a "entru /i/lioteca & cores"unztoare care
im"lementeaz inter(a'a ;P, de sczut "entru motorul res"ecti%+ 1e e!em"lu* numele (unc'iilor PHP "e care le
(olc "entru a o/'ine acces la MySQL din interiorul scri"turilor PHP sunt (oarte asemna toare cu numele
(unc'iilor din /i/lioteca client & "entru MySQL+
;legerea unei inter(e'e de "rogramare a a"lica'iilor
;ceast sec'iune con'ine )ndrumri de ordin general* "entru a % a4uta s alege'i o in' (a' ;P, "entru di(eritele
ti"uri de a"lica'ii+ Sunt com"arate (unc'ionalit'ile inter(e' ;P, "entru &* 1J, 0i PHP* "entru a % o(eri o idee cu
"ri%ire la a%anta4ele 0i deza%. ta4ele lor relati%e* "recum 0i "entru a indica momentul o"ortun al alegerii uneia sau
alteia dintre inter(e'e+
Pro/a/il c ar tre/ui s art* mai )nt3i* c nu "ledez "entru utilizarea %reunuia din'i aceste lim/a4e )n detrimentul
altora+ Le (olosesc "e toate* de0i am "re(erin'ele mele@- dumnea%oastr %e'i a%ea "ro"riile "re(erin'e* a0a cum le
au si cei care au e!aminatD nuscrisul acestei cr'i+ 1e (a"t* unul dintre recenzori a (ost de "rere c ar tre/ui s 4
un accent mai mare "e im"ortan'a lim/a4ului & "entru "rogramarea )n MySQL* )n i ce altul credea c ar (i cazul
s critic zdra%n "rogramarea )n & 0i s descura4ez utiliz acestui lim/a4. La tre/ui s c3ntri'i (actorii discuta'i )n
aceast sec'iune si s a4unge4 "ro"riile dumnea%oastr concluzii+
)n alegerea dumnea%oastr "ri%ind inter(a'a ;P, de selectat "entru )nde"linirea anumite sarcini tre/uie s 'ine'i
cont de un numr de considera'iiD
5 Mediul de e!ecu'ie scontat+ &onte!tul )n care % a0te"ta'i s (ie (olosit a"lica'iaV-
5 Per(orman'e+ E(icien'a derulrii a"lica'iilor atunci c3nd sunt scrise )n lim/a4ul ir (e'ei ;P,+
5 Sim"litatea dez%oltrii+ U0urin'a scrierii a"lica'iilor determinat de inter(a'a de lim/a4ul a(erent acesteia+
5 Porta/ilitate+ 1ac a"lica'ia se %a (olosi sau nu "entru sisteme de /aze de date V dec3t MySQL+ 2
6iecare din ace0ti (actori %a (i e!aminat "e larg )n e!"unerea urmtoare+ Re'ine'i ci (actori interac'ioneaz+ 1e
e!em"lu* "ute'i dori o a"lica'ie care se des(0oar /in> la (el de im"ortant "oate (i utilizarea unui lim/a4 care %
"ermite s dez%olta'i a"lica'ia* c=iar dac nu se deruleaz at3t de e(icient+
&a"itolul Q ,ntroducere )n "rogramarea MySQL
22R
Mediul de e!ecu'ie
&3nd scrie'i o a"lica'ie* )n general a%e'i o oarecare idee cu "ri%ire la mediul )n care se %a (olosi aceasta+ 1e
e!em"lu* "oate (i un "rogram de generare a ra"oartelor "e care )l in%oca'i din inter"reter* res"ecti% un "rogram
de sumar al conta/ilit'ii (urnizorilor* care ruleaz ca sarcin a utilitarului cron la s(3r0itul (iecrei luni+ )n
general* comenzile rulate din inter"reter sau din utilitarul cron sunt de sine stttoare si nu "un "rea multe "ro2
/leme mediului de e!ecu'ie+ Pe de alt "arte* "ute'i scrie o a"lica'ie care urmeaz a (i in%ocat de un ser%er We/+
Un asemenea "rogram "oate (i ca"a/il de a e!trage ti"uri de in(orma'ii (oarte e!acte din mediul su de
dez%oltare* de genulD &e /roMser (olose0te clientul? &are au (ost "arametrii introdu0i )ntr2un (ormular de
solicitare a a/onrii la o list de cores"onden'? ; (urnizat clientul "arola corect "entru accesul la in(orma'iile
legate de "ersonalul nostru?
6iecare lim/a4 ;P, este mai mult sau mai "u'in adec%at "entru scrierea de a"lica'ii )n aceste medii di(eriteD
5 & este un lim/a4 de uz general* deci* )n "rinci"iu* "oate (i (olosit la orice* )n "ractic* tendin'a este de a se
utiliza lim/a4ul & "entru "rograme autonome* nu "entru "rogramarea )n We/+ Un moti%* "ro/a/il* este acela c )n
& "relucrarea te!telor 0i gestiunea memoriei sunt mai di(icile dec3t )n Perl sau PHP* lim/a4e (olosite "e scar
mare )n a"lica'iile We/+
5 Perl* ca 0i &* este adec%at "entru scrierea de "rograme autonome+ Botu0i* se )nt3m"l ca Perl s (ie deose/it de
util si "entru dez%oltarea siturilor We/* de e!em"lu "rin utilizarea modulului &7,+"m+ ;ceasta (ace din Perl un
lim/a4 util "entru scrierea a"lica'iilor care sta/ilesc o legtur )ntre MySQL 0i We/+ F asemenea a"lica'ie "oate
inter(a'a cu We/2ul "rin intermediul modulului &7,+"m si "oate interac'iona cu MySQL cu a4utorul modulului
1J,+
5 PHP este destinat* din "roiectare* "entru scrierea a"lica'iilor We/* deci re"rezint* )n mod e%ident* lim/a4ul cel
mai "ro"ice "entru We/+ Mai de"arte* accesul la /azele de date este una dintre cele mai "uternice caracteristici
ale lim/a4ului PHP* deci acesta constituie o"'iunea natural "entru a"lica'iile We/ care e!ecut o"era'ii legate de
MySQL+ Este "osi/il utilizarea lim/a4ului PHP ca inter"reter autonom 9de e!em"lu "entru e!ecu'ia scri"turilor
din s=ellG:* dar nu este (olosit (oarte (rec%ent )n acest mod+
1ate (iind aceste considera'ii* & 0i Perl sunt cele mai eligi/ile lim/a4e dac dori'i s scrie'i o a"lica'ie autonom+
Pentru a"lica'iile We/* Perl si PHP sunt cele mai adec%ate+ 1ac tre/uie s scrie'i a"lica'ii de am/ele ti"uri* dar
nu cunoa0te'i nici unul din lim/a4ele res"ecti%e si dori'i s )n%'a'i c3t mai "u'in "osi/il* Perl "oate (i alegerea
dumnea%oastr cea mai /un+
;m (olosit aici termenul s=ell )n detrimentul traducerii sale uzuale 9inter"reter: "entru a nu crea o con(uzie cu
inter"retorul PHP des"re care se discut )n "aragra(ul res"ecti%+ 2 A+B+
2G0 Partea a ll2a Utilizarea inter(e'elor de "rogramare ale sistemului MySQL
Per(orman'
1ac sunt identice din toate celelalte "uncte de %edere* )n general "re(erm ca a"lica'ii noastre s ruleze c3t mai
ra"id "osi/il+ Botu0i* im"ortan'a e(ecti% a "er(orman'ei tis s (ie corelat cu (rec%en'a de utilizare a unui
"rogram+ Pentru un "rogram "e rula'i o dat "e lun* )n tim"ul no"'ii* su/ (orma unei sarcini a utilitarului cron*
"er(ci44 manta nu este un (actor c=iar at3t de im"ortant+ 1ac rula'i un "rogram de mai mu) ori "e secund )ntr2un
sit We/ "uternic solicitat* (iecare (r3m de ine(icient "e cant elimina'i "oate determina o di(eren'
semni(icati%* )n cazul din urm* "er(orman4 4oac un rol im"ortant )n utilitatea 0i atracti%itatea sitului
dumnea%oastr+ Un sit ,c. este agasant "entru utilizatori* indi(erent de con'inutul su* iar dac situl re"rezint
surs de %enit "entru dumnea%oastr* o scdere a "er(orman'elor se con%erte0te )ntr2o reducere a %eniturilor+ Au
%e'i "utea onora un numr at3t de mare de simultan* iar %izitatorii dezgusta'i "ur 0i sim"lu %or renun'a 0i %or
"leca )n alt "arts+
E%aluarea "er(orman'elor este o "ro/lem com"le!+ &el mai /un indicator al com"or a"lica'iei dumnea%oastr
atunci c3nd este scris "entru o anumit inter(a' ;P, este o scrie su/ acea inter(a' 0i de a o (olosi ca atare+ ,ar
cel mai /un test com"arati% este c im"lementa a"lica'ia de mai multe ori* su/ inter(e'e ;P, di(erite* "entru a
e!amina i rentele )ntre %ersiuni+ 1esigur* nu aceasta este situa'ia )n realitate+ &el mai adesea* dorit % %ede'i scris
"rogramul+ Fdat ce acesta (unc'ioneaz* % "ute'i g3ndi la a4ustri dac # necesar s ruleze mai re"ede* s
(oloseasc o cantitate mai redus de memorie sau "rezint un alt as"ect care tre/uie )m/unt'it )ntr2un alt mod+
1ar e!ist cel "u'in doi i tori care in(luen'eaz "er(orman'ele )ntr2un mod relati% consec%entD
5 Programele com"ilate se e!ecut mai ra"id dec3t scri"turile inter"retate+
5 Pentru lim/a4ele inter"retate (olosite )ntr2un conte!t We/* "er(orman'ele sunt /une atunci c3nd inter"retorul
este in%ocat ca un modul care (ace "ane din ser%e We/ )nsu0i* dec3t ca "roces se"arat+
Lim/a4e com"ilate sau lim/a4e inter"retate
&a "rinci"iu general* a"lica'iile com"ilate sunt mai e(iciente* (olosesc o cantitate 8a redus de memorie si se
e!ecut mai ra"id dec3t o %ersiune ec=i%alent a "rogra scris )ntr2un lim/a4 de scri"ting+ ;cest lucru se
datoreaz su"rasarcinii determinat inter"retorul lim/a4ului care e!ecut scri"turile+ 1eoarece & este com"ilat*
iar PUa PHP sunt inter"retate* )n general "rogramele scrise )n & %or rula mai ra"id dec3t i turile Perl sau PHP+
Pentru un "rogram "uternic solicitat* & este deseori cea mai /un o"'iune+ &lient linie de comand mysNl inclus
)n distri/u'ia MySQL este un /un e!em"lu )n acestb
E!ist* desigur* 0i (actori care au tendin'a de 3 atenua aceast deose/ire clar+ Unul dinV este c* )n general*
"rogramele scrise )n & sunt mai ra"ide* dar este (oarte "osi/il s ) & "rograme ine(iciente+ Scrierea unui "rogram
)ntr2un lim/a4 com"ilat nu este unV automat s"re un ni%el mai ridicat de "er(orman'+ Au sunte'i scutit de a g3ndi
ceea ceV de (cut* )n "lus* di(eren'a dintre "rogramele com"ilate si cele inter"retate este atenuat. o2a"lica'ie cu
scri"turi )0i "etrece ma4oritatea tim"ului e!ecut3nd liniile de "rogram dir' 4 nele din /i/lioteca client MySQL
care sunt legate la motorul inter"retorului+
&a"itolul Q ,ntroducere )n "rogramarea MySQL 2G< Lersiuni autonome sau modulare ale inter"retoarelor
lim/a4elor
Pentru a"lica'iile /azate "e We/* inter"retoarele lim/a4elor de scri"ting sunt (olosite* de o/icei* )ntr2una din dou
(orme 9cel "u'in )n cazul ;"ac=e* ser%erul We/ "e care )l %om (olosi "entru a scrie a"lica'iile We/:D
5 Pute'i determina ser%erul ;"ac=e s in%oce inter"retorul ca "roces se"arat+ &3nd ;"ac=e tre/uie s ruleze un
scri"t Perl sau PHP* "orne0te "rogramul cores"unztor si )i cere acestuia s e!ecute scri"tul+ )n acest caz* ;"ac=e
(olose0te inter"retoarele ca "rograme &7,V cu alte cu%inte* e!ecut comunicarea cu "rogramele res"ecti%e
(olosind "rotocolul &ommon 7ateMay ,nter(ace 9&7,:+
5 ,nter"retorul "oate (i (olosit ca modul care este legat direct la /inarul ;"ac=e si ruleaz ca "arte a "rocesului
;"ac=e )nsu0i* )n ceea ce "ri%e0te ser%erul ;"ac=e* inter"retoarele Perl 0i PHP iau (orma modulelor mod_"erl*
res"ecti% mod_"="G+
Partizanii lim/a4elor Perl si PHP %or e%iden'ia a%anta4ele legate de %itez ale inter"re2torului lor "re(erat* dar to'i
sunt de acord c (orma )n care ruleaz inter"retorul este un (actor cu mult mai im"ortant dec3t lim/a4ele )n sine+
;m/ele inter"retoare ruleaz mult mai ra"id ca modul dec3t ca a"lica'ie &7, autonom+
&u o a"lica'ie autonom* este necesar s "orni'i inter"retorul de (iecare dat c3nd urmeaz a (i e!ecutat un scri"t*
deci crea'i o "enalizare semni(icati% "ri%ind su"rasarcina de creare de "roces+ &3nd este (olosit ca modul )n
cadrul unui "roces ;"ac=e care ruleaz de4a* (unc'ionalit'ile unui inter"reter "ot (i accesi/ile instantaneu din
"aginile dumnea%oastr de We/+ ;cest (a"t determin o cre0tere su/stan'ial a "er(orman'elor "rin reducerea
su"rasarcinii 0i se con%erte0te direct )ntr2o cre0tere a ca"acit'ii de tratare a cererilor rece"'ionate 0i de distri/uire
ra"id a acestora+
Penalizarea la "ornire a inter"retorului autonom are ca rezultat* )n mod caracteristic* o "er(orman' cu minimum
un ordin de mrime mai redus dec3t cea a inter"retorului su/ (orm de modul+ &ostul necesar la "ornirea
inter"retorului este im"ortant mai ales dac a%e'i )n %edere (a"tul c ser%irea "aginii We/ im"lic* de regul*
tranzac'ii ra"ide cu un %olum redus de "relucrri* nu tranzac'ii su/stan'iale* cu un %olum mare de "relucrri+
1ac "ierde'i mult tim" cu "ornirea 0i mai "u'in cu e!ecu'ia scri"tului* atunci ma4oritatea resurselor
dumnea%oastr se irosesc+ Este ca 0i cum a'i "ierde ma4oritatea zilei "regtindu2% "entru lucru* a4unge'i la /irou
la ora <^ 0i a"oi "leca'i acas la <T+
L "ute'i "une )ntre/area de ce a"ar economii de tim" la %ersiunile modul ale inter"retoarelor* deoarece tot
tre/uie s "orni'i ser%erul ;"ac=e+ Moti%ul este acela c* atunci c3nd ;"ac=e "orne0te* creeaz imediat un
rezer%or de "rocese co"il care %or (i (olosite "entru rezol%area cererilor rece"'ionate+ &3nd sose0te o cerere care
im"lic e!ecu'ia unui scri"t* e!ist de4a un "roces ;"ac=e gata "regtit "entru a rezol%a cererea+ 1e asemenea*
(iecare instan' de ;"ac=e deser%e0te mai multe cereri* deci costul "rocesului de "ornire se calculeaz )n ra"ort
cu un set de cereri* nu )n ra"ort cu o singur cerere+
2G2 Partea a ll2a Utilizarea inter(e'elor de "rogramare ale sistemului MySQL
&3nd Perl si PHP sunt instalate )n (orm modular 9su/ (orma mod_"erl 0i mod_"= care din ele se descurc mai
/ine? ;cest as"ect constituie un su/iect de contro%erse* )n general se a"lic urmtoarele linii directoareD
5 Perl con%erte0te scri"tul )ntr2o (orm com"ilat internV PHP nu realizeaz aceal4 con%ersie+ ;st(el* odat
scri"tul analizat* Perl are tendin'a de a2< e!ecuta oarecum m ra"id* mai ales "entru ciclurile cu un mare numr de
itera'ii+
5 mod_"erl "oate memora scri"turile )n cac=e* "entru a mri "er(orman'a scri"turii@ care se e!ecut )n mod
re"etat+ 1ac un scri"t se a(l )n cac=e* Perl )nce"e s2< e!ecu mai ra"id* deoarece nu mai tre/uie analizat din
nou+ )n caz contrar* PHP )nce"e* e!ecute mai ra"id scri"tul+
5 mod_"erl are o am"rent de memorie mai mare dec3t PHPV "rocesele ;"ac=e sunt mari dac mod_"erl* 0i nu
mod_"="G* este legat la ser%er+ PHP a (ost "roiectat su/ siderentul c tre/uie s coo"ereze cu alt "roces si s
"oat (i acti%at si dezacti%at de multe ori "e durata de %ia' a "rocesului res"ecti%+ Perl a (ost "roiectat "entru a
rula # linia de comand* ca "rogram autonom* nu ca lim/a4 destinat a (i )ncor"orat )ntr2un " ces de ser%er We/+
;ceast caracteristic este cea care contri/uie* "ro/a/il* la crestei dimensiunii am"rentei de memorieV ca modul*
Perl "ur 0i sim"lu nu ruleaz )n mi su natural+ ;l'i (actori care contri/uie la cre0terea dimensiunii am"rentei de
menu sunt memorarea )n cac=e a scri"turilor si modulele Perl su"limentare "e care le (ol/si scri"turile* )n am/ele
situa'ii* )n memorie este )ncrcat o cantitate mai mare de " gram* care rm3ne acolo "e toat durata %ie'ii
"rocesului ;"ac=e+
,ndi(erent de a%anta4ele "e care Perl le "oate a%ea )n ra"ort cu PHP )n ceea ce "ri%i %iteza de e!ecu'ie a
scri"turilor* acestea sunt eliminate de PHP E+ ;cesta este asemi tor cu PHP G )n ceea ce "ri%e0te (unc'ionalit'ile
0i inter(a'a* dar incor"oreaz aend* motor de inter"retor cu "er(orman'e su"erioare+
)n orice caz* to'i ace0ti (actori au ca rezultat di(eren'e de ordinul zecimilor de "ro# )ntre "er(orman'ele
%ersiunilor de ti" modul ale lim/a4elor Perl 0i PHP+ &el mai im"' tant este s e%ita'i inter"retoarele autonome ori
de c3te ori este "osi/il* indi(erent de <D /a4ul "e care )l alege'i+
Lersiunea autonom a unui inter"retor are un a%anta4 )n ra"ort cu omologul su )n siune modul* )n sensul c
"ute'i determina rularea "rimei %ersiuni su/ un alt identi(is de utilizator+ Lersiunile modul ruleaz )ntotdeauna
su/ acela0i identi(icator de utiliD ca 0i ser%erul We/* care* )n mod caracteristic* este un cont cu "ri%ilegii
minimale** moti%e de securitate 9de e!em"lu dac tre/uie s "ute'i citi sau scrie )n (i0iere "rote4V Pute'i com/ina
a/ordrile autonom si cea de ti" modul* dac dori'i* (olosind %ersii modul )n mod "resta/ilit* res"ecti% %ersiunea
autonom "entru situa'ii )n care este rt4 sar ca scri"turile s ruleze cu "ri%ilegiile unui anumit utilizator+
Reducerea cerin'elor de memorie ale modulului mod_"erl
E!ist te=nici care % "ermit s acti%a'i numai anumite "rocese ;"ac=e "entru mod_"erl+ su"rasarcina
determinat de "lusul de memorie a"are numai la acele "rocese care e!ecut scri"turiO. 1omeniul dedicat
modulului mod_"erl din situl We/ ;"ac=e con'ine o e!"unere "ertinent a strategii "e care le "ute'i alege+
9Pentru mai multe in(orma'ii* %ezi =tt"D C C "erl+ a"ac=e+ org C guid
&a"itolul Q ,ntroducere )n "rogramarea MySQL 2GG
;ceasta )nseamn cu at3t mai mult c* ori de c3te ori (olosi'i Perl sau PHP* tre/uie s )ncerca'i s (olosi'i
lim/a4ul res"ecti% dintr2un modul ;"ac=e* nu s in%oca'i un "roces de inter"reter se"arat+ Rezer%a'i utilizarea
inter"retorului autonom numai "entru acele cazuri unde nu se "oate (olosi %ersiunea modul* cum sunt scri"turile
care necesit "ri%ilegii s"eciale+ Pentru aceste situa'ii* % "ute'i "relucra scri"tul (olosind mecanismul ;"ac=e
suEPE&* "entru a "orni inter"retorul su/ un anumit identi(icator de utilizator+
Bim" de dez%oltare
6actorii "e care i2am descris anterior a(ecteaz "er(orman'a a"lica'iilor dumnea%oastr* dar este "osi/il ca
e(icien'a /rut a e!ecu'iei s nu (ie unicul dumnea%oastr sco"+ Bim"ul este de asemenea im"ortant* ca 0i
sim"litatea )n "rogramare* deci un alt (actor care tre/uie luat )n considerare la selectarea unei inter(e'e ;P,
"entru "rogramarea )n MySQL este ra"iditatea cu care % "ute'i des(0ura a"lica'iile+ 1ac "ute'i scrie un scri"t
Perl )ntr2un tim" ec=i%alent cu 4umtatea inter%alului necesar "entru a dez%olta ec=i%alentul )n & al "rogramului
res"ecti%* atunci "ute'i "re(era s (olosi'i inter(a'a ;P, "entru modulul Perl 1J, dec3t inter(a'a ;P, "entru &*
c=iar dac a"lica'ia rezultant nu ruleaz la (el de ra"id+ 1eseori* este normal s (i'i mai "u'in interesat de tim"ul
de e!ecu'ie a "rogramului dec3t de tim"ul "e care )l aloca'i scrierii acestuia* mai ales "entru a"lica'iile care nu
sunt e!ecutate (rec%ent+ F or din tim"ul dumnea%oastr este cu mult mai %aloroas dec3t o or din tim"ul
calculatoruluiE.
)n general* lim/a4ele de scri"ting % "ermit s H"une'i "e roate8 mult mai ra"id un anumit "rogram* mai ales
"entru ela/orarea unui "rototi" al a"lica'iei (inite+ &el "u'in doi (actori contri/uie la aceasta+
Mai )nt3i* lim/a4ele de scri"ting au tendin'a de a (urniza construc'ii de ni%el mai )nalt+ ;cest lucru % "ermite s
g3ndi'i la un ni%el de a/stractizare mai ridicat* ast(el )nc3t s % "ute'i concentra asu"ra a ceea ce a%e'i de (cut*
nu asu"ra detaliilor necesare+ 1e e!em"lu* ta/lourile asociati%e 9=as=2urile: din Perl determin o economie de
tim" semni(icati% "entru )ntre'inerea datelor cu o rela'ie de ti" c=eie2%aloare 9cum sunt "erec=ile identi(icator
ele% 2 nume ele%:+ Lim/a4ul & nu dis"une de o asemenea construc'ie+ 1ac a'i (i dorit s im"lementa'i o
asemenea entitate )n &* ar (i tre/uit s scrie'i "rograme "entru rezol%area mai multor detalii de ni%el sczut*
legate de as"ecte "recum gestiunea memoriei 0i mani"ularea 0irurilor* "rograme "e care tre/uie s le de"ana'i+
Fri* a0a ce%a ia tim"+
,n al doilea r3nd* ciclul de dez%oltare are mai "u'ine eta"e "entru lim/a4ele de scri"ting+ ,n &* atunci c3nd %
dez%olta'i a"lica'iile* tre/uie s "arcurge'i testul o/i0nuit de editare2com"ilare2testare+ 1e (iecare dat c3nd
modi(ica'i "rogramul* tre/uie s2< com"ila'i din nou )nainte de a2< testa+ &u Perl 0i PHP* ciclul de dez%oltare se
rezum la editare 0i testare* deoarece "ute'i rula un scri"t imediat du" (iecare modi(icare* (r com"ilare+ Pe de
alt "arte* com"ilatorul im"une mai multe restric'ii asu"ra "rogramului dumnea%oastr* su/ rorma unei %eri(icri
mai stricte a ti"urilor+ Aecesitatea disci"linei mai stricte im"use de com"ilator % "oate a4uta s e%ita'i =i/e care
nu sunt at3t de u0or de de"istat )n lim/a4e mai li/erale* "recum Perl sau PHP+ 1ac scrie'i gre0it un nume de
%aria/il )n &* com"ile ne (acem* )ns* dac acea or din tim"ul calculatorului este o or din tim"ul clientului?
h A+B+
2GE Partea a ll2a Utilizarea inter(e'elor de "rogramare ale sistemului MySQL
latorul % %a a%ertiza+ PHP nu %a (ace acest lucru* iar Perl nu % %a a%ertiza dec3t dac cere'i aceasta+ ;ceste
restric'ii mai "uternice sunt %aloroase mai ales dac a"lica'iile di nea%oastr de%in mai mari 0i mai di(icil de
)ntre'inut+
)n general* com"romisul este cel uzual dintre lim/a4ele com"ilate 0i cele inter"retat )ntre tim"ul de dez%oltare 0i
"er(orman'D 1ori'i s dez%olta'i "rogramul (olosind lim/a4 com"ilat* ast(el )nc3t s se e!ecute mai ra"id atunci
c3nd ruleaz* dar s "iere mai mult tim" la scrierea "rogramului? Sau dori'i s scrie'i "rogramul su/ (orm d
scri"t* "entru a2< "utea e!"loata )n cel mai scurt tim"* c=iar 0i cu "re'ul unei scade %itezei de e!ecu'ie?
1e asemenea* este "osi/il com/inarea celor dou metode+ Scrie'i un scri"t dr Hciorn8 "entru a dez%olta ra"id
un "rototi" al a"lica'iei* )n %ederea testrii logicii 4 "entru a % asigura c algoritmii sunt corec'i+ 1ac "rogramul
se do%ede0te a (i utu8- este e!ecutat su(icient de (rec%ent ast(el )nc3t "er(orman'a s de%in o "ro/lem* )l "u'
rescrie su/ (orm de a"lica'ie com"ilat+ ;st(el* "ute'i o/'ine a%anta4e din am/ele "a o creare ra"id a
"rototi"ului "entru dez%oltarea ini'ial a a"lica'iei si un ni%el de (orman' o"tim "entru "rodusul (inal+
)ntr2un sens mai strict* nici una din inter(e'ele ;P, "entru Perl 1J, 0i PHP nu o( er M racteristici care nu e!ist
)n /i/lioteca client &+ ;ceasta deoarece am/ele inter(e'e o/'in acces la MySQL "rin legarea /i/liotecii & "entru
MySQL la inter"retoarele O 0i PHP+ Botu0i* mediul )n care sunt )nglo/ate caracteristicile sistemului MySQL (oarte
di(erit "entru & dec3t "entru Perl sau PHP+ 73ndi'i2% la unele dintre o"era'ii necesare la interac'iunea cu
ser%erul MySQL 0i )ntre/a'i2% )n ce msur (iecare lim/a4ele ;P, % "oate a4uta la e(ectuarea acestora+ ,at
c3te%a e!em"leD
5 7estiunea memoriei* )n &* %e'i lucra cu malloc9: 0i ( ree9: "entru toate sarcinile i im"lic structuri de date
alocate dinamic+ Perl 0i PHP e!ecut aceste o"era'ii autor 1e e!em"lu* dimensiunile ta/lourilor cresc automat*
iar 0irurile cu lungime dii
se "ot (olosi (r a % mai g3ndi la gestiunea memoriei+
5 Mani"ularea te!telor+ Perl are cele mai e%oluate caracteristici )n acest domeniu*<> PHP )l secondeaz
)ndea"roa"e* )n com"ara'ie cu cele dou lim/a4e* & este (c rudimentar+
1esigur* )n & % "ute'i scrie "ro"riile dumnea%oastr /i/lioteci* care s )nca"suleze sa "recum gestiunea
memoriei 0i "relucrarea te!telor )n (unc'ii care s (aciliteze )nde"li(li sarcinii+ La tre/ui )ns s de"ana'i acele
(unc'ii* 0i dori'i ca algoritmii dumnea%oastrV de asemenea* e(icien'i+ 1in am/ele "uncte de %edere* se "oate
"resu"une c algorit Perl 0i PHP "entru aceste o"era'ii sunt )n general /ine de"ana'i si de o e(icien' rezor+ din
moment ce au a%ut H"ri%ilegiul8 de a (i (ost e!amina'i de numeroase "erec=i de #. Pute'i economisi tim"
/ene(iciind de tim"ul "e care al'ii <2au in%estit )n aceast sarcinBX4 de alt "arte* dac se )nt3m"l ca
inter"retorul s ai/ o =i/* s2ar "utea s tre/uia coa/ita'i cu aceasta "3n c3nd "ro/lema este remediat+ &3nd
scrie'i "rograme )n &* i un control mai (in asu"ia com"ortrii "rogramului dumnea%oastr+:
Lim/a4ele di(er din "unct de %edere al Hsiguran'ei8+ ,nter(a'a ;P, "entru & (ur inter(a'a de ni%el cel mai sczut
cu ser%erul 0i a"lic "olitica cea mai "u'in "reten(i' 1in acest moti%* (urnizeaz siguran'a cea mai "recar+ 1ac
e!ecuta'i (unc'ii ;P, de(U4
&a"itolul Q ,ntroducere )n "rogramarea MySQL 2GQ
"ute'i a%ea noroc si "rimi'i o eroare Hde nesincronizare8 sau "ute'i a%ea g=inion 0i "rogramul dumnea%oastr %a
cdea+ Scri"tul dumnea%oastr cade dac nu e(ectua'i o"era'iile )n ordinea corect* dar inter"retorul nu se
de(ecteaz+ F alt surs (ertil de =i/e din "rogramele & care determin cderea sistemului este utilizarea
memoriei alocate dinamic si a "ointerilor asocia'i acesteia+ Perl 0i PHP se ocu" automat de gestiunea memoriei*
deci este mult mai "u'in "ro/a/il ca scri"turile dumnea%oastr Hs20i dea du=ul8 datorit unor =i/e de gestiune a
memoriei+
Bim"ul de dez%oltare este a(ectat de %olumul de su"ort e!tern dis"oni/il "entru un lim/a4+ Su"ortul e!tern "entru
& e!ist su/ (orma unor /i/lioteci container care )nca"suleaz (unc'ii ;P, )n & "entru MySQL )n rutine care sunt
mai u0or de (olosit+ Ji/liotecile care e!ecut aceast o"era'ie sunt dis"oni/ile at3t "entru &* c3t 0i "entru &YY+
,ndiscuta/il* Perl are cea mai mare cantitate de module add2on* su/ (orm de module Perl 9conce"tual similare
cu modulele ;"ac=e:+ E!ist c=iar o in(rastructur* conce"ut "entru a (acilita localizarea si o/'inerea acestor
module 9&P;A sau &om"re=ensi%e Perl ;rc=i%e AetMor[:+ 6olosind module Perl* o/'ine'i acces la toate
categoriile de (unc'ii (r a scrie nici mcar o linie de "rogram+ 1ori'i s scrie'i un scri"t care s genereze un
ra"ort dintr2o /az de date* care a"oi s (ie trimis cui%a su/ (orm de (i0ier ata0at la un e2mail? Procura'i2% unul
dintre modulele M,ME si %e'i dis"une de o (unc'ionalitate instantanee de generare a (i0ierelor ata0ate+
PHP nu dis"une de aceea0i cantitate de su"ort e!tern 9ceea ce nu este sur"rinztor* dat (iind c este un lim/a4 mai
recent:+ Poate c modulul add2on cel mai /ine cunoscut este PHP Jase Li/rary 9PHPL,J:+ S "resu"unem c
scrie'i o a"lica'ie We/ care tre/uie s limiteze accesul la anumite "agini We/ numai "entru utilizatorii autoriza'i*
)n (unc'ie de un anumit mecanism /azat "e nume 0i "arol+ Pute'i scrie "rogramul de su"ort "entru a"lica'ia
res"ecti% )n orice lim/a4* dar* dac (olosi'i PHP Jase Li/rary 9PHPL,J:* nu %a tre/ui s % "ierde'i %remea
redesco"erind roata+ PHPL,J (urnizeaz metode de autenti(icare 0i de asemenea % "ermite s urmri'i
utilizatorii neautoriza'i "e "arcursul unei sesiuni 9o succesiune de desc=ideri de "agin de la un client dat* tratate
ca "r'i ale unei singure %izite logice:+ 1e asemenea* "ute'i atri/ui "ermisiuni utilizatorilor* ceea ce % "ermite s
e(ectua'i o"era'ii "recum de(inirea unor utilizatori administrati%i* care dis"un de mai multe "ri%ilegii+
Porta/ilitate
Pro/lema "orta/ilit'ii este legat de u0urin'a cu care un "rogram scris "entru a o/'ine accesul la motorul
MySQL "oate (i modi(icat ast(el )nc3t s (oloseasc un alt motor+ ;cesta "oate (i un as"ect cruia nu2i acorda'i
nici o im"ortan'+ Botu0i* cu e!ce"'ia cazului )n care a%e'i calit'i de %izionar 0i a(irma'i HAiciodat nu %oi (olosi
acest "rogram cu un alt sistem de /aze de date dec3t MySQL8* "oate (i riscantD s "resu"unem c % sc=im/a'i
ser%iciul 0i dori'i s % (olosi'i %ec=ile "rograme* dar dac noul dumnea%oastr "atron (olose0te un alt sistem de
/aze de date?
2G^ Partea a ll2a Utilizarea inter(e'elor de "rogramare ale sistemului MySQL
1ac "orta/ilitatea este o "rioritate* tre/uie s a%e'i )n %edere di(eren'ele nete )r inter(e'ele ;P,D
5 1J, asigur inter(a'a ;P, cea mai "orta/il* deoarece inde"enden'a de sistemul )i4 /aze de date este un
deziderat e!"licit de "roiectare "entru 1J,+
5 PHP este mai "u'in "orta/il* deoarece nu (urnizeaz acela0i ti" de inter(a' uni(orc "entru di(eritele sisteme de
/aze de date ca 0i 1J,+ ;"elurile de (unc'ii PHP "ent (iecare sistem de /aze de date acce"tat sunt asemntoare
cu a"elurile cores"unztc din inter(a'a de /az ;P, "entru &+ E!ist o oarecare atenuare a di(eren'elor* dar*Oi
"u'in* %a tre/ui s modi(ica'i numele (unc'iilor de mani"ulare a /azelor de date "e ci le in%oca'i+ 1e asemenea* s2
ar "utea s (i'i o/ligat s re%izui'i "u'in 0i logica a"lica'i dumnea%oastr* deoarece inter(e'ele cu di(eritele
sisteme de /aze de date (unc'ioneaz toate )n e!act acela0i mod+
5 ,nter(a'a ;P, "entru 7 asigur "orta/ilitatea cea mai redus )ntre sistemele de /aze 4 date+ Prin natura sa*
aceast inter(a' este "roiectat 0i destinat s"ecial utilizrii> MySQL+
Porta/ilitatea 2 su/ (orma inde"enden'ei de sistemul de /aze de date 2 este deose/itV: im"ortant c3nd tre/uie s
o/'ine'i acces la mai multe sisteme de /aze de date din cad. aceleia0i a"lica'ii+ ;ici "ot (i incluse sarcini sim"le*
"recum mutarea datelor dintr?- S7J1R )n altul* res"ecti% o"era'ii mai com"le!e* cum ar (i generarea unui
ra"ort\ (unc'ie de in(orma'ii o/'inute de la un numr de sisteme de /aze de date+
;t3t 1J,* c3t 0i PHP (urnizeaz su"ort "entru accesul la mai multe motoare de /az date* deci % "ute'i conecta
simultan* cu u0urin'* la ser%ere "entru sisteme de /aze(- date di(erite* "lasate c=iar "e calculatoare di(erite+ &u
toate acestea* 1J, 0i PHP nuD la (el de adec%ate "entru sarcini care im"lic regsirea 0i "relucrarea datelor din
multe sisteme de /aze de date com"let di(erite+ 1J, este de "re(erat* deoarece (olosi'ii singur set de a"eluri de
acces* indi(erent de sistemele de /aze de date "e care le (olc S "resu"unem c dori'i s trans(era'i date )ntre
sistemele de /aze de date M: mSQL si Postgres+ &u 1J,* unica di(eren' )ntre modurile de utilizare a celor treia
teme de /aze de date este a"elul 1J,2$connect9: (olosit "entru conectarea la (ie ser%er+ &u PHP* a%e'i un scri"t
mai com"licat* care )ncor"oreaz trei seturi de a"e "entru citire* res"ecti% trei seturi de a"eluri "entru scriere+
Un caz e!trem al a"lica'iei cu /aze de date multi"le este scri"tul c ras=2me din dist MySQL* care testeaz
(unc'ionalit'ile a numeroase "rograme ser%er de /aze de date # rite+ ;cest scri"t este scris (olosind 1J,* care
re"rezint o"'iunea e%ident "entru oV nea a"lica'ie* deoarece "ute'i o/'ine acces )n acela0i mod la toate sistemele
de /aze de ol
&;P,BFLUL ^
,nter(a'a ;P, MySQL "entru &
MySQL (urnizeaz o /i/liotec client scris )n lim/a4ul de "rogramare &* "e care o "ute'i (olosi "entru a scrie
"rograme client care o/'in accesul la /azele de date MySQL+ ;ceast /i/liotec de(ine0te o inter(a' de
"rogramare a a"lica'iilor* care include urmtoarele (acilit'iD
5 Rutine de gestiune a cone!iunii* "entru ini'ierea 0i terminarea unei sesiuni cu un ser%er+
5 Rutine de construc'ie a interogrilor* de trimitere a acestora la ser%er si de "relucrare a rezultatelor+
5 6unc'ii de ra"ortare a strii si a erorilor* "entru determinarea moti%ului e!act al erorii atunci c3nd alte a"eluri
de (unc'ii din inter(a'a ;P, "entru & e0ueaz+
;cest ca"itol % "rezint modul de utilizare a /i/liotecii client "entru scrierea "ro"riilor dumnea%oastr
"rograme+ Unele dintre dezideratele de care %om 'ine cont sunt consec%en'a cu "rogramele client e!istente din
distri/u'ia MySQL* "recum 0i caracterul modular 0i ca"acitatea de reutilizare a codului+ Presu"un c a%e'i
cuno0tin'e des"re "rogramarea )n &* dar am )ncercat s nu % con(und cu un e!"ert )n materie+
&a"itolul dez%olt o serie de "rograme client )ntr2o "rogresie sim"l* de la (oarte sim"le la "rograme mai
com"le!e+ Prima "arte a acestei "rogresii dez%olt cadrul "entru un sc=elet al unui "rogram client* care nu (ace
dec3t s se conecteze 0i s se deconecteze de la ser%er+ Moti%ul este c* de0i "rogramele client MySQL sunt
scrise cu sco"uri di(erite* toate au un lucru )n comunD sta/ilesc o cone!iune cu ser%erul+
Lom construi sc=eletul )n eta"eD
<+ Scriem un "rogram elementar de cone!iune si )ntreru"ere a cone!iunii 9clien'i:+
2+ ;dugm logic de %eri(icare a a"ari'iei erorilor 9client2:+
G+ 6acem "rogramul de cone!iune modular 0i reutiliza/il 9clienta:+
E+ ;dugm ca"acitatea de a o/'ine "arametri de cone!iune 9gazd* utilizator* "arol: la rulare 9clientE:+
;cest cadru este su(icient de general 0i dumnea%oastr )l "ute'i (olosi dre"t /az "entru orice numr de "rograme
client+ 1u" ce2< %om crea* %om (ace o "auz "entru a ne g3ndi la modul de mani"ulare a di%erselor interogri+
La )nce"ut* %om discuta des"re modul de mani"ulare a anumitor instruc'iuni SQL codate =ard 9adic )nglo/ate )n
codul "rogramului 2 A+B+:* du" care %om crea un "rogram care se "oate (olosi "entru "relucrarea mstruc'iunilor
ar/itrare+ ;"oi* %om aduga "rogramul de "relucrare a interogrilor la cadrul nostru de "rogram client* "entru a
crea un alt "rogram 9clients: care este simi2tar clientului mysNl+
2GS Partea a ll2a Utilizarea inter(e'elor de "rogramare ale sistemului MySQL
1e asemenea* %om lua )n considerare 90i %om rezol%a: unele "ro/leme comune* de ger H&um )mi "ot "rocura
in(orma'ii des"re structura ta/elelor mele?8 sau H&um "ot ins# imagini )n /aza mea de date?8+
&a"itolul de (a' discut des"re (unc'ii 0i ti"uri de date din /i/lioteca client numai msura necesit'ilor+ Pentru o
list com"re=ensi% a tuturor (unc'iilor si ti"urilor* %a ;ne!a 6* HRe(erin' ;P, &8+ Pute'i (olosi ane!a res"ecti%
ca re(erin' "entru al cuno0tin'e "ri%ind orice com"onent a /i/liotecii client "e care )ncerca'i s o (olosi'iC.
Programele date ca e!em"lu "ot (i descrcate din ,nternet* deci le "ute'i )ncerca dirc (r a (i necesar s le tasta'i+
Pentru instruc'iuni* %ezi ;ne!a ;* HF/'inerea 0i instala "rogramelor8+
Unde se gsesc e!em"lele
F )ntre/are comun care se a(l )n lista de cores"onden' MySQL esteD HUnde "ot gsi unele e!en de "rograme
client scrise )n &?8 1esigur* rs"unsul esteD +&=iar aici* )n cartea asta8+ 1ar un (a"t "e # mul'i au tendin'a s nu2l
ia )n considerare este acela c distri/u'ia MySQL con'ine numeroase "rogn client 9mysNl* mysNladmin 0i
mysNldum"* de e!em"lu:* din care ma4oritatea sunt scrise )n@ 1eoarece distri/u'ia este dis"oni/il su/ (orm de
cod surs* MySQL )nsu0i % o(er o cantitateO+ (icati% de e!em"le de "rograme client+ &a atare* dac nu a'i
(cut2o "3n acum* lua'i o distri/u'ie )n # surs si e!amina'i "rogramele din catalogul client+ Programele client
MySQL a"ar'in domeniului - 0i "ute'i )m"rumuta lini0tit linii de cod din ele "entru "ro"riile dumnea%oastr
"rograme* )ntre e!em"lele (urnizate )n acest ca"itol 0i "rogramele client induse )n distri/u'ia MySQL* "ute'i gsi
# similar cu inten'iile dumnea%oastr atunci c3nd % scrie'i "ro"riile "rograme* )n acest caz* "ute'i re(olos: l de
"rogram "rin co"ierea unui "rogram e!istent 0i modi(icarea sa+ Bre/uie s citi'i acest ca"itol i )n'elege modul de
(unc'ionare a /i/liotecii client+ Re'ine'i* totu0i* c nu este necesar s scrie'i )ntotde toate "rogramele* "ornind de
la zero+ 9Le'i o/ser%a c "osi/ilitatea de reutilizare a codului este unul # sco"urile urmrite )n e!"unerea noastr
din acest ca"itol "ri%ind scrierea "rogramelor+: 1ac economisi o mare cantitate de munc "ornind de la
realizrile unei alte "ersoane* cu at3t mai /ine+
Procedura general "entru construirea "rogramelor cliei
;ceast sec'iune descrie eta"ele necesare "entru com"ilarea 0i legarea unui "rogram i (olose0te /i/lioteca client
MySQL+ &omenzile "entru construirea clien'ilor sunt oa cum di(erite de la un sistem la altul* iar dumnea%oastr
%a tre/ui s modi(ica'i "i4 comenzile "rezentate aici+ Botu0i* descrierea are un caracter general 0i tre/uie s o "u
a"lica a"roa"e oricrui "rogram client "e care )l scrie'i+
&erin'e elementare de sistem
&3nd scrie'i un "rogram client MySQL )n &* %e'i a%ea ne%oie de un com"ilator e%ident+ E!em"lele "rezentate
aici (olosesc com"ilatorul gcc+ 1e asemenea* %e'i ne%oie de urmtoarele entit'i )n a(ar de "ro"riile
dumnea%oastr (i0iere sursD
5 6i0ierele antet MySQL
5 Ji/lioteca client MySQL
&a"itolul ^ ,nter(a'a ;P, MySQL "entru & 2GR
6i0ierele antet 0i /i/lioteca client MySQL constituie su"ortul "entru "rogramarea clien'ilor+ ;cestea "ot (i de4a
instalate )n sistemul dumnea%oastr* )n caz contrar* este ne%oie s %i le "rocura'i+ 1ac MySQL a (ost instalat
dintr2o distri/u'ie surs sau /inar* su"ortul "entru "rogramarea clien'ilor tre/uie s (i (ost de4a instalat ca "arte a
"rocesului de instalare a distri/u'iei+ 1ac MySQL a (ost instalat din (i0iere RPM* acest su"ort nu %a e!ista dec3t
cu condi'ia ca (i0ierele RPM "entru dez%oltatori s (i (ost de4a instalate+ 1ac tre/uie s instala'i (i0ierele antet si
/i/lioteca MySQL* %ezi ;ne!a ;+
&om"ilarea 0i legarea "rogramului client
Pentru a com"ila 0i a lega un "rogram client* tre/uie s s"eci(ica'i unde se gsesc (i0ierele antet 0i /i/lioteca
client MySQL* deoarece aceste com"onente* de o/icei* nu sunt instalate )n loca'iile unde com"ilatorul 0i
"rogramul de legare le caut )n mod "resta/ilit+ Pentru e!em"lul urmtor* s "resu"unem c loca'iile (i0ierelor
antet 0i a /i/liotecii client sunt usrClocalCincludeCmysNl* res"ecti% CusrClocalCli/CmysNl+
Pentru a arta com"ilatorului cum s gseasc (i0ierele antet MySQL* transmite'i2i un argument
2,CusrClocalCincludeCmysNl atunci c3nd com"ila'i un (i0ier surs )ntr2un (i0ier o/iect+ 1e e!em"lu* "ute'i (olosi o
comand ca aceastaD
Z gcc 2c 2,CusrClocalCincludeCmysNl myclient+c
Pentru a indica "rogramului de legare unde s gseasc /i/lioteca client 0i care este numele acesteia* transmite'i
argumentele 2LCusrClocalCli/CmysNl 0i 2,mysNlclient atunci c3nd lega'i (i0ierul o/iect* "entru a "roduce un (i0ier
/inar e!ecuta/il* du" cum urmeazD
Z gcc 2o myclient rayclient+o 2LCusrClocalCli/CmysNl 2,mysNlclient )n cazul )n care clientul dumnea%oastr este
alctuit din mai multe (i0iere* denumi'i toate (i0ierele o/iect )n comanda de legare+ 1ac eta"a de legare
genereaz o eroare legat de im"osi/ilitatea de a gsi (unc'ia (loor9:* lega'i /i/lioteca de (unc'ii matematice "rin
adugarea o"'iunii 2,m la s(3r0itul comenziiD
Z gcc 2o myclient myclient+o 2LCusrClocalCli/XmysNl 2,mysNlclient 2,m Mai "oate (i necesar 0i adugarea altor
/i/lioteci+ 1e e!em"lu* "oate %e'i a%ea ne%oie de 2,soc[et 2,n0i "e sistemele Solaris+
1ac nu (olosi'i ma[e "entru construirea "rogramelor* % "ro"un s )n%'a'i s (olosi'i aceast comand* ast(el
)nc3t s nu (i'i o/ligat s tasta'i manual o mul'ime de comenzi "entru construirea "rogramelor+ S "resu"unem c
a%e'i un "rogram client* denumit myclient* care const din dou (i0iere surs* main+ c 0i au!+ c* 0i un (i0ier antet*
denumit myclient+ =+ F comand Ma[e(ile sim"l "entru construirea acestui "rogram se "oate "rezenta ast(elD
&& gcc
,A&LU1ES 2,CusrClocalCincludeCmysNl
L,JS 2LCusrClocalCli/CmysNl 2,mysNlclient
allD myclient
main+oD main+c myclient+=
]9&&: 2c ]9,A&LU1ES: main+c au!+oD au!+c myclient+=
&ontinuare
2E0 Partea a ll2a Utilizarea inter(e'elor de "rogramare ale sistemului MySQL
&ontinuare
]9&&: 2c ]9,A&LU1ES: au!+c
myclientD main+o au!+o
]9&&: 2o myclient main+o au!+o ]9L,JS:
cleanD
rm 2( myclient main+o au!+o 1ac )n sistemul dumnea%oastr este necesar legarea /i/liotecii de (ormule
matematici modi(ica'i %aloarea "arametrului L,JS* adug3nd 2,m la s(3r0itD
L,JS 2LCusrClocalCli/CmysNl 2,mysNlclient 2,m 1ac a%e'i ne%oie 0i de alte /i/lioteci* cum sunt 2,soc[et sau
2,n0i* aduga'i2le 0i acestea la o"'iunea L,JS+
6olosind Ma[e(ile* % "ute'i reconstrui "rogramul ori de c3te ori modi(ica'i %reuna din (i0ierele surs* "rin
sim"la tastare a e!"resiei 8ma[e8+ Este un "rocedeu mai sim"lu 0i "u'in su"us la erori dec3t dac tasta'i o
comand gcc lung+
&lient l 2 &onectarea la ser%er
Primul nostru "rogram client MySQL este c3t se "oate de sim"luD se conecteaz la un se se deconecteaz 0i )0i
)nc=eie e!ecu'ia+ ;cest "rogram nu este (oarte util )n sine* dar tret s 0ti'i cum s e(ectua'i o"era'iile res"ecti%e*
deoarece* )nainte de a "utea e!"loata e(ecti%> orice mod o /az de date MySQL* tre/uie s (iri conectat la un
ser%er+ ;ceasta este o o"e 'ie at3t de comun* )nc3t %e'i (olosi "rogramul "e care )l crea'i "entru a sta/ili o
cone!ul la (iecare client "e care )l %e'i scrie+ 1e asemenea* aceast sarcin ne "ermite s )nce"e la ce%a sim"lu+
Putem e!tinde ulterior "rogramul client* "entru a e!ecuta o"era'ii utile+ V-
Sursa "entru "rimul nostru "rogram client* clien'i* este com"us dintr2un singur (i0ii clien'i+cD
C@ client.+c @C
>include #stdio+=$ >include #mysNl+=$
ide(ine de(_=ost_name AULL ide(ine de(_user_name AULL
t(de(ine de(_"assMord AULL t(de(ine de(_d/_name AULL
MWSQL @connV
C@ gazda la care se %a sta/ili cone!iuni 9%aloare "resta/ilita local=ost:
C@ nume utilizator 9%aloare
"resta/ilita numele dumnea%oastr :X de desc=idere a sesiunii de lucru:
C@ "arola 9%aloare "resta/ilita nici+ ] una: @C
C@ /aza de date de utilizat 9%aloare "resta/ilita nici una: @C
C@ "ointer s"re %aria/ila de tratare a cone!iunii @C
&a"itolul ^ ,nter(a'a ;P, MySQL "entru & 2E<
int
main 9int argc* c=ar @arg%gX:
j
conn mysNl_init 9AULL:V mysNl_real_connect 9 conn*
de(_=ost_name*
de(_user_name* de( >"assMord* de(_d/_name* F*
AULL*
0:V
mysNl_close 9conn:V e!it9F:V
C@ "ointer s"re %aria/ila de
tratare a cone!iunii @C C@ gazda la care se %a sta/ili
cone!iunea @C
C@ numele utilizatorului @C C@ "arola @C
C@ /aza de date de utilizat @C C@ "ort 9se %a (olosi %aloarea
"resta/ilita: @C C@ soclu 9se %a (olosi
%aloarea "resta/ilita: @C C@ indicatoare 9nici unul: @C
6i0ierul surs )nce"e "rin a include stdio+= 0i mysNl+=+ &lien'ii MySQL "ot include 0i alte (i0iere antet* dar* )n
general* acestea dou constituie minimul necesar+
Lalorile "resta/ilite "entru numele gazdei* numele utilizatorului* "arola 0i numele /azei de date sunt codate =ard
)n "rogram* "entru sim"litate+ Ulterior* %om "arametriza aceste %alori* ast(el )nc3t dumnea%oastr s le "ute'i
s"eci(ica )n (i0iere cu o"'iuni sau )n linia de comand+
6unc'ia main 9 : a "rogramului ini'iaz si )nc=eie cone!iunea cu ser%erul+ Sta/ilirea unei cone!iuni este un
"roces com"us din dou eta"eD
<+ ;"elarea (unc'iei mysNl_init9: "entru a o/'ine o %aria/il de tratare a cone!iunii+ Bi"ul de date MWSQL este o
structur care con'ine in(orma'ii des"re o cone!iune+ Laria/ilele de acest ti" se numesc %aria/ile de tratare a
cone!iunii+ &3nd trans(era'i o %aloare AULL (unc'iei mysNl_init9 :* aceasta aloc o %aria/il MWSQL* o
ini'ializeaz 0i returneaz un "ointer la aceasta+
2+ ;"elarea (unc'iei mysNl_real_connect9: "entru a sta/ili o cone!iune cu ser%erul+ 6unc'ia
mysNl_real_connect9 : ia o mul'ime de "arametriD
5 Un "ointer s"re %aria/ila de tratare a cone!iunii+ ;cesta tre/uie s (ie AULLV tre/uie s (ie %aloarea returnat
de my sNl_init 9 : V
5 7azda ser%erului+ 1ac s"eci(ica'i AULL sau gazda 8local=ost8* clientul se conecteaz la ser%erul care ruleaz
"e gazda local* (olosind un soclu UA,P+ 1ac s"eci(ica'i un nume al gazdei sau o adres ,P a gazdei* clientul se
%a conecta la gazda s"eci(icat (olosind o cone!iune B&PC,P+
)n WindoMs* com"ortarea este similar* cu deose/irea c )n locul soclurilor UA,P se (olosesc cone!iuni B&PC,P*
9)n WindoMs AB* )nainte de B&PC,P se )ncearc o cone!iune (olosind un canal denumit* dac gazda este AULL+:
2E2 Partea a ll2a Utilizarea inter(e'elor de "rogramare ale sistemului MySQL
5 Aumele de utilizator 0i "arola+ 1ac numele este AULL* /i/lioteca client i ser%erului numele dumnea%oastr de
desc=idere a sesiunii de lucru* "arola este AULL* nu se %a trimite nici o "arol+
5 Aumrul "ortului si (i0ierul soclu+ ;cestea sunt s"eci(icate ca (iind F* res" ti% AULL* "entru a indica
/i/liotecii client s20i (oloseasc %alorile "resta/i( 1ac "ortul 0i soclul nu sunt s"eci(icate* %alorile "resta/ilite
sunt deterr )n con(ormitate cu gazda la care dori'i s % conecta'i+ 1etaliile acestei ra'ii sunt date )n descrierea
(unc'iei mysNl_real_conriect9: din ;ne!a 6+ 4
5 Laloarea indicatorilor 9(lags:+ ;ceasta este F* deoarece nu (olosim nici u de o"'iuni de cone!iune s"eciale+
F"'iunile care sunt dis"oni/ile "entruV "arametru sunt discutate mai detaliat )n in(orma'iile re(eritoare la
mysNl_real_connect 9: din ;ne!a 6+
Pentru a termina cone!iunea* transmite'i (unc'iei mysNl_close9: un "ointer la %a de tratare a cone!iunii+ F
%aria/il de tratare a cone!iunii care este alocat autor ctre mysNl_init9: este dealocat automat atunci c3nd
trans(era'i %aria/ila mysNl_close 9: "entru )nc=eierea cone!iunii+
Pentru a )ncerca "rogramul clien'i* com"ila'i2< 0i lega'i2< (olosind instruc'iunile "r 'a'e anterior )n ca"itolul de
(a' "entru construc'ia "rogramelor client* du" care D
Z clien'i
Programul se conecteaz la ser%er* se deconecteaz 0i )0i )nc=eie e!ecu'ia+ Au2i interesant* dar este un )nce"ut+
Botu0i* nu este dec3t un )nce"ut* de/arece e!i0ti #i nea4unsuri semni(icati%eD
5 &lientul nu e!ecut nici un (el de %eri(icare a a"ari'iei erorilor* deci nu 0ti'i@<O (unc'ioneaz sau nu.
5 Parametrii de cone!iune 9nume de gazd* nume de utilizator etc+: sunt coda'i l codul surs+ Este mai /ine s
"ermite'i utilizatorului s2i rede(ineasc* "rin s( carea "arametrilor )ntr2un (i0ier cu o"'iuni sau )n linia de
comand+
Aici una din aceste "ro/leme nu este di(icil de rezol%at+ Ae %om ocu"a de am/ urmtoarele c3te%a sec'iuni+
&lient 2 2 ;dugarea logicii de %eri(icare a a"ari'iei ei
&el de2al doilea client al nostru %a (i asemntor cu "rimul* numai c %a (i modi(ic tru a lua )n calcul
"osi/ilitatea a"ari'iei erorilor+ Este un o/icei (rec%ent ca )n "rogramare s se s"un HLeri(icarea a"ari'iei erorilor
este lsat ca e!erci'iu "ent tor8* deoarece %eri(icarea a"ari'iei erorilor este 2 s o recunoa0tem 2 o mare "lic &u
toate acestea* "re(er s "romo%ez "unctul de %edere con(orm cruia "rc client MySQL tre/uie s testeze
condi'iile de eroare 0i s reac'ioneze la acestea )c adec%at+ ;"elurile la /i/lioteca client care returneaz %alori de
stare "rocedeaz X dintr2un anumit moti%* iar dac dumnea%oastr le ignora'i* o (ace'i "e risc "ro"ris s(3r0i (ie
)ncerc3nd s de"ista'i "ro/leme o/scure care sur%in )n "rogramele du %oastr datorit ine!isten'ei unei %eri(icri
a a"ari'iei erorilor* (ie utilizatorii "rc lor dumnea%oastr se %or )ntre/a de ce "rogramele astea au luat2o razna*
(ieV
&a"itolul ^ inter(a'a ;P, MySQL "entru & 2EG
S lum )n considerare "rogramul nostru clien'i+ &um 0ti'i dac acesta s2a conectat sau nu la ser%er? ;'i "utea
a(la cut3nd )n 4urnalul ser%erului e%enimentele &onnect 0i Quit* care cores"und inter%alului de tim" )n care s>2a
rulat "rogramulD
RR0Q<^ 2<DQ2D<E 20 &onnect "auiei/(cal=ost on
20 Quit $
;lternati%* "ute'i %edea )n sc=im/ un mesa4 ;ccess denied 9acces interzis:D
RR0Q<^ 22D0<DET 2< &onnect ;ccess denied (or userD
<"auieiocal=ostO9Using "assMordDAF:
;cest mesa4 arat c nu a (ost sta/ilita nici o cone!iune+ 1in "cate* "rogramul clien'i nu ne s"une care dintre
aceste dou rezultate s2a "rodus+ 1e (a"t* nu "oate+ Au e!ecut nici o %eri(icare a a"ari'iei erorilor* deci nu 0tie
nici el ce s2a )nt3m"lat* )n orice caz* categoric nu tre/uie s e!amina'i 4urnalul "entru a a(la dac a'i reu0it sau nu
s % conecta'i la ser%er. S remediem c=iar acum "ro/lema+
Rutinele din /i/lioteca client MySQL care returneaz o %aloare indic* )n general* reu0ita sau e0ecul )ntr2unul din
urmtoarele dou moduriD
5 6unc'iile cu %alori "ointeri returneaz un "ointer di(erit de AULL "entru succes* res"ecti% AULL "entru e0ec+
9)n acest conte!t* AULL )nseamn HUn "ointer & AULL8 nu HF %aloare AULL dintr2o coloan MySQL8+:
1intre rutinele din /i/lioteca client "e care le2am (olosit "3n acum* mysNl_init 9: 0i
mysNl_real_connecrt#O:returneaz am/ele un "ointer al %aria/ilei de tratare a cone!iunii "entru a indica succesul*
res"ecti% AULL "entru e0ec+
5 6unc'iile cu %alori )ntregi returneaz de o/icei F "entru reu0it 0i o %aloare di(erit de zero "entru e0ec+ Este
im"ortant s nu se %eri(ice e!isten'a unor anumite %alori di(erite de zero* cum este 2<+ Au e!ist nici o garan'ie
c ^ (unc'ie din /i/lioteca client returneaz o anumit %aloare atunci c3nd e0ueaz+ Fcazional* "ute'i %edea
"rograme mai %ec=i* care testeaz incorect o %aloare returnat* ast(elD
i( 9mysNl_PPPj: 2<: C@ acest test este incorect @C
("rint( 9stderr* 8s2a)nt3m"lat ce%a raubn8:V
;cest test s2ar "utea s (unc'ioneze* dar s2ar "utea s nu (unc'ioneze+ ,nter(a'a ;P, MySQL nu s"eci(ic (a"tul c
orice eroare returnat di(erit de zero %a (i o anumit %aloare* )n a(ara
5 (a"tului c este di(erit de zero+ Bestul tre/uie scris ast(elD
, i( 9mysNl_PPP9:: C@ acest test este corect @C
5 ("rint( 9stderr* Os2a )nt3m"lat ce%a raubn8:V l sau ast(elD
5 i( 9mysNl_PPP9: < 0: C@ acest test este corect @C l ("rint( 9stderr* 8s2a )nt3m"lat
ce%a raubn8:V
l &ele dou teste surit ec=i%alenteV 1ac e!amina'i codul surs al sistemului MySQL )nsu0i*
5 %?'i o/ser%a c )n general se (olose0te "rima (orm a testului* care se scrie mai ra"id+
5 Au (iecare a"el ;P, returneaz o %aloare+ &ealalt rutin client "e care am (olosit2o*
5 mysNi_ciose9:* este una care nu returneaz nici o %aloare+ 9&urn>e a "utut ]+e0ueze?
5 ,ar dac a e0uat* ce2mi "as mie? Fricum ari terminat cone!iunea+:
2EE Partea a ll2a Utilizarea inter(e'elor de "rogramare ale sistemului MySQL
&3nd un a"el la o /i/liotec client e0ueaz 0i a%e'i ne%oie de mai multe in(orma'ii desV e0ec* dou a"eluri de
(unc'ii din inter(a'a ;P, sunt utile+ mysNl_error 9: returneaz 0ir care con'ine un mesa4 de eroare* iar
mysNl_errno9: returneaz un cod numeric eroare+ Bre/uie s a"ela'i aceste (unc'ii imediat du" a"ari'ia unei
erori* deoarece* dV emite'i un alt a"el ;P, care returneaz o stare* toate in(orma'iile de eroare "e care le L9 "rimi
de la (unc'iile mysNl_error9:sau mysNl_errno9: se %or re(eri la a"elul ulterior* 4
)n general* "entru utilizatorul unui "rogram 0irul de eroare este mai edi(icator dec4 codul de eroare+ 1ac %e'i
ra"orta numai una din cele dou in(orma'ii* ar (i /ine # aceasta s (ie 0irul+ 1in moti%e de com"letitudine*
e!em"lele din acest ca"itol ra"ort am/ele %alori+
Lu3nd )n considerare discu'ia anterioar* %om scrie al doilea "rogram client* client
;cesta este similar cu clien'i* dar con'ine )n "lus un "rogram adec%at de %eri(icat2l
a"ari'iei erorilor+ 6i0ierul surs* client2+c* se "rezint ast(elD
C@ client2+c @C
>include #stdio+=$ iinclude #mysNl+=$
ide(ine de(_=ost_name AULL de(ine de(_user_name AULL
t(de(ine de(_"assMord AULL ide(ine de(_d/_name AULL
C@ gazda la care se %a sta/ili
cone!iunea9%aloare
"resta/ilita local=ost: @C (- C@ nume utilizator 9%aloare OX
"resta/ilita numele dumnea%oastr
de desc=idere a sesiunii de lucru: @(i l@ "arola 9%aloare "resta/ilita
nici una: @C C@ /aza de date de utilizat 9%aloare
"resta/ilita nici una: @C
MWSQL @connV
C@ "ointer s"re %aria/ila de tratare a cone!iunii @C
int
main 9int argc* c=ar @arg%gX:
j
conn mysNlXLnit 9AULL: V
i( 9conn AULL:
("rint( 9stderr* 8mysNl_init9: ratat 9"ro/a/il din li"sa
de memorie: bn8:V e!it9<:V
i( 9mysNl_real_connect 9
conn* C@ "ointer s"re %aria/ila de
tratare a cone!iunii @C
&a"itolul ^ ,nter(a'a ;P, MySQL "entru & 2EQ
de(_=ost_name*
de(_user_name* de(_"assMord* de(_d/_name* 0*
AULL*
0:V AULL:
C@ gazda la care se %a sta/ili
cone!iunea @C
numele utilizatorului @C
"arola @C C@ /aza de date de utilizat @C
"ort 9se %a (olosi %aloarea
"resta/ilita: @C
soclu 9se %a (olosi
%aloarea "resta/ilita: @C
indicatoare 9nici unul: @C
C@ C@
("rint( 9stderr* 8mysNl_real_connect9: (ailedD bnError Zu 9Zs:bn8*
mysNl_errno9conn:* mysNl_error9conn::V e!it9<:V
mysNl_close 9conn:V e!it9F:V
Logica de %eri(icare a a"ari'iei erorilor se /azeaz "e (a"tul c at3t mysNl_init9: c3t 0i mysNl_real_connect9:
returneaz AULL dac e0ueaz+ Re'ine'i c* de0i "rogramul %eri(ic %aloarea returnat a (unc'iei mysNl_init9:*
dac aceasta e0ueaz nu este a"elat nici o (unc'ie de ra"ortare a erorilor+ ;ceasta deoarece nu se "oate
"resu"une c %aria/ila de tratare a cone!iunii %a con'ine in(orma'ii utile atunci c3nd mysNl_init 9: e0ueaz+ Prin
contrast* atunci c3nd mysNl_real_connect 9: e0ueaz* %aria/ila de tratare a cone!iunii nu mai re(lect o cone!iune
%alid* dar con'ine in(orma'ii de eroare care "ot (i transmise (unc'iilor de ra"ortare a erorilor+ 9Au transmite'i
%aria/ila de tratare altor rutine client. 1eoarece acestea "resu"un* )n general* c acea cone!iune este %alid*
"rogramul %a su(eri o cdere+:
&om"ila'i si lega'i "rogramul client2* du" care )ncerca'i s2< rula'iD
Z client2
1ac "rogramul client2 nu genereaz nici un (el de date de ie0ire 9a0a cum s2a artat anterior:* )nseamn c s2a
conectat cu succes+ Pe de alt "arte* s2ar "utea s %ede'i urmtorul rezultatD
Z clienta
mysNl_real_connect9: (ailedD
Error <0EQ 9;ccess denied (or userD O"aulSlocal=ostO9Using "assMordD AF:: ;cest rezultat arat c nu a (ost
sta/ilit nici o cone!iune 0i % "ermite s a(la'i moti%ul+ 1e asemenea* )nseamn c nici "rimul nostru "rogram*
client <* nu a reu0it s se conecteze la ser%er. 9La urma urmelor* client. a (olosit aceia0i "arametri de+cone!iune+:
La momentul res"ecti% nu am 0tiut acest lucru* deoarece clien'i nu s2a deran4at s %eri(ice a"ari'ia erorilor+
client2 e!ecut aceast %eri(icare* deci ne "oate anun'a dac se )nt3m"l ce%a gra%+ 1e aceea tre/uie )ntotdeauna
s testa'i %alorile returnate de (unc'iile ;P,+
Rs"unsurile la )ntre/rile din lista de cores"onden' "entru MySQL au (rec%ent legtur cu %eri(icarea a"ari'iei
erorilor* )ntre/rile caracteristice sunt H1e ce "rogramul meu cade
2E^ Partea a ll2a Utilizarea inter(e'elor de "rogramare ale sistemului MySQL
atunci c3nd emite aceast interogare?8 sau H&um se (ace c interogarea mea nu returne nici un rezultat?8* )n
multe situa'ii* "rogramul )n c=estiune nu a %eri(icat dac acea cone!iu a (ost sau nu sta/ilit cu succes )nainte de
a emite interogarea* res"ecti% nu a %eri(icat "en' a se asigura c ser%erul a e!ecutat cu succes interogarea )nainte
de a )ncerca s regse rezultatele+ Au (ace'i gre0eala de a crede c (iecare a"el la /i/lioteca client reu0e0te+
&elelalte e!em"le din acest ca"itol e!ecut %eri(icarea a"ari'iei erorilor* iar dumnea%oa tre/uie s "roceda'i la
(el+ S2ar "utea s %i se "ar mai mult munc* dar "e termen ,u este de (a"t mai "u'in* deoarece % "ierde'i mai
"u'in tim" cu de"istarea "ro/leme su/tile+ Loi (olosi aceea0i "rocedur de %eri(icare a a"ari'iei erorilor )n
ca"itolele i H,nter(a'a ;P, "entru Perl 1J,8* res"ecti% S* H,nter(a'a ;P, "entru PHP8+
;cum* s "resu"unem c a'i "rimit un mesa4 ;ccess denied c3nd a'i rulat "rog client2+ &um "ute'i remedia
"ro/lema? F "osi/ilitate este de a modi(ica liniile ide( i care con'in numele gazdei* numele utilizatorului 0i
"arola* inser3nd %alori care % "e s o/'ine'i accesul la ser%erul dumnea%oastr+ ;cest "rocedeu "oate (i /ene(ic*
)n se c mcar %e'i reu0i s sta/ili'i o cone!iune+ 1ar %alorile sunt )n continuare codate =a "rogramul
dumnea%oastr+ Sunt )m"otri%a acestei metode* mai ales )n ceea ce "ri%e %aloarea "arolei+ S2ar "utea s crede'i
c "arola de%ine ascuns atunci c3nd com"ila'i "t gramul )n (orm /inar* dar nu mai este ascuns deloc dac
cine%a "oate rula strings. "rogramul dumnea%oastr+ 9&a s nu mai %or/im de (a"tul c orice "ersoan cu acces #
citire la (i0ierul dumnea%oastr surs "oate o/'ine "arola (r s se osteneasc deloc+:>
Lom a/orda "ro/lema accesului )n sec'iunea H&lient E 2 F/'inerea "arametrilor@* cone!iune la rulare8+ Mai )nt3i*
a0 dori s % "rezint alte metode de scriere a "rogra lui de cone!iune+
&lient G 2 ,m"rimarea unui caracter modular asu"ra "rogramului de cone!iune
Pentru cel de2al treilea client* clienta* %om crea un "rogram de conectare 0i decone modular* "rin )nca"sularea sa
)n (unc'iile do_connect 9:* res"ecti% do_disconnect 9:* # "ot (i (olosite cu u0urin' de mai multe "rograme client+
;ceast metod o(er o alt ti% la )nglo/area literal a "rogramului de conectare )n (unc'ia dumnea%oastr m
Fricum* este o idee /un "entru orice "rogram care nu se modi(ic de la o a"lica''- alta+ ,nsera'i "rogramul )ntr2o
(unc'ie accesi/il din mai multe "rograme* )n loc +d' scrie )n (iecare "rogram+ 1ac remedia'i o =i/ sau dac
aduce'i (unc'iei o )m/unt- "ute'i (ace modi(icarea o singur dat* iar toate "rogramele care (olosesc (unc'ia %or
' (i remediate sau %or "utea /ene(icia de )m/unt'irea adus "rintr2o sim"l recom"u- 1e asemenea* unele
"rograme client sunt scrise de a0a manier )nc3t se "ot cone deconecta de mai multe ori "e durata e!ecu'iei lor+
Este mult mai sim"lu s scriettl asemenea client* dac im"rima'i "rogramului un caracter modular "rin inser'ia
mU melor de "ornire si o"rire )n interiorul (unc'iilor de conectare 0i deconectare+
Strategia de )nca"sulare (unc'ioneaz ast(elD <+ 1i%iza'i "rogramul comun )n (unc'ii container )ntr2un (i0ier surs
se"arat* denu4 common+c+
&a"itolul ^ ,nter(a'a ;P, MySQL "entru & 2ET
2+ 6urniza'i un (i0ier antet* common + =* care s con'in "rototi"uri ale rutinelor comune+
G+ ,nclude'i (i0ierul common + = )n (i0ierele surs ale clien'ilor care (olosesc rutine comune+
E+ &om"ila'i (i0ierele surs comune )ntr2un (i0ier o/iect+
Q+ Lega'i acel (i0ier o/iect comun la "rogramul dumnea%oastr client+
;%3nd )n %edere aceast strategie* s construim (unc'iile do_connect 9 : 0i do_disconnect 9 : +
6unc'ia do_connect 9 : )nlocuie0te a"elurile la (unc'iile my sNl_init 9 : 0i mysNl_real_con 2
nect9:* "recum 0i "rogramul de a(i0are a erorilor+ Pute'i denumi (unc'ia c=iar
mysNl_real connect 9:* cu deose/irea c nu2i trans(era'i nici o %aria/il de tratare a
cone!iunii+ ,n sc=im/* do_connect9: aloc 0i ini'ializeaz singur %aria/ila* iar a"oi
returneaz un "ointer s"re aceasta du" conectare+ 1ac do_connect 9 : e0ueaz* a(i0eaz
un mesa4 de eroare 0i returneaz AULL+ 9;st(el* orice "rogram care a"eleaz (unc'ia
do_connect 9 : si o/'ine o %aloare returnat AULL )0i "oate )nc=eia "ur si sim"lu e!ecu'ia*
(r a se mai deran4a s a(i0eze un mesa4+:
6unc'ia do_disconnect9 : "reia un "ointer s"re %aria/ila de tratare a cone!iunii 0i a"e2
leaz (unc'ia mysNl_close9 :+
,at liniile de "rogram ale (i0ierului common + cD
iinclude #stdio+=$
>include #mysNl+=$
>include 8common+ =8
MWSQL @
do_connect9c=ar @=ost_name* c=ar @user_name* c=ar @"assMord*
c=ar @d/_name* unsigned int "ort_num*
c=ar @soc[et_name* unsigned int (lags:
MWSQL @conn
C@ "ointer s"re %aria/ila de tratare a cone!iunii @C
conn mysNl_init 9AULL:V C@ aloca* ini'ializeaz %aria/ila de
tratare a cone!iunii @C i( 9conn AULL:
j
("rint( 9stderr* 8mysNl_init9: (ailedbn8:V return 9AULL:V
k
i( 9mysNl_real_connect 9conn* =ost_name* user_name* "assMord* d/_name* "ort_num* soc[et_name* (lags:
AULL:
j
("rint( 9stderr* 8mysNl_real_connect9: (ailedD bnError Zu 9Zs:bn8*
mysNl_errno9conn: * mysNl_error9conn: : V return 9AULL:V
return9conn:
C@ cone!iunea a (ost sta/ilita @C
&ontinuare
2ES Partea a ll2a Utilizarea inter(e'elor de "rogramare ale sistemului MySQL
&ontinuare
%oid
do_disconnect 9MWSQL @conn:
j
mysNl_close9conn:V
k 6i0ierul common+= declar "rototi"urile "entru rutinele din (i0ierul common+cD
MWSQL @
do_connect9c=ar @=ost_name* c=ar @user_name* c=ar @"assMord* c=ar @d/_name* unsigned int "ort_num* c=ar
@soc[et_name* unsigned int (lags:V
%oid
do_disconnect 9MWSQL @conn:V
Pentru a o/'ine accesul la rutinele comune* include'i (i0ierul common+ = )n (i0ierele dr nea%oastr surs+ Re'ine'i
c (i0ierul common+c include 0i (i0ierul common+=+ ;st(elC de(ini'iile de (unc'ii din common+ c nu cores"und
declara'iilor din (i0ierul antet* %e'i "r imediat un a%ertisment de la com"ilator+ 1e asemenea* dac modi(ica'i o
sec%en'ial a"elare din common+ c (r a (ace sc=im/rile de rigoare )n (i0ierul common+ =* atunci # recom"ila'i
common+ c %e'i "rimi un a%ertisment de la com"ilator+
Este a/solut normal s % )ntre/a'i de ce s2a in%entat o (unc'ie container* 0i ami do_disconnect 9:* care e!ecut
at3t de "u'ine o"era'ii+ Este ade%rat c do_disconned 0i mysNl_close 9: sunt ec=i%alente+ 1ar s "resu"unem c*
la un moment ulterior* c s (ace'i o oarecare cur'enie su"limentar de (iecare dat c3nd % deconecta'i* a"elarea
unei (unc'ii container asu"ra creia a%e'i un control total* "ute'i modi( aceast (unc'ie ast(el )nc3t s e!ecute
o"era'iile "e care le dori'i* iar modi(icrile int (unc'iune )n acela0i mod "entru toate o"era'iile de deconectare "e
care le e!ecuta'i?. "ute'i (ace acest lucru dac in%oca'i direct (unc'ia mysNl_close9:+
;nterior* am a(irmat c este /ene(ic Hmodularizarea8 "rogramelor (rec%ent (olosite b )nca"sularea lor )ntr2o
(unc'ie care "oate (i (olosit de mai multe "rograme* res"ecti% b mai multe locuri din interiorul unui singur
"rogram+ Paragra(ul "recedent a o(erit un i "entru aceast o"era'ie* iar urmtoarele dou e!em"le %or (urniza
4usti(icri su"liment
5 E!em"lul <+ )n %ersiunile MySQL anterioare seriei G+22* a"elul la (unc'ia mysNl_real_ nect 9: era u0or di(erit de
%arianta actualD nu e!ista nici un "arametru care s ir numele /azei de date+ 1ac dori'i s (olosi'i (unc'ia
do_connect 9: cu o /i/liotec i MySQL mai %ec=e* acest lucru nu este "osi/il+ Botu0i* este "osi/il modi(icareaV
do_connect 9: ast(el )nc3t s "oat (unc'iona cu instalri ale sistemului MySQL ant %ersiunii G+22+ ;ceasta
)nseamn c* "rin modi(icarea (unc'iei do_connect9:* "ute'i l ni%elul de "orta/ilitate al tuturor "rogramelor care o
(olosesc+ 1ac )nglo/a'i literal l gramul de conectare )n (iecare client* tre/uie s modi(ica'i (iecare client )n "arte+
Pentru a remedia (unc'ia do_connect 9: ast(el )nc3t s "oat lucra cu (orma mai %# a (unc'iei mysNl_real_connect
9:* (olosi'i macroinstruc'iunea MWSQL_LERS,FA_,1* - con'ine numrul curent al %ersiunii MySQL+ 6unc'ia
do_connect9: modi( testeaz %aloarea "arametrului MWSQL_LERS,FA_,1 0i (olose0te (orma cores"unzt- a
(unc'iei mysNl_real_connect9:D
&a"itolul ^ ,nter(a'a ;P, MySQL "entru & 2ER
MWSQL @
do_connect9c=ar @=ost_name* c=ar @user_name* c=ar @"assMord*
c=ar @d/_name* unsigned int "ort_num*
c=ar @soc[et_name* unsigned int (lags:
j
MWSQL @conn C@ "ointer s"re %aria/ila de tratare a cone!iunii @C
conn mysNl_init 9AULL:V C@ aloca* ini'ializeaz %aria/ila de
tratare a cone!iunii @C i( 9conn AULL: j
("rint( 9stderr* 8mysNl_init9: (ailedbn8:V
return 9AULL:V
k ii( de(ined 9MWSQL_LERS,FA_,1: ll MWSQL_LERS,FA_,1 $ G2200
C@ %ersiunea G+22 si %ersiunile ulterioare @C i( 9mysNl_real_connect 9conn* =ost4iame* user4riame* "assMord*
d/_name* "ort_num* soc[et_name* (lags: AULL:
j
("rint( 9stderr* 8mysNl_real_connect9: (ailedD bnError Zu 9Zs:bn8*
mysNl_errno9conn: * mysNl_error9conn:: V return9AULL:V
k
ielse C@ "entru MySQL anterior %ersiunii G+22 @C
i( 9mysNl_real_connect 9conn* =ost4iame* user_name* "assMord* "ort_num* soc[et_name* (lags: AULL:
j
("rint( 9stderr* 8mysNl_real_connect9: ( ailedD bnError Zu 9Zs:bn8* mysNl_errno9conn:* mysNl_error9conn::V
return9AULL:V k i( 9d/4iame . AULL: C@ simularea e(ectului "arametrului d/_name @C
j
i( 9mysNl_select_d/ 9conn* d/_name: . 0:
j
("rint( 9stderr* 8mysNl_select_d/j: ( ailedD bnError Zu
9Zs:bn8* mysNl_errno9conn:* mysNl_error9conn:: V mysNl_close9conn: V return9AULL:V
iendi(
return 9conn:V C@ cone!iunea a (ost sta/ilita @C

S-ar putea să vă placă și

  • Mysql 350
    Mysql 350
    Document28 pagini
    Mysql 350
    Lupu Adrian
    Încă nu există evaluări
  • Mysql 250
    Mysql 250
    Document29 pagini
    Mysql 250
    gabrielgabor22
    Încă nu există evaluări
  • Mysql 150
    Mysql 150
    Document30 pagini
    Mysql 150
    Lucian Musteata
    Încă nu există evaluări
  • Mysql 100
    Mysql 100
    Document32 pagini
    Mysql 100
    Виктор Которобай
    Încă nu există evaluări