Professional Documents
Culture Documents
n/ oo
<{
(.)
>N
....,
~<
My
S~
Press
<{~
z-,
w
Obl.t\ 1: l\o11r pndoliolkol
Prirunik
za MySQ
Prirunik ~a MySQL
Rc.ccn1enL
Urednik
ltrd.lktori
Tehniki urednik
Korektor
Realizacija korica
l'rclom tc Ima i obrada slika
Izdava
l ul Vlling (Luke Wclling) predaje u koli za raunarske nauke i informacione tehnolPl'- 'll' ttniwr;ritct:-t RMIT u Melburnu, Australija. Kad god smatra da je izvodljivo, opretl IJIIJt' Sl' "a softver otvorenog koda i nastoji da objasni prednosti takvog reenja to
"' 111 ~ lllp;u korisnika. Na predavanjima u Australiji, Severnoj Americi i Evropi, objaIIJIV.lll .Jl' MySQL, PHP i druge teme iz oblasti softvera otvorenog koda. Studentima
1 11111 llJ .lCIIlla drao je predavanja iz raznih oblasti, ali ua specijalnost mu je Internet.
Direktor
tampa
O autorima
Dragan Tanaskoski
Olga Milanka
Aleksandra Stojanovi i Stela Spa.i
Sanja Tasi
Vesna uki
Vladimir Konarevi
Sanja Tasi
Milica Deanski
Beograd
Ako imate pitanja ili komentare, ili ako elite da dobijete besplatan katalog, piite nam ili se javite:
Mikro knjiga
l~ t:th 20-87
11030 Beograd
tel: t l /3540-544
Mikro knjiga
Jevrejska bb
78000 Banja Luka
tel: 051/220-960
Mikro knjiga
Maksimirska 13
10000 Zagreb
tel: 01/2344-023
pismamikroknjiga . co.yu
pismamikroknjiga.ba
pismamikroknjiga . hr
,,,,J.,~tt
Copyright 2005 Mikro knjiga. Sva prava zadrana. Nije dozvoljeno da nijedan deo ove knjige bude reprodukovan
di rm i tovan na bilo koji nain, elektronski ili mehaniki, ukljuujui fotokopiranje, snimanje ili bilo koji drugi sistem
~.l bdccnje, bez prethodne pismene dozvole izdavaa.
Authorized translation from the English language edition, entitled MYSQL Thtorial, lst Edition byWELLING,
LUKE; THOMSON, LAURA, published by Pearson Education, Inc., publishing as MySQL Press, Copyright 2004.
All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or
nll'chanical, including photocopying, recording or by any information storage retrieval system, without permission from
l'r.mon Education, Inc.
004.655.3(035)
004.652.4(035)
BEJ111Hr, nyK
Prirunik za MySQL l Luke Welling, Laura
Thomson ; preveo Andon Kartalovski. Beograd : Mikro knjiga, 2005 (Beograd :
Publikum). - XI, 251 str. : ilustr. ; 24
cm
KN lio
ISBN 86-7555-271-8
l. TOMCOH, napa
a) nporpaMCKH je3HK "SQL" - Prirunici b}
Penau.11oue 6aJe noAaTaKa - Ynpaslbaihe npHpY'IHlll(H
COBISS.SR- ID t 22074124
MSQL/251/1280412M33010P78S6K54 S 4 3 2 1
Od istih autora
Meu
1'111 1 i MySQL
l
lltvo~J
l'lrk.tcija zn Web
a draj
Uvod . . . . . . . . .
. 1
Osnove MYSQL-a
. 9
Instaliranje MySQL-a
11
Kratak obilazak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Struktura MySQL-ovih direktorijuma ............................ .. 19
Pregled izvrnih datoteka ....................................... 20
Pregled korisnikih interfejsa .................................... 21
Kratak uvod u MySQL monitor .................................. 22
Saetak .................................................... 23
27
29
63
65
Sloeniji upiti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Upotreba spojeva u upitima koji obuhvataju vie tabela . ... ............. 93
Vrste spojeva izmeu tabela ...... . .. ............... ... ...... . .. . 97
Podupiti ........... ...... .......... . . . ..... . ............... 99
Opcije komande SELECT.: .. ..... .. .... . .. . ........ . .. .... ... 103
Saetak ........... . .. . ....... . ... . ... . .. .. .... . . , ......... 104
ll <J
120
121
121
122
125
127
I~AM
155
157
VI Optimizovanje MySQL-a . . . . .
219
221
Prevoenje
u knjizi .
241
Indeks . . . . . . . . . . . . . . . . . . . .
243
Spisak termina
korienih
Uvod
D~
PRIRUNIK
1111
lill O DOLI U
omogui
buduim
verzijama
Zbog
ega
"'<)L je odlian proizvod iz oblasti baza podataka. Postoji vie razloga zbog kojih
l11 lt' \l! opredelili da MySQL bude va server baza podataka.
MySQL je brz i stabilan. To je kljuni razlog njegove popularnosti. Februara 2002.
!ullltL', asopis eUiek (www. eweek. com) napravio je uporednu studiju nekoliko
tt.qv t/nijih sistema za rad s bazama podataka, koja je obuhvatila Oracle, Microsoftov
1 ll Sl'rvcr, DB2 i MySQL. U toj studiji, MySQL i Oracle 9 dobili su najvie ukupne
H t' Ill' . l'ri tome je upotrebljena alfa verzija MySQL-a 4.0, a MySQL 4.1 je jo bri.
M ySQL je na raspolaganju i kao besplatan i kao komercijalni softver. Ce o MySQL
1111 tZt' st: nabaviti pod uslovima GNU opte javne licence (General Pu blic License,
l .1'1.), .di ukoliko vam je potrebna komercijalna licenca, moete je kupiti.
MySQL prua veliku veinu mogunosti koje se smatraju vanim u oblasti baza
('ul.ti.lka, a to su transakcije, zakljuavanje na nivou pojedinanih redova, spoljni klju' l 1, podupiti i tekstualno pretraivanje.Verzija 5.0 e na ovaj spisak dodati i uskladil Ill' procedure.
MySQL omoguava dobru skalabilnost i koriste ga veoma zahtcvni klijenti kao to
11 Y.dlOo! Finance, Slashdot i US. Census Bureau.
MySQL je odlina opta alatka za uenje baza podataka jer se lako instalira i koristi,
1 Z.lutima malo prostora na disku i troi skromnu koliinu memorije.
Ukupno gledano, MySQL je odlian izbor za aplikacije baza podataka.
1)
Performanse
MySQL je neosporno brz. Oracle, Microsoft i IBM svaki ponaosob tvrde da prodaju
najbre baze podataka na svetu, to, u zavisnosti od vaeg stepena lakovernosti, samo
dokazuje jednu od sledee dve tvrdnje: programi za testiranje mogu se napisati tako da
rezultati dokazuju ta god naruilac programa zahteva, ili da se razliiti proizvodi
pokazuju kao savreni u razliitim uslovima upotrebe.
Na MySQL-ovj zvaninoj Web lokaciji moete pogledati rezultate poreenja performansi MySQL-a i drugih baza podataka. Ti podaci pokazuju da MySQL uglavnom
primctno nadmauje svoje takmace. Iako u naelu rezultate bilo kojeg testiranja treba
prihvata ti "sa zrnom soli", to naroito vai za rezultate testova koje je izvrio proizvoa baze podataka, svi dokazi na raspolaganju, ukljuujui i nezavisne testove, pokazuju da je MySQL jedan od najbrih proizvoda na raspolaganju.
Rezultate testiranja moete videti na Web lokaciji:
www.mysql.com/information/benchmarks.html
a ti podaci su priloeni i uz datoteke izvornog koda koje preuzim.ate, to vam omoguava da ih uporedite s rezultatima koje dobijete u svom radnom okruenju.
Rezultati testiranja koje je izveo asopis eWeek 2002. godine pokazali su da je
MySQL uporediv sa Oracleom kada se koristi kao pozadinska baza podataka za Web
aplikacije napisane na jeziku Java koje rade na Windows raunaru s etiri procesora.
Navedena dva proizvoda su nadmaila IBM-ov DB2, Microsoftov SQL Server i Sybaseov ASE. U nastavku ovog teksta bie vie rei o ce nama, ali vredi napomenuti da je
od svih proizvoda obuhvaenih tim testovima, jedan od najboljih bio besplatan, dok su
cene drugih bile reda veliine 160.000 dolara (40.000 dolara po procesoru).Vie detalja
o tome nai ete na Web adresi www. eweek. com/article2/0, 3959,293, oo. a sp.
Brzina je oduvek bila kljuna odlika o kojoj projektanti MySQL-a vode rauna.
U MySQL se ugrauju nove mogunosti samo ako nisu na tetu performansi. Zbog
toga se ponekad nove mogunosti dodaju sporije nego to to korisnici ele, ali se time
obezbeuje da MySQL uvek bude veoma brz. S tom tvrdnjom verovatno ete se i
sami sloiti na osnovu svog iskustva ili testova koje sami izvedete.
Cena
Cena je stavka koja se moda najlake poredi. Za mnoge uslove upotrebe, MySQL je
besplatna aplikacija. Uslovi licence tipa GPL omoguavaju da neogranieno koristite
softver, da menjate njegov izvorni kod i da MySQL distribuirate drugim ljudima
takoe pod GPL uslovima. U odreenim situacijama, npr. kada elite da distribuirate
MySQL kao sastavni deo komercijalnog proizvoda, moraete da kupite komercijalnu
li cenc u. Cena licence za jedan server je od 220 do 440 dolara (u vren~e pisanja ove
Stabil nost
Projektanti MySQL-a oduvek su smatrali da je stabilnost od prvorazrednog znaaja .
Sve verzije MySQL-a izdate u binarnom obliku - ak i alfa izdanja - moraju proi
MySQL-ov skup testova stabilnosti. Postupak obuhvata testiranje funkcija i drugih
osobina, kao i ispitivanje rezultata operacija pri kojima su u prolosti otkrivene i ispravljene greke, ime se obezbeuje da se nikad ponovo ne uvede ve ispravljena greka.
Ispravljanju greaka projektanti moraju da daju vii prioritet od drugih poslova.
U sutini, projektant prekida tekui posao sve dok se ne otkloni greka koja spada
u njegovu oblast strunosti. Pravilo nalae da svako izdanje MySQL-a mora biti oi
eno od dotad poznatih greaka koje se mogu reprodukovati u poznatim uslovima.
R.azume se, odreeni problemi ne mogu se reiti a da pri tom ne pro uzrokuju druge
probleme na drugom mestu. To naroito vai za produkcione verzije u koje ne bi trebalo ugraivati sutinske izmene koje bi mogle da utiu na stabilnost verzije. U takvim
sluajevima, problem se dokumentuje i otklanja u jednoj od narednih verzija.
I najzad, kvalitet softvera obezbeuju MySQL-ovi klijenti i zajednica korisnika.
Preko etiri miliona korisnika irom sveta rade u veoma razliitim okruenjima, to
prua jedinstvenu priliku za otkrivanje greaka ve u poetnim fazama razvoja. Budui
da je MySQL-ov sistem za otkrivanje i dokumentovanje greaka javan, svaki korisnik
ima uvid u sve to su drugi korisnici otkrili i moe da dodaje svoje napomene.
Lakoa
upotrebe
Druga kljuna odlika MySQL-a jeste lakoa upotrebe. Nije potreban sime.: n post upak
podeavanja da biste poeli da radite. MySQL server radi kako treba im ga "rasp~ku
jete". Standardne vrednosti parametara su takve da minimizuju utroak prostora na
disku i memorije. Razume se, da bi se postigle optimalne performanse odreenih
funkcija koje su vane u produkcionom okrue~ u. kao to je npr. prijavljiva~e korisnika za rad u bazu podataka, potrebno je finije doterivanje tih standardnih vrednosti
radnih parametara MySQL-a. Pri tome vam mogu pomoi primeri konfiguracionih
datoteka koje dobijate uz MySQL.
Mogunosti
okidae
ta je drugaije u My
-u 4.0 i 4.1
MyS )L 3.23 je dugo hio J111HIIIkt 11111.1 V lii:ij ,l , M.11t.1 2003. godine izdat je MySQL
1 O, 13, kao produkcion.1 Vl'11ij.1 l () All.1 Vl'lli,J.I 11.1 11.data je aprila iste godine.
Ako ste koristili veri. lJ ll \ ~> \, 11 Vl' lilJI tl .O uoiete sledee znaajnije izmene:
U standardnu binarnu verziju ugrad ena je maina baze podataka Inn oD B, koja je
ve bila ugraena u neke kasnije verzije 3.23. Maina baze podataka InnoDB
podrava pravila ACID, to znai da podrava transakcije, spoljne kljueve i
zakljuavanje na nivou redova tabele.
MySQL sada koristi ostavu (ke) za upite, u koju smeta rezultate upita za kasniju
ponovnu upotrebu, ime znatno poboljava performanse uobiajenih upita.
Tekstualno pretraivanje i indeksiranje, koji su dodati u verziji 3.23.23, poboljani su dodava~em opcije Boolean.
Tabele tipa MERGE sada podravaju komande INSERT i polja AUTO_INCREMENT.
Skupovi rezultata dobijeni
opcije UNION .
pomou
upita
SELECT
pomou jedne
pomou
komande
DELETE.
N,1 kraju svakog poglavlja, nalazi se niz pitanja i praktinih vebi u vezi s gradivom
poglavlja, da biste mogli da provebate ono to ste nauili u poglavlju.
hl Lp://www.gnu.org/licenses/
na:
nai ete
http://www .gnu.org/licenses/gpl-faq.html
I
Osnove MYSQL-a
Instaliranje MySQL-a
2 Kratak obilazak
1
Instaliranje MySQL-a
111 upotrebe.
Obradiemo sledee
uobiajen
l11staliranje na Linux
l11staliranje na Windows
l11staliranje na OS X
Podeavanje sistema
z~davanje
Instaliranje na Linux
U zav_is.nosti od verzije ~inuxa koju imate i od toga koliko je svea, vrlo je verovatno
da vec Jmate neku verZljU MySQL-a instaliranu na svom raunaru, ali je takoe vrlo
verovatno da to nije najnovija verzija.
Prepor~~jemo da i~stalira~e MySQL iz MySQL-ove RPM datoteke, pod uslov.~m da vas SJStem podrzava taj format pakovanja. Savetujemo vam da upotrebite verZljU RPM datoteke koju preuzmete sa MySQL-ove We b lokacije, a ne RPM
datoteku koju vam je isporuio proizvoa vae distribucije Linuxa, naroito ako tek
po~i~~ete uenje .MySQL-a. Binarne verzije na MySQL-ovoj Web lokaciji auriraju
se cesc: n~go . u b1lo kojoj v distribuciji Linuxa, to znai da su u njih ugraena najnovija
poboljsanja J 1spravke gresaka . Osm1 toga, struktura direktorijuma na vaem raunaru
bie podeena kako je opisano u MySQL-ovoj dokumentaciji, to e vam za poetak
svakako olakati traenje informacija.
_Jedna distribucija se sastoji od vie RPM datoteka. Da biste mogli da koristite
klljent 1 server verzije MySQL-a, potrebne su vam datoteke MySQL-server- VERZljA.i386.rpm, MySQL-Max- VERZljA.i386.rpm i MySQL-client- VERZljA.i386.rpm. (Re VERZijA bie zamenjena odgovarajuim brojem verzije.)
Server i klijent moete instalirati ako u komandnom okruenju otkucate sledeu
komandu:
Instaliranje na Windows
~a biste instalirali MySQL na neku noviju verziju Windowsa, morate se najpre prijaVltl na s1stem kao administrator.
Akvo ve !mate .instalira~ u neku verziju MySQL-a, morate zaustaviti server pre
nego sto pocnete mstal1ra11Je nove verzije. To se radi pomou sledee komande:
l\\ n/L' bttt polrtbno d.t myoq l cl'/;IIIICililc imenom prvobitne binarne verzije servera
l"111
\lt'
tl .ql t' Services Manager, koja je na raspolaganju u Control Panelu, u grupi Admini1! .111 vc Tools Services, ili na nekim sistemima, u prozoru alatke Microsoft Managelitt tll Console.
ltllajte u vidu da postupak instaliranja MySQL-a moe biti prilino sloen i moe
t.tllikovati od onog koji moda poznajete iz verzija MySQL-a koje ste ranije instal~t ,tll 11~ svojoj verziji Windowsa. Zaponite instaliranje raspakivanjem .zip datoteke
lt tp 1 ste preuzeli sa We b lokacije.
lJ zavisnosti od trenutka kada ovo budete itali, sadraj te datoteke moe biti drugaql. U vreme pisanja ove knjige, MySQL se instalirao pokretanjem datoteke setup.exe.
~ \ d utim, MySQL AB, kompanija koja je autor MySQL-a, planira MSI verziju instala' tnttog programa. Ako umesto datoteke setup.exe, imate .msi datoteku, MySQL ete
111\t.tl1rati tako to dvaput pritisnete ime MSI datoteke.
In stalacioni program e vam ponuditi opciju da instalira MySQL u podrazumevani
l11 d;.torijum (c:\mysql) ili u neki drugi. U ovoj knjizi pretpostavljamo da ete ga
111\t.llirati u podrazumevani direktorijum.
Poto instalirate MySQL, treba da napravite datoteku s parametrima koji odreuju
potetnu konfiguraciju MySQL-a. Trebalo bi da to obavite pre nego to prvi put
pokrenete server. Vie detalja o podeavanju sistema nai ete u odeljku "Podeavanje
!'lema", u nastavku ovog poglavlja.
Poto podesite parametre sistema, korisno je da server prvi put pokrenete s
~ omandne linije. (U nastavku ovog poglavlja objasniemo kako se MySQL instalira
~ .10 Windowsov servis, ali pogledajmo prvo da li uopte radi.)
Otvorite prozor komandne linije i preite u direktorijum u koji ste instalirali
MySQL. Ako imate standardnu instalaciju, to e biti c:\mysql\bin.
Otkucajte
sledee:
mysqld-max --standalone
Trebalo bi da se nakon toga prikae grupa poetnih poruka. Ako je dosad sve
u redu, moete instalirati MySQL kao Windowsov servis.
Otkucajte ime izvrive datoteke servera koju nameravate da koristite, a zatim i
opciju --install. Na primer:
mysqld-max --install
U ovoj knjizi preporuujemo izvrivu datoteku mysqld-max.
Da bi vaa instalacija MySQL-a postala potpuno funkcionalna, preostaje vam da
obavite jo jedan, poslednji posao. Poto su neki od programa pridruenih MySQL-u
zapravo skriptovi napisani na jeziku Perl, potrebna vam je i Perl maina da bi ti programi mogli da rade. Preuzmite i instalirajte ActivePerl sa Web lokacije ActiveState:
www.activestate.com/Products/ActivePerl/
Instaliranje na OS X
MySQL moete instalirati na OS X iz odgovarajueg paketa, pod uslovom da imate
OS X 10.2 ili noviji.
Ako ve imate neku verziju MySQL servera koja je aktivna na vaem raunaru,
morate je zaustaviti pre nego to zaponete instaliranje nove verzije. To moete uraditi tako to na komandnoj liniji otkucate sledeu komandu:
mysqladmin -u root -p shutdown
Da biste mogli da pokrenete server, potreban vam je korisniki nalog ije je ime
mysql. Ako imate OS X 10.2 ili noviji, taj nalog ve postoji.
S MySQL-ove Web lokacije treba da preuzmete .dmg datoteku- tj. datoteku slike
diska. Prvo otvorite Finder, a zatim dvaput pritisnite .dmg datoteku.
Pojavie se sadraj datoteke slike diska. Pronaite PKG datoteku i dvaput je pritisnite. Za potrebe ove knjige moete prihvatiti sve vrednosti opcija koje vam instalacioni program ponudi.
MySQL moete podesiti tako da se automatski pokree pri podizanju sistema, tako
to dodate Startupitem. To moete uraditi ako dvaput pritisnete datoteku MySQLStartupltem.pkg koja bi trebalo da se nalazi u vaoj .dmg datoteci.
Poto izvrite postupak opisan u odeljku "Podeavanje sistema", moete pokrenuti
MySQL server tako to otkucate sledeu komandu, pod uslovom da ste instalirali Startup Item:
sudo /Library/Startupitems/MySQL/MySQL start
Ako niste instalirali Startupltem, server moete pokrenuti
komandi:
pomou sledeeg
niza
cd /usr/local/mysql
sudo ./bin/mysqld_safe
Pritisnite Ctrl+Z. I najzad, otkucajte
sledeu
komandu:
bg
Ako niste instalirali Startupitem, morate ponoviti ove korake kad god pokreete
svoj sistem i elite da koristite MySQL.
Imajte u vidu da postupak instaliranja MySQL-a moe biti prilino sloen i moe
se razlikovati od onog koji moda poznajete iz verzija MySQL-a koje ste ranije instalirali, ili moe biti drugaiji na vaoj verziji OS X-a.
Podeavanje sistema
Poetna
MySQL smeta vrednosti konfiguracionih parametara u datoteku opcija. Ako koriWindows, globalnu datoteku opcija moete smesti ti u Windowsov sistemski
oi ill ktor uum i nazvati je my.ini, ili u e: \my.cnf. Preporuujemo da koristite my. ini jer
II.IStavak .cnf ponekad koristi za datoteke drugih aplikacija.
U operativnim sistemima iz porodice Unix, globalna datoteka opcija obino je
.llii'tena u direktorijum /etc/my.cnf. Ako elite da na istom raunaru radi vie
r-- lySQL servera, podatke za svaki server moete uvati u zasebnoj datoteci my.cnf
lllt'tenoj u direktorijumu data svakog servera. Osim toga, moete dozvoliti korisni' 1111,1 da za svoje naloge imaju individualne opcije, koje bi trebalo da budu smetene u
ol1tntcci -/.my.cnf(obratite panju na taku ispred imena datoteke).
U zavisnosti od vae instalacije, moda u poetku neete ni imati datoteku opcija.
t ltvorite tu datoteku u svom uobiajenom editoru za tekst- Notepad e sasvim lepo
nh.1viti posao ako koristite Windows- ili je napravite ako ne postoji.
Predlaemo vam datoteku opcija sa sledeim poetnim opcijama (listing 1.1):
lit t
l h ting 1.1
tmysqld]
ll aktiviranje dnevnika izmena i dnevnika sporih upita
tog bin
log-slow-queries
# Podesite .. flush_log_at_trx_commit
# na O ako moete da prihvatite gubljenje
# nekoliko poslednjih transakcija
innodb_flush_log_at_trx_commit=1
Vei deo sadraja ove datoteke opcija zasniva se na veoma jednostavnoj konfiguracionoj datoteci za upotrebu Inn o DB tabela, koja je predloena u MySQL-ovoj dokumentaciji. Ako imate postojeu instalaciju u kojoj se koriste InnoDB tabele i dodate
joj ovu datoteku opcija, moda ete morati da pretvorite u komentar sledei red:
set-variable = innodb_log_file_size=20M
Kao to ste verovatno uoili ako ste se upravo prijavili na server, moral1 ste da. zadate
une korisnika- root - ali ne i lozinku. U svakoj instalaciji MySQL-a, u pocetku
n:tlog root nema lozinku. Iz oiglednih bezbednosnih razloga, veoma je vano da tom
ualogu dodelite lozinku. U MySQL monitoru otkucajte sledee:
tako to
ete
to znai da MySQL server ne radi. Pokuajte ponovo da pokrenete sistem da bi se server automatski pokrenuo zajedno s njim, ili runo pokrenite server pomou komande:
mysqld --standalone
na komandnoj liniji. (To ete najlake uraditi u jednom prozoru, a zatim otvorite
drugi prozor iz kojeg ete se prijaviti na server.)
mysql -u root -p
MySQL e zatraiti da zadate svoju lozinku. Parametar -u znai ime korisnika,
;1
. ..
Pri instaliranju, MySQL automatski pravi nekoliko anonimnih naloga .za koje mje
potrebno zadavanje imena korisnika prilikom prijavljivanja.' Pr~poruujemo vam da te
naloge izbriete. Razlozi zbog kojih treba da to uradtte optsam su u poglavlju 15 .
"Zatita MySQL servera", u odeljku "Brisanje anonimnih naloga". Te naloge mo zete
ukloniti pomou sledeeg niza komandi:
use mysql;
delete from user where User='';
delete from db where User='';
(lush privileges;
.. .
svakod-
Pomou sledee komande napravite nov nalog koji ete koristiti za svakodnevne
poslove:
Kratak obilazak
Razume se, umesto rei imekorisnika i lozinka, u tekst komande treba da upiete
svoje korisniko ime i odgovarajuu lozinku.
Trebalo bi da se sada odjavi te sa servera, pa ponovo prijavite na njega pod imenom
korisnika i lozinkom koje ste zadali. U nekim od zavrnih poglavlja ove knjige moraete da koristite nalog root da biste obavili odreene poslove, ali poto korisniki
nalog koji ste upravo napravili ima manja prava od naloga root, bezbedniji je za svakodnevne poslove.
Saetak
OVOM POGLAVLJU UVODI SE STRUKTURA MySQL-a i alatke koje su mu _Prid1uene. Poveemo vas u kratak obilazak da biste saznali koje sve al~tke postoje u
MySQL-u i koji su najei klijentski interfejsi. Razmotriemo sledece teme:
Preuzeli najnoviju binarnu verziju MySQL-a za va operativni sistem s Web lokacije mysql.com.
Pregled
Vebe
Instalirajte MySQL na lokalni sistem prema postupku opisanom u ovom poglavlju,
ukoliko jo niste to uradili.
U sledeem poglavlju
U poglavlju 2",Kratak obilazak", pogledaemo komponente vae instalacije MySQL-a,
ponovo emo pogledati korisnike interfejse i osnovni nain upotrebe MySQL-a.
interfejsa
Instalirali je- pomou instalacionog programa (na Windowsu ili OS X-u) ili
pomou alatke RPM.
Podesili server tako da se automatski pokree pri podizanju sistema, ako je to u
vaem sluaju prihvatljivo.
Napravili datoteku opcija.
korisnikih
..
vom operativnom sistemu. Ako ste ga instalirali na drugo mesto, osnovna struktura
dlll'ktorijuma bie ista, ali e kerenski direktorijum biti drugaiji.
Ukoliko vam je proizvoa isporuio sistem sa ve instaliranim MySQL~om:.
11uktura direktorij uma e se moda razlikovati. Na primer, ako Imate dJstn~uCIJU v .
l~l'd Hat 9, otkriete daje organizacija datoteka izmenjena tako da se uklop~ u op.s:1
,1,tcm skladitenja datoteka. Ako ste MySQL instalirali iz RPM d~toteka. koje potJCu
.1 MySQL-ove Web lokacije, trebalo bi da datoteke budu na mestima koje navodimo
ovoj knjizi.
..
.. v
v..
v
lill ajte u vidu i to da e struktura direktonJuma b1t1 nes~o dru gaCIJa sto zavisi od tog~
~ nJe ste opcione stavke instalirali i da li ste MySQL instalJral.I IZ bmarne .distnbuciJe Ih
11 distribucije sa izvornim kodom. U ovoj knjizi pretpostavljamo .da ste mst~Irali IZ
blll.lrne distribucije, kao to je preporueno u poglavlju 1, u odeljku "InstaliranJe
MySQL-a".
.
. .
..
Ako imate operativni sistem srodan Unixu, standardm kerenski dJrektonJUm za .
MySQL-ove datoteke je /usr/locallmysql. Ako imate Windows, standardm kerenski
ducktorijumje C:\mysql.
tt
/U
rUylctVIJt: L
1'\.ldldl\. UVIIOLO"
najkorisnijim:
mysqladmin: Slui za obavljanje administrativnih funkcija.
myisamchk: Slui za proveru i popravljanje oteenih MyiSAM tabela.
mysqldump: Omoguava izradu rezervnih kopija baze podataka.
mysqlbinlog: Omoguava itanje dnevnika izmena, to je kljuno za oporavljanje baze u sluaju katastrofalne greke.
mysqlshow: Slui za prikazivanje podataka o bazama podataka i njihovim
tabelama.
Kroz celu ovu knjigu koristiemo programe mysqld i mysql, a na druge pomenute
programe vrati emo se u petom delu, "Administriranje MySQL-a".
Pogledajte sadraj direktorijuma scripts. Programi koji se u njemu nalaze su skriptovi koji se interpretiraju, a ne programi u prevedenom obliku, kao u direktorijumu
h111. Upotrebu nekih meu njima opisaemo kada vam budu zatrebali u ovoj knjizi.
Najvaniji od onih koje emo koristiti u ovoj knjizi jeste mysqlhotcopy, koji slui za
111 adu rezervnih kopija baze podataka. (Tu temu razmatramo u poglavlju 14, "Izrada
11'zervnih kopija i obnavljanje podataka".)
Pregled
korisnikih
interfejsa
MySQL-u moete pristupati pomou vie korisnikih interfejsa, ili klijentskih progl.l!na.Tri najpopularnija korisnika interfejsa su: mysql (u obliku komandne linije),
poznat i kao MySQL monitor, MySQL Control Center (ili, skraeno, MySQLCC)
1 phpMyAdmin.
MySQL monitor je ukljuen u osnovnu instalaciju MySQL-a, a komande se
:.ulaju preko komandne linije. On uvek postoji u svim instalacijama, jednostavno se
l o listi i radi na svim platformama.
MySQL Control Center (MySQLCC) jeste grafiki korisniki interfejs. Napisan je
pomou skupa alatki za izradu prozora Qt, koji omoguava izradu verzija za razliite
pl.1tforme. U vreme pisanja ove knjige, MySQLCC je na raspolaganju za Unix i Windows, a planirana je i verzija za OS X.
phpMyAdrninje Web korisniki interfejs za upotrebu MySQL-a. Veoma je popu111 an meu dobavljaima Internet usluga koji svojim korisnicima stavljaju na raspolago~~~jc MySQL radi razvijanja Web aplikacija.
Ako imate instaliran MySQL, imate i MySQL monitor. MySQLCC je zvanini
pwizvod za rad s MySQL-om, ali u zavisnosti od verzije MySQL-a koju imate,
111nda ete morati da ga posebno preuzmete sa adrese:
www.mysql.com/downloads/mysqlcc.html
nai ete
na adresi:
www.mysql.com/products/mysqlcc/install.html
Ako elite da sami instalirate phpMyAdmin, morate imati funkcionalan Web sernl 1 instaliran PHP.
Za potrebe ove knjige, nevano je koji ete korisniki interfejs odabrati. Svi nude
Jl'dnaku osnovnu funkcionalnost. Upite unosite u obliku teksta, a rezultati se prika:tiJll takoe u obliku teksta, bez obzira na korisniki interfejs koji upotrebite.
i>rimeri koje dajemo u ovoj knjizi testirani su pomou MySQL monitora, ali vi
1110ete koristiti ta god vam odgovara- mysql, MySQLCC, phpMy Admin ili koji god
111u~i klijentski program naete na Internetu. Za neke poslove bie potrebno da izaete
it kn ns n ikog interfejsa i upotrebite koma n dno okruenje operativnog sistema.
21
22
Saetak
Poto izaberete bazu podataka, moete videti koje se sve tabele nalaze u njoj, ako
kll Cate komand ll:
111
11 1iow tables;
mysql -u username -p
mysql -h
tHireenoj bazi podataka. Ako dobijete poruku o tome, izaberite drugu bazu podataka
p.1 pokuajte ponovo.)
-u imekorisnika -p
pomou
Ova opcija ograniava tetu koju biste mogli da nainite pomou zadate komande.
To je naroito korisna opcija (na raspolaganju samo u alatki u kojoj se komande
zadaju na komandnoj liniji) kada se kao poetnik malo pribojavate rada u MySQL-u.
Moda bi bilo dobro daje koristite dok itate ovu knjigu. (Konkretno, ova opcija vas
spreava da aurirate ili izbriete redove u tabelama ako ne zadate vrednost primarnog
kljua tih redova. Ako jo ne znate ta to tano znai, nemojte brinuti. Sve e postati
jasno u treem delu knjige, "Upotreba MySQL-a".)
Poto se prijavite u MySQL, moete videti koje sve baze podataka postoje, ako
zadate komandu SHOW:
show databases;
Kod veine italaca, u ovoj fazi rezultat ove komande bie kratak spisak baza podataka. Trebalo bi da se na vaem spisku pojavi baza podataka mysql. To je sistemska
baza podataka u kojoj se uvaju podaci o korisnikim nalozima i njihovim pravima.
Vie rei o tome bie u nastavku ove knjige.
Obratite panju na to da se komanda zavrava znakom taka i zarez. Veinu
komandi koje otkucate u MySQL monitoru morate zavriti tim znakom ina e ih
MySQL nee izvriti. Otkucajte:
show databases
i zatim pritisnite Enter. MySQL e samo mirno ekati. Ako potom otkucate znak taka
i zarez i pritisnete taster Enter, komanda e biti izvrena. To omoguava da sloene
komande raspodelite u vie redova da bi bile itljivije. Umesto znaka taka i zarez,
moete upisati \g (obrnuta kosa crta i slovo g), ali veina koristi taku i zarez.
Moete izabrati neku bazu podataka sa liste i otkucati sledeu komandu:
use imebaze;
(Upiite tano ime baze kojoj elite da pristupite.)
Time navodite MySQL-u da elite da radite sa odreenom baz<?m podataka. Izaberite jednu sa spiska i otkucaj te ovu komandu. (Moda neete imati prava da pristupite
(Slovo
h potie
od rei help.)
aetak
Najvaniji direktorijumi u instalaciji MySQL-ajesu bin (izvrni programi), data
(podaci iz baze podataka) i does (dokumentacija).
Dva programa koja ete n;Uee koristiti jesu mysqld (MySQL server) i mysql,
klijentski program u kojem se komande zadaju preko komandne linije.
Moete birati izmeu vie korisnikih interfejsa, odnosno klijentskih programa.
Pomenuli smo mysql (interfejs u obliku komandne linije) , MySQLCC (grafiki
interfejs) i phpMyAdmin (Web interfejs).
Program mysql ima vie korisnih opcija koje moete zadati na njegovoj komandnoj liniji. Pomenuli smo -u (kojom se zadaje ime korisnika), -p (prijavljivanje
s lozinkom), -h (kojom se zad;Ue ime udaljenog raunara) i --i-am-a-dummy
(za ograni:lvanjc mogue tete).
24
U sledeem poglavlju
Poto se prijavite na server, moete izdati komande SHOW DATABASES ili SHOW
TABLES da biste dobili spisak objekata u sistemu, ili komandu DESCRIBE imetabele da biste dobili podatke o odreenoj tabeli.
Iz MySQL servera moete se odjaviti pomou komande \q.
Komande moete zavravati znakom ; ili znakovima \g da biste ih poslali servem
na izvrenje .
Datoteku koja sadri komande moete izvriti iz klijentskog programa pomou
komande source imedatoteke, ili izvan klijentskog programa- preusmeravanjem rezultata datoteke.
Pitanja
Vebe
l'r tuznute i instaliraj te neki grafiki ili Web korisniki interfejs, kao to je MySQLCC.
Vtzbajte prijavljivanje i prikazivanje spiska postojeih baza podataka pomou klijentlo~ programa koji ste izabrali .
Odgovori
fl1lanja
l. d
) a
\. e
l. e
'l . b
b) direktorijumu lib
e) direktorijumu scripts
U sledeem poglavlju
d) direktorijumu bin
2. Dokumentacija o MySQL-u nalazi se u
l J poglavlju 3, "Ubrzani kurs projektovanja baza podataka", razmotri emo opte kon-
znai tano
b)
spreava
to to pie
uim
SQL
II
Projektovanje i izrada
baza podataka u MySQL-u
\ Ubrzani kurs projektovanja baza podataka
l
3
Ubrzani kurs projektovanja
baza podataka
RAZMOTRIEMO
OVOM POGLAVLJU
osnovne principe projektovanja i normalilu\,lllja baza podataka. U dobro projektovanoj bazi podataka redundantnost (dupli' tll)t') podataka svedeno je na minimum, ali bez gubljenja podataka. To znai da e na
'riJ hrt i to manji utroak prostora na disku uz ouvanje svih veza koje postoje izmeu
1'HI.1taka.
R.1zmotriemo sledee teme:
l ntiteti i relacij e
hnovni elementi koje emo pokuati da model ujemo jesu entiteti i relacije. Entiteti su
'' v.11 i" (predmeti, osobe, organizacije itd.) iz stvarnog ivota o kojima uvamo podatke
11 h.1:n podataka. Na primer, moemo se opredeliti da evidentiramo podatke o zaposle111111.1 i slubama u kojima rade. U tom sluaju bi zaposleni bio jedan entitet, a sluba
11 ~nJoj radi- drugi. Relacije su veze koje postoje izmeu entiteta. Na primer, zaposleni
t,tdi ll slubi. "Radi u" je relacija (veza) izmeu entiteta zaposleni i sluba.
ltdacije mogu biti razliitih vrsta. Postoje relacije tipa "jedan prema jedan", ,jedan
ptt'tlla vie" (ili "vie prema jedan", u zavisnosti od toga s koje strane relacije posmalt,tlt') 1., vie prema vie". Relacija tipa ,jedan prema jedan" povezuje samo dva entiteta.
JU
ruyraVIJI:: J
VUILdfll
~ur~ fHUJI::~lUVdiiJd
UdLd
JJUUdld~d
Ako bi svaki zaposleni u ovoj organizaciji imao svoju pregradu s pisaim stolom, to bi
bila relacija tipa ,jedan prema jedan". U primerima kao to je navedeni, ta veza "radi u"
ee je tipa "vie prema jedan", tj. vie zaposlenih radi u datoj slubi .Tc dve vrste relacija prikazane su na slici 3.1.
l.tbele
~
~g
name
1
Noro edwards
Ben Smith
6651 Ajay Palal
!016 Candy Burnett
Istraivanje i razvoj
ob
1
Programmer
OBA
Programmer
Systems Administrator
departmentiD
l~
128
128
Slika 3.2 U tabeli employee (zaposleni) uvaju se ifre zaposlenih (employee ID),
imena (name), poslovi kojima se bave Gob) i slube u kojima rade (departmentiD).
Kao to vidite, ova tabela sadri podatke o zaposlenima u jednoj kompaniji. (Nisu
pr1bzani podaci o svim zaposlenima, ve samo nekoliko primera.)
-Jr________.____",
~~'
Nora
~-------'----"'
:ru.~.
Ajay
Slika 3.1
Imajte u vidu da entiteti, relacije i vrste relacija meu njima zavise od okruenja i
poslovnih pravila koje pokuavate da modelujete. Na primer, u nekim firmama jedan
zaposleni moe raditi u vie slubi. U tom sluaju bi relacija "radi u" bila tipa "vie
prema vie". Ako vie ljudi deli istu pregradu ili kancelariju, onda relacija "nalazi se u"
nije tipa "jedan prema jedan".
Kada projektujete bazu podataka, morate uzeti u obzir pravila koja vae u sistemu
koji modelujete. Ne postoje dva potpuno jednaka sistema.
l J tabelama baze podataka, svaka kolona ili atribut opisuje odreeni podatak koji se
11.d.tzi u svakom redu tabele. Rei kolona (engl. column) i atribut (obeleje, engl. attri/111/r) koriste se kao sinonimi, ali tanije je rei da je kolona deo tabele, dok se atribut
1 ul11osi na entitet iz stvarnog sveta koji tabela modeluje. Na slici 3.2 vidljivo je da svaki
.1posleni ima atribute employee ID, name, j ob i department ID. To su kolone tabele
r lltployee, koje se ponekad nazivaju i atributi ili polja (engl.fields) tabele.
Kljuevi
..,. IIJII'rkiju (engl. superkey) je kolona (ili grupa kolona) koja jednoznano identifikuje red
t.tbele. Klju (engl. key) je minimalni superklju. Pogledajte tabel u employee. Da bismo
)l'dnoznano identifikovali svakog zaposlenog, moemo upotrebiti kombinaciju kolona
t'ntployeeiD i name, ili koristiti kombinaciju svih kolona (employeeiD, name, job,
tkpartmentiD). Obe kombinacije su superkljuevi.
Meutim, da bismo jednoznano identifikovali svaki red tabele, nisu nam potrebne
sve te kolone, ve je dovoljna samo jedna (na primer) employeeiD, odnosno miniIlla ina grupa kolona pomou koje nedvosmisleno identifikujemo svaki red. Prema
tome, klju je kolona employeeiD.
Pogledajte ponovo tabelu employee. Jednog zaposlenog moemo identifikovati po
1111enu (name) ili po ifri zaposlenog (employeeiD). Obc kolone su kljuevi. Tc klju
(l'vc nazivan~ o kandidati za k(j11fc1Jl' (engl. candidate kcys) jer su to mogui bndid~ti
1.(
t'UYilVIJC::
UUfLlnl
meu kojima emo izabrati primarni (engl. pri mary) klju. Primarni klju je kolona ili
grupa kolona pomou koje emo jednoznano identifikovati pojedine redove tabele.
U ovom sluaju, za tu namenu koristiemo kolonu employee ID. To je bolji klju od
kolone name jer se esto dogaa da dve osobe imaju isto ime i prezime.
Spoijni kljuevi (engi.Joreign keys) predstavljaju veze izmeu tabela. Na slici 3.2 vidite
da kolona departmentiD sadri brojeve koji predstavljaju ifre slubi u kojima rade
zaposleni. To je spoljni klju; skup svih podataka o odreenoj slubi uva se u drugoj
tabeli, u kojoj je primarni klju kolona departmentiD.
Funkcionalne zavisnosti
Izrazjunkcionalna zavisnost (engi.Junctional dependency) koristi se ree nego drugi koje
smo naveli, ali treba da shvatite njegovo znaenje da biste razumeli postupak normalizavanja o kojem e biti rei u nastavku ovog poglavlja.
Ako u datoj tabeli postoji funkcionalna zavisnost izmeu kolone A i kolone B, koja
se moe napisati kao A -7 B, vrednost u koloni A odreuje vrednost u koloni B. Na
primer, u tabeli employee, kolona employeeiD funkcionalno odreuje ime zaposlenog
(a u ovom primeru i sve druge atribute).
nmc1p1
prUJC::KlUVlnJl UlLl
pUUtlliiKil
~~~
6651
9006
ob
de artmentiD
rogrammar
Ben Smith
OBA
~ayPatet
Programmer
~
128
Candy Burn eU
Systems Administrator
128
de artmentName
1
~.esearcn
Fmance
Research and Development
Research and Development
eme
Izraz ema ili ema baze podataka (engl. database schema) oznaava strukturu ili dizajn
baze podataka, odnosno oblik koji baza podataka ima, i ne odnosi se na same podatke.
Da bi vam bilo jasnije, ema je "nacrt strukture" podataka koji se uvaju u bazi.
emu jedne tabele u bazi podataka piemo na sledei nain:
employee (employeeiD, name, j ob, ~-~P.~r_t_I?!!'!.~_nR)
U ovoj knjizi draemo se pravila da se atributi koji predstavljaju primarne kljueve
podvlae punom linijom, a atributi koji predstavljaju spoljne kljueve - takastom. Primarni kljuevi koji su istovremeno i spoljni, podvlae se i punom i takastom linijom.
o nazivu slube.
1111 oak
Anomalije
/\11omalije su neto sloeniji koncept. To su problemi koji se pojavljuju meu poda' 1111.1 zbog loe osmiljene strukture baze podataka. Mogu se pojaviti tri vrste anomalq.t, koje emo opisati na primeru loe osmiljene eme sa slike 3.3.
ll
t'll91ilVIJe
NormattzovanJe
employee
employeoiD
Anomalije pri brisanju podataka nastaju kada se podaci briu iz tabele s loe osmiljenom strukturom. Zamislite da svi zaposleni iz slube ija je ifra 128 daju otkaz (moda
zato to im je sve dojadilo). Poto izbriemo sve zapise o tim zaposlenima, vie nemamo
nijedan zapis u kojem se pominje sluba sa ifrom 128, niti njeno ime. To je primer
anomalije pri brisanju.
~~
6651
9006
Slika 3.4
Null vrednosti
dopartmentiD
,AJay Palal
Programmer
Candy Burnett
Systems Administrator
1~
OBA
128
128
skills
~~en. Java
VB, Java
NT, Linu)(
emclovee
employeeiD
~~:~
7513
9642
6651
6651
9006
9006
Name
IJ\Iora ~dwards
Nora Edwards
Nora Edwards
ob
del'_artmentiD
1 ~rogrammer
Pro grammar
Pro grammar
Ben Smith
OBA
Ajay Patel
Ajay Patel
Programmer
Candy Burnett
Candy Bumett
Systems Administrator
Systems Administrator
Slika 3.5
Pro grammar
skill
:~ l ~eri
12e
42
12e
128
12e
12e
Java
082
VB
Java
NT
Linux
U ovom sluaju napravili smo jedan red po strunoj kvalifikaciji. Ova ema je sada
prvoj normalnoj formi.
Razume se, ova organizacija podataka je daleko od savrene jer imamo veliku
~t dundantnost- za svaku kombinaciju struna kvalifikacija/zaposleni u tabeli uvamo
~ VL' podatke o zaposlenom.
Bolje reenje i pravilan nain organizovanja ovih podataka u prvu normalnu formu
prikazano je na slici 3.6.
11
employee
employeeiD
~:~
6651
9006
ob
name
1 Nora Edwards
Ben Smith
Ajay Patel
Candy Burnett
':'rogrammer
departmentiD
OBA
l~
Pro grammar
Systems Administrator
12e
12e
employeeSkills
employeeiD skill
~~:; lGPerl
ob
Programmer
Svaka vrednost u toj koloni sastoji se od kombinacije drugih vrednosti, tj. umesto
d.1sadri prostu vrednost kao to je Java, kolona sadri listu vrednosti, kao to je e,
l ' t l , Java. Time je prekrena pravilo prve normalne forme.
Da bismo ovu emu doveli u prvu normalnu formu, moramo razdvojiti vrednosti
11 koloni skills na proste elemente. To se moe obaviti na vie naina. Prvi i moda naj' n tglcdniji nain prikazan je na slici 3.5.
Poslednje pravilo dobrog projektovanja baza podataka nalae da treba izbegavati eme
koje dozvoljavaju vei broj nepopunjenih atributa. Ako elimo da evidentiramo da na
svakih sto ili vie zaposlenih jedan od njih ima posebne kvalifikacije, u tabelu employee
ne bismo dodali novu kolonu za tu vrstu podataka jer bi za 99 drugih zaposlenih ta
kolona sadrala vrednost NULL. Umesto toga napravili bismo novu tabelu u kojoj bi se
uvale ifre i kvalifikacije samo zaposlenih koji ih imaju.
Normalizovanje
name
Nora Edwards
Ben Smith
7513
9642
6651
6651
9006
9006
Slika 3.6
Java
082
VB
Java
NT
Linux
Jb
t"ogtaVIJe
U ovom primeru, preneli smo strune kvalifikacije u zasebnu ta belu koja slui
samo da povee ifre zaposlenih s pojedinim kvalifikacijam.a. Time smo reili problem
redundantnosti.
Moda se pitate kako smo doli do drugog reenja. Postoje dva odgovora.Jedan je:
na osnovu iskustva. Do drugog odgovora dolazimo ako nastavimo primenu postupka
normalizovanja na emu sa slike 3.5; u tom sluaju, na kraju dobijamo emu sa slike
3.6. Prednost iskustva je to to omoguava predvianje i direktan prelazak na prav1lnu
strukturu, ali sasvim je prihvatljiva i bukvalna prime na postupka.
sluaju
ali i
employeeiD -7 name, job, departmentiD
Drugim reima, dovoljna nam je samo vrednost atributa em.ployeeiD da bismo
odredili vrednosti ostalih atributa, tj. name,job i departmentiD.To znai da su ti atributi funkcionalno samo delimino zavisni od izabranog primarnog kljua, odnosno
vrednosti tih atributa mogu se odrediti samo na osnovu dela tog primarnog kljua a
njegova cela vrednost nije neophodna. Prema tome, ova ema nije u drugoj normalnoj
formi.
Sledee pitanje je: "Kako bismo je doveli u drugu normalnu formu?"
Normalizovanjc
'!''::!belu moramo razdvojiti na vie tabela u kojima su svi atributi koji nisu deo pri liLl rnog kljua funkcionalno potpuno zavisni od primarnog kljua. U ovom sluaju je
''' 1glcdno da to moemo postii ako tabelu razdvojimo na dve tabele:
employee(employeeiD, name, job, departmentiD)
<.'mployeeSkills( employeeiD, skill)
----------------'lb je ema prikazana na slici 3.6.
Kao to je ve opisano, ova ema je u prvoj normalnoj formi zato to su sve vredll osti proste. Ona je takoe u drugoj normalnoj formi zato to svaki atribut koji nije
dl' o primarnog kljua sada je potpuno zavisan od svih delova primarnog kljua.
Ir a normalna forma
I'1111Ckad ete uti nekoga da kae: "Normalizovanje se tie kljua, celog kljua i nieg
t11t1gog osim kljua". Druga normalna forma nalae da atributi moraju zavisiti od
1 1 log kljua. Trea normalna forma propisuje da atributi zavise samo od kljua.
1:ormalno, da bi ema bila u treoj normalnoj formi (3NF), moramo ukloniti sve
li.lllzitivne zavisnosti i ema mora ve biti u drugoj normalnoj formi. U redu, ali ta je
lidll:titivna zavisnost?
Pogledajte ponovo sliku 3.3. Prikazana je sledea ema:
l'mployeeDepartment( employeeiD, name, job, departmentlD, departmentName)
Ova ema sadri sledee funkcionalne zavisnosti:
l'mployeeiD -7 name, job, departmentlD, departmentName
dcpartmentiD -7 departmentName
Primarni klju je employeeiD i svi atributi funkcionalno su potpuno zavisni od
"l''ga, to je lako razumljivo jer se primarni klju sastoji od samo jednog atributa.
Meutim, vidljivo je i to da imamo:
l'mployeeiD -7 departmentName
l'tnployeeiD -7 departmentiD
dcpartmentiD -7 departmentName
Obratite panju i na to da atribut departmentiD nije klju.
Ovaj odnos znai da je funkcionalna zavisnost employee ID -7 departmentName
li,lllzitivna zato to postoji "meukorak" (zavisnost departmentiD -7 departmentName) .
Da bismo doli do tree normalne forme, moramo ukloniti ovu tranzitivnu zavisnost.
Kao i u prethodnim formama, da bismo doli do tree normalne forme, tabel u razdv.l_J.lmo na vie drugih tabela. U ovom sluaju takoe, prilino je oigledno ta bi trclo.do da uradimo. emu d elimo na dve tabele, employee i department, na sledei nain:
l'mployee(employeeiD, name, job, ~_<:p_~:~~~~-~-t_I_J?.)
d cpa rtmcnt( d epa rtmen t ID, departmentN ame)
'18
To nas vraa na emu tabele employee prikazanu na slici 3.2. Ona je u treoj normalnoj formi.
Drugi nain da opiemo treu normalnu formu jeste da kaemo sledee: fo~maln~,
ako je ema u treoj normalnoj formi, za svaku funkcionalnu zavisnost u svakoj tabeh,
ispunjen je jedan od sledea dva uslova:
Leva strana funkcionalne zavisnosti je super klju (tj. klju koji nije obavezno
minimalan).
ili
Desna strana funkcionalne zavisnosti je deo svakog kljua te tabele.
Drugi uslov se ne pojavljuje ba tako esto! U
zavisnosti bie obuhvaene prvim uslovom.
veini sluajeva,
Normalizovanje
Normalizovanje je formalni postupak koji omoguava poboljava~ e strukture
baze podataka.
sve funkcionalne
Prva normalna forma (lNF) znai da kolone ili atributi sadre iskljuivo proste
vrednosti.
Druga normalna forma (2NF) znai da svi atributi izvan kljua mor;Uu zavisiti od
celog kljua.
Trea normalna forma (3NF) znai da ne sme biti tranzitivnih zavisnosti.
IJoyce-Coddova normalna forma (BCNF) znai da svi atributi moraju biti funkcionalno odreeni superkljuem.
Pitanja
Superklj u
..
je
a) Minimalni klju
b) Spoljni klju
Postoje i normalne forme viih stepena (etvrta, peta itd.) ali su one pogodmje za akademske rasprave nego za praktinu primenu na projektovanje b~za podataka. 3NF
(ili BCNF) sasvim. je dovoljna da rei te probleme redundantnost1 podataka na koje
ete naii.
1
Saetak
Koncepti
Entiteti su "stvari", a relacije su veze imeu njih .
Tabele sadre podatke koji se prikazuju u tabelarnom obliku.
Kolone tabela su atributi (obeleja) koji opisuju svaki entitet.
Redovi tabela sadre vrednosti iz svih kolona tabele .
odreuju
40
5. N-torka je
a) kolona
b) red
e) kandidat za klju
d) vrsta narodnog kola
e) spoljni
klju
Vebe
1. Normalizujte sledeu emu u treu normalnu formu:
Porudbine(ifraKupea, imeKupea, adresaKupea, brojPorudbine, datumPorudbine, ifraRobe, nazivRobe, koliinaRobe)
2. Pokuajte da osmisli te emu koja je 3NF ali ne i u BC NF.
Odgovori
Pitanja
1. e
2. a
3. e
4. b
5. b (postoji narodno kolo koje se zove estorka)
Vebe
1.
NAUIETE
1tlld,nnka,
1:,1 podataka
Roba(ifraRobe, nazivRobe)
2. Postoji puno moguih reenja, proverite samo da vae ne kri pravila
normalizovanja.
tmployeeSkills(employeelD, skill)
tli ent(clientiD. name, address, eontaetPerson, eontaetNumber)
. l ssi gnmcnt(~}~~~-~~~.' ~-~J?!~Y~:!:'?. workdate, hours)
U sledeem poglavlju
U poglavlju 4, "Pravljenje baza podataka, tabela i indeksa", pretvoriete emu baze
podataka u stvarne MySQL tabele.
l >ok itate gradivo iz ovog poglavlja, moete unositi odgovarajue komande da biste
lt.tpt.lvili ovu bazu podataka u MySQL-u. Razume se, baze podataka, tabele i indekse
11111/l'tc praviti pomou bilo kojeg klijentskog programa za MySQL, ali u ovim primc' lllt.l , bazu podataka napraviemo pomou MySQL monitora. Opredelili smo se za to
11' \l ' llJC dn biste bolje razumeli strukture baze podataka, tabela i indeksa.
42
Trebalo bi da se najpre prijavite u MySQL monitor, na isti nain na koji ste to inili
u poglavlju 1, "Instaliranje MySQL-a" i u poglavlju 2, "Kratak obilazak".
U ovom poglavlju koristi emo mogunosti za definisanje podataka koje prua jezik
SQL da bismo pravili baze podataka, tabele i indekse. ta to tano znai? SQL je skraenica od Structured Query Language (strukturirani jezik za upite), to je jezik koji
emo koristiti za izradu relacionih baza podataka i uitavanje podataka iz njih. ine ga
dve semantiki odvojene komponente: jezik za definisanje podataka (engl. Data Difinition Language, DDL), koji omoguava formiranje struktura baze podataka), i jezik za rad
s podacima (engl. Data Manipulation Language, DML), koji omoguava pretraivanje
baze podataka.
U narednim odeljcima saznaete kako se u MySQL-u prave baze podataka, tabele
i indeksi.
ldentifikatori u MySOL-u
Identifikator je opta re koja se odnosi na ime alijasa, baze podataka, tabele, kolone ili
indeksa. To je nain da se nedvosmisleno identifikuje odreeni objekat. Pre nego to
ponete da sami pravite baze podataka i tabele, moramo objasniti i koji su identifikatori ispravni u MySQL-u.
lgl.tvnom, identifikatori mogu sadrati sve znakove koji postoje, osim sledeih:
"l' t semo MySQL-u da elimo da napravimo novu bazu podataka. To se radi pomou
'><>L-ove komande
~~ate
CREATE DATABASE,
na
sledei nain:
database employee;
11,1
Trebalo bi da se ime nove baze podataka, employee, pojavi na spisku baza podataka
vaem raunaru .
Sada imate praznu bazu podataka koja eka da u njoj napravite nekoliko tabela.
Sada je izabrana (otvorena) baza podataka employee; za sve akcije koje izvrimo od
s.tda pa nadalje, podrazumevae se da se odnose na tu bazu podataka .
44
t'raviJenJe tiltlcla
imetabele
[type=tip_tabele];
Kao to vidite, komanda poinje reima create table, iza kojih sledi ime tabele
koju bismo eleli da napravimo, a zatim dolazi grupa definicija svih kolona tabele. Na
kraju komande moete po potrebi zadati tip maine baze podataka koji biste eleli da
se koristi.
46
komandu dok ne otkucate zavrni znak taka i zarez (;) i pritisnete taster Enter.
(Moete se opredeliti i da komande zavravate znacima \g, ali se znak taka i zarez
znatno ee koristi.)
U ovoj tabeli deklariemo dve kolone. Svaka deklaracija kolone poinje imenom
kolone, za ime slede podaci koji opisuju tip te kolone. Pogledajte najpre drugu
kolonu ovog primera jer se neto lake razume. Deklaracija
name varchar(20)
opisuje da je ime kolone name a njen tip je varchar (2 o) .Tip podataka varchar znai
daje u pitanju znakovna vrednost promenljive duine, koja u ovom sluaju moe
sadrati najvie 20 znakova. Mogli smo da zadamo i tip char, to je znakovna vrednost
fiksne duine. Bez obzira na to da li zadate varchar ili char, nain rada s tim podacima se nee razlikovati, jedina razlika je u obliku u kojem se ti podaci smetaju u
memoriju. Podatak tipa varchar (2 o) zauzima onoliko prostora koliko je potrebno za
skladitenje stvarnog broja znakova, dok podatak tipa ch ar ( 2 o) uvek zauzima 20 znakova, bez obzira na to da lije u njega smetena bilo kakva vrednost.Vie o relativnim
prednostima i nedostacima ovih tipova podataka bie rei odeljku "Tipovi podataka u
kolonama", u nastavku ovog poglavlja.
Pogledajmo sada definiciju prve kolone, koja izgleda ovako:
departmentiD int not null auto_increment primary key,
Ime ove kolone je department ID, a njen tip je int (integer). To je jedinstven broj
(ne ponavlja se) koji emo koristiti za identifikovanje pojedinih slubi i odeljaka
kompanije.
Deklaraciji tipa podataka kolone slede dodatni podaci o koloni.
Prvo smo zadali da je ta kolona tipa not null - drugim reima , u svakom redu
tabele, ta kolona mora sadrati neku vrednost.
Drugo, zadali smo daje ta kolona takoe tipa auto_increment. To je veoma
korisna mogunost MySQL-a. Kada unesemo nov red u tu tabel u, ako ne zadamo
ifru slube, MySQL e sam do deli ti jedinstven broj koji e biti sledei po redosledu
auto_increment sekvence (niza). To e vam prilino olakati ivot.
Na kraju, odredba primary key znai da e ta kolona biti primarni klju tabele.
Ako se primarni klju sastoji od samo jedne kolone, moe se zadati u ovom obliku. Za
primarne kljueve sastavljene od vie kolona mora se upotrebiti drugi oblik komande,
koji emo razmotriti u nastavku ovog poglavlja.
Time se zavrava definicija tabele department. A sada, pogledajte sam kraj SQL-ove
komande. Iza zavrne zagrade nalazi se sledei red:
type=InnoDB
Time se zadaje da tabela treba da koristi mainu baze podataka InnoDB.Ako paljivije pogledate definicije tabela, uoiete da smo sve tabele deklarisali kao InnoDB
tabele.
l'raviJenje tabela
ta to tano znai? MySQL podrava razne maine baze podataka, koje emo detalj
nije razmotriti u poglavlju 9, "Tipovi tabela u MySQL-u". Standardni tip je My ISAM.
Ako elite da koristite My ISAM tabele, nije neophodno da na kraj komande create
database dodate odredbu type.
U ovom sluaju potrebne su nam InnoDB tabele zato to emo u nekoliko primera
koristiti spoljne kljueve. Maina baze podataka InnoDB podrava spoljne kljueve i
lra nsakcije, to nije na raspolaganju u tabelanu tipa MyiSAM. MyiSAM tabele esto
H l bre od InnoDB tabela. Za svaku tabelu morate razmotriti koji je tip najprikladniji .
Mogli smo da zadamo tabele razliitih tipova i da imamo, na primer, nekoliko
lnnoDB tabela i nekoliko MyiSAM tabela (pa ak i tabele jo nekih drugih tipova,
ukoliko je potrebno), ali jednostavnosti radi, u ovom primeru koristi emo iskljuivo
lnnoDB tabele.
Pogledajmo drugu komandu create table:
crea te table employee
employeeiD int not null auto_increment primary key,
name varchar(BO),
job varchar (15) ,
departmentiD int not null references department(departmentiD)
t ype=InnoDB;
U ovoj komandi samo je jedan deo sintakse nov. Posle dnja kolona tabele employee
JL' ifra slube (departmentiD) u kojoj zaposleni radi. To je spoljni klju. U definiciji
t.1bele to se deklarie pomou odredbe references, na sledei nain:
departmentiD int not null references department(departmentiD)
Ovom odredbom smo zadali da kolona departmentiD tabele employee referencira
kolonu (povezana je s kolonom) department ID tabele department.
Imajte u vidu da sintaksu za spoljni klju moemo koristiti zato to je tabela
employee tipa InnoDB. Kada koristite My ISAM tabele, upotreba spoljnih kljueva
nij e mogua. Prema planu razvoja, trebalo bi da spoljni kljuevi u MyiSAM tabelama
hudu podrani i jednoj od buduih verzija MySQL-a, verovatno u verziji 5.1.
Pogledajte sada treu komandu create table:
create table employeeSkills
employeeiD int not null references employee(employeeiD),
s kill varchar(15) not null,
p rimary key (employeeiD, skill)
type=InnoDB;
U ovoj tabeli takoe imamo spoljni klju; to je kolona employee ID. Zanimljivo u
vezi s definicijom ove tabele jeste to da ona ima primarni klju koji se sastoji od dve
kolone . Kao to vidite, deklarisane su dve kolone tabele, employeeiD i skill, a zatim
JC rasebno deklarisan primarni klju u sledeem redu:
pt l.mary key
(employeeiD, skill)
48
definicija_kolone:
Budui da u sintaksi definicija drugih tabela nema nieg novog, neemo ih detaljno
sledee
rezultate:
ili
+-------- ------------+
l Tables_in_employee l
+--------------------+
assignment
client
department
employee
employeeSkills
+--------------------+
Detaljnije podatke o strukturi svake tabele moete dobiti pomou komande describe; na primer:
describe department;
Trebalo bi da na svom ekranu dobijete rezultate nalik na sledee:
+--------------+-------------+-------------------+------+-----+---------+----------------+
1 Field
Type
Collation
l
l
bina:ry
latinl_swedish_ci
Null
l
l
YES
Key
l
l
PRI
Default
l
l
NULL
NULL
Extra
l
l
auto_increment
+--------------+-------------+-------------------+------+-----+---------+----------------+
1 departmentiD l
1 name
l
int (ll)
varchar(20)
l
l
+--------------+-------------+-------------------+------+-----+---------+----------------+
U ovoj fazi korisno bi bilo da proverite i ostale tabele.
ime tabele
[ (definicija_kolone, ... ) l
[ope i j e_ za_ tabel u] [komanda_ se l e ct l
ili
ime tabele
Poto ste videli primer, moemo prei na opis cele sintakse komande CREATE TABLE.
U MySQL-ovoj dokumentaciji stoji da komanda ima sledei opti oblik:
LIKE
CHECK (izraz)
Pomou
rezervisane rei DEFAULT iza koje sledi neka vrednost moete zadati
podrazumevanu vrednost za kolonu.
kljueve
(odredba PRIMARY
Pojedine kolone moemo deklarisati kao spoljne kljueve, pomou opcije REFERENCES, kao u ovom primeru.
rU~IdVIJC
..
1\.UIIIdllUd \..nC/"\1 C
CREATE
Moemo zadati primarni klju koji se sastoji od vie kolona, kao u ovom primeru, tako to iza opcije PRIMARY KEY navedemo imena kolona koje ine primarni klju. Na taj nain moe se zadati i primarni klju koji se sastoji od samo
jedne kolone. Kolona deklarisana kao PRI MARY KEY moe sadrati samo jedinstvene (neduplirane) vrednosti, za nju se automatski formira indeks i ne moe
sadrati vrednost null.
Moemo zadati jo nekoliko drugih opcija za tabel u, koje nisu obavezne ali dopri''"w pre svega optimizaciji. Neke meu njima objasniemo u poglavlju 18",0ptimi"v.tnje baze podataka" . To su sledee opcij e:
AUTO_INCREMENT = #
po etnu
Pomou
opcije UNIQUE zadaje se da odreena kolona moe sadrati samo jedinstvene vrednosti. Kolone deklarisane kao UNIQUE takoe se automatski indeksiraju.
Pomou
opcije FULLTEXT zadajete da se formiraju indeksi za tekstualno pretraivanje kolona tipa TEXT, CHAR ili VARCHAR. Indekse za tekstualno pretraivanje
moete koristiti samo s MyiSAM tabelama. Primer se nalazi u poglavlju 9.
omoguava
da deklariete spoljne
kljueve
na isti
nain
kao
Iza zatvarajue zagrade moete zadati odreene opcije koje se tiu tabele. Dosad
smo ve videli da to moe biti tip tabele.Tipovi tabela detaljnije su opisani u poglavlju 9.
Ako ne zadate tip tabele, podrazumeva se MyiSAM. Ukratko, tip tabele moe biti jedan
od sledeih:
My ISAM, koji se podrazumeva, veoma je brz i podrava indekse za tekstualno
pretraivanje; zamenjuje nekadanji podrazumevani tip ISAM.
ISAM je stariji tip tabela. Slian je tipu My ISAM ali prua manje mogunosti,
zbog ega bi trebalo da umesto njega uvek koristite MyiSAM.
InnoDB je maina baze podataka usklaena s grupom pravila ACID koja
podrava transakcije, spoljne kljueve i zakljuavanje podataka na nivou pojedinanog reda tabele.
BDB (Berkeley DB) je maina baze podataka koja podrava transakcije i zakljuavanje podataka na nivou stranice tabele.
Ceo sadraj tabela tipa HEAP uva se u memoriji i nikad se ne upisuje na disk;
zahvaljujui tome, te tabele su veoma brze, ali veliina im je ograniena i podaci
iz njih se ne mogu restaurirati ukoliko se sistem pokvari.
Tabele tipa MERGE omoguavaju kombinovanje vie tabela tipa MyiSAM koje
imaju istu strukturu, tako da se podaci iz njih itaju kao da radimo s jednom tabelom.To se moe iskoristiti kada operativni sistem ograniava maksimalnu veliinu
datoteka - pa zbog toga i tabela.
vrednost
Omoguava
razliitu
AVG_ROW_LENGTH = #
od
da u koloni tipa
auto_increment
zadate
1.
Omogu ava
prosenu
da zadate
CHECKSUM = l
Opcije INDEX i KEY su sinonimi i znae da e zadata kolona (ili kolone) biti
indeksirana. Imajte vidu da u MySQL-u takve kolone ne moraju da sadre
jedinstvene vrednosti.
IMOLI:.
MAX ROWS = #
uneti u tabelu.
MIN ROWS = #
moe sadrati.
{O l l l DEFAULT} MySQL standardno pakuje (komprimuje)
sadraj indeksa znakovnog tipa- a to su CHAR, VARCHAR i TEXT. Ako zadate
vrednost 1, svi indeksi e se pakovati; ako zadate vrednost o, nijedan indeks se
n e e pakovati.
PASSWORD = "tekst U standardnoj verziji MySQL-a ova opcija na radi ba
nita.
PACK_KEYS =
DELAY_KEY_WRITE =
ROW_FORMAT= {default
dynamic
fixed
compressed }
Omoguava
Omoguava
STRIPED
RAIDO
RAID_CHUNKS=# RAID_CHUNKSIZE=#
imate.
UNION=
(ime_tabele, [ime_tabele ])
omoguava
Ovaopcija,namenjenaiskljuivo
ine
grupu MERGE.
INSERT_METHOD= {NO
izriito
izri ito
rU~IdVIJ'C
""t
I najzad, ako ponovo pogledate opti oblik komande CREATE TABLE, uoiete da
komandu CREATE TABLE moete zavriti komandom SELECT. SELECT je SQL-ova
komanda koja omoguava uitavanje redova iz jedne ili vie tabela. (Podrobnije je
opisana u poglavljima 6, 7 i 8 ove knjige.) Pomou tc opcije moete napuniti novu
tabelu podacima koje uitava zadata komanda select.
MEDIUMINT
BIGINT
Tip FLOAT
Tip DOUBLE
tipovi podataka
Numeriki
plata decimal(lO, 2)
Ova komanda omoguava prikazivanje vrednosti sa ukupno 12 cifara i dva decimalna mesta.
Moete se opredeliti da ne zadate nijedan od ovih parametara, ili moete zadati
samo ukupnu irinu za prikazivanje, ili i irinu i broj decimala.
Uz numerike tipove moete zadati rezervisane rei UNSIGNED i/ili ZEROFILL.
Rezervisana re UNSIGNED znai da kolona moe sadrati samo nule ili pozitivne
vrednosti. Rezervisana re ZEROFILL znai da e se vrednosti iz kolone prikazivati
s vodeim nulama.
Tani numeriki tipovi opisani su u nastavku teksta.
TINYINT
BIT
i BOOL
Tip CHAR
l'ip CHAR omoguava skladitenje znakovnih vrednosti fiksne duine. Kao u primeru
haze podataka employee, rezervisanoj rei CHAR obino sledi duina (broj znakova) znakovne vrednosti, na primer CHAR ( 2 o) .Ako ne zadate duinu, podrazumeva se CHAR ( 1) .
Maksimalna duina podatka tipa CHAR je 255 znakova. Kada se podatak tipa CHAR upie
ll kolo~ u ta?ele, on uvek ima duinu koju ste zadali u definiciji kolone. To se postie
d~?unF:anJem po~atka u koloni razmacima. Ti razmaci se automatski uklanjanju pri
liCJtavanJU podatka IZ kolone tipa CHAR.
Oigledno je da podaci tipa CHAR zauzimaju vie prostora na disku od ekvivail'J~tnih z~akovnih ~~ednosti promenljive duine. Prednost im je to to se podaci bre
u!tavaju 1z tabele CIJe su sve kolone fiksne irine (tj. CHAR, numeriki ili date).
ll udui da je brzina uitavanja podataka esto vanija od prostora koji oni zauzimaju
na disku, moda ete se opredeli ti da tekstualna polja u kojima se vrednosti ne razlikLUU mnogo po duini deklariete kao CHAR da biste (malo) optimizovali sistem.
Ispred deklaracija oba tipa, CHAR i VARCHAR, moete dodati rezervisanu re NATIONAL, to znai da elite da ograniite sadraj na standardni skup znakova. Poto se ova
opcija podrazumeva u MySQL-u, korisna je samo ako vam je potrebna kompatibilllOSt izmeu razliitih platformi.
Deklaracijama tipova CHAR i VARCHAR moe slediti rezervisana re BINARY to znai
d.t sc pri poreer0u znakovnih vrednosti pravi razlika izmeu malih i velikih slova.
Podrazumevani nain poreenja je da se ta razlika ne pravi.
54
Pravljenje indeksa
Tip VARCHAR
fip TIME
..
Ovaj tip <:n;oguava skladitenje podataka koji predstavljaju vreme, koje se prikazuje u
lormatu CC:MM:SS.
Tip DATETIME
Ovaj tip je kombinacija dva prethodna. Format je GGGG-MM-DD :MM:SS.
da stane u tipove CHAR i VARCHAR. BLOB je skraenica za Binary Large OBject (vehki
binarni objekat). Ovi tipovi se meusobno ni po emu ne razlikuju, jedino je BLOB
namenjen uvanju binarnih a ne tekstualnih podataka. Pri poreenju podataka tipa
BLOB pravi se razlika izmeu malih i velikih slova, dok se to ne ini pri poreenju P~.da
taka tipa TEXT. Oba tipa su promenljive duine i za oba postoje varijante razmh velicma:
Tip
TINYTEXT
ili
TINYBLOB
fip TIMESTAMP
<)vo je koristan tip podataka za kolone tabele. Ako u odreenom redu ne zada te vredIIOSt za kolonu ovog tipa, ili zada te NULL, u kolonu se upisuje vreme kada je red dodat
t.tbcli ili kada je poslednji put izmenjen sadraj reda.
Kada uitatate podatak tipa timestamp, prikazuje se u istom formatu kao tip DATE'1'IME. To je znaajna razlika izmeu MySQL-ovih verzija 4.0 i 4.1. Ranije ste u dekla' .tciji kolone tipa TIMESTAMP mogli da zadate irinu na kojoj se prikazuju podaci iz
ll' kolone .
baj tova.
Tip TEXT ili BLOB moe sadrati najvie 65,535 (i 6 -1) znakova ili bajtova (64 KB).
24
Tip MEDIUMTEXT ili MEDIUMBLOB moe sadrati najvie 16,777,215 (2 -1) znakova
rip YEAR
()vaj tip omoguava skladitenje podataka koji predstavljaju godine. Kada deklariete
~o! onu ovog tipa, moete zadati YEAR ( 2) ili YEAR ( 4) da biste zadali broj cifara. Podrat umeva se YEAR (4 l. YEAR (2 l predstavlja opseg godina od 1970. do 2069.
Tip ENUM
,.
Pravljenje indeksa
Ovaj tip podataka omoguava da zadate hstu moguClh vrednost1. Kolona tabele ~oze
sadrati jednu vrednost iz nabroj anog skupa moguih. Tip podataka ENUM deklanse se
na
sledei nain:
Tip SET
Tip
SET je
slian tipu ENUM s tom razlikom to kolone u redovima tabele mogu sadrzat1
Tip DATE
Tip date omoguava skladitenje datuma. MySQL oekuje da datum bude u ISO
redosledu godina-mesec-dan, ime se izbegavaju problemi usled razliitih formata
datuma s o be strane Atlantika. Datumi se prikazuju u formatu GGGG-MM-DD.
Sve indekse koji vam trebaju najee ete praviti automatski kada pravite tabele. Za
W;tku kolonu koju deklariete sa opcijom PRIMARY KEY, KEY, UNIQUE ili INDEX, autolll.ltski se formira i indeks.
Ponekad ete ustanoviti da koristite vei broj upita koji obuhvataju kolonu za koju
11istc definisali indeks; u takvim sluajevima moete dodati nov indeks pomou
~oman de CREATE INDEX.
Zanimljivo je to da se, pre izvravanja, komanda CREATE INDEX preslikava u
komandu ALTER TABLE. Komanda ALTER TABLE moe se upotrebiti i za mnoge druge
11.11ncne, koje emo opisati u poslednjem odeljku ovog poglavlja.
Na primer, tabeli employee moemo dodati nov indeks na sledei nain:
<'l' ate index name on employee (name) ;
Ova komanda pravi indeks ije je ime name nad kolonom name tabele employee.
Komanda create index nema puno opcija. Ispred rei index moete dodati re
liN J QUE ako elite indeks s jedinstvenim vrednostima. Osim toga, ispred rei index
111octe navesti rezervisanu re FULLTEXT da biste napravili indeks za tekstualno pre!I,J~ivanje MyiSAM tabele. (Vie detalja o tome nai ete u poglavlju 9.)
56
t110e1e
Indeksi definisani nad kolonama tipa char i varchar mogu se ograniiti na prvih
nekoliko znakova u polju. To ete uraditi tako to iza imena indeksirane kolone zada te
izmeu zagrada broj znakova koji elite da se indeksira, na primer:
ll udui da komanda ALTER TABLE prua veliki broj mogunosti, ima i veliki broj
'Ja . Opti oblik te komande, kako je opisano u MySQL-ovoj dokumentaciji
' '~. led a ovako:
Poto indeksi nad kolonama tekstualnog tipa nisu tako efikasni kao indeksi nad
kolonama, indeksiranje samo nekoliko poetnih znakova poboljava
performanse.
lj H
t a_ izmene:
numerikim
pomou
komande
DROP TABLE,
na primer:
[TEMPORARY]
DROP TABLE
TABLE
izgleda ovako:
[IF EXISTS]
Indeks briete
pomou
komande
DROP INDEX,
na primer:
vrsta_izmene ... ]
il l
lli
l li
l li
l li
ll i
l li
l 1i
11 i
l ll
l Ji
l li
lli
1l i
lli
ll i
ll i
ADD
ADD
ADD
ADD
ADD
ADD
ADD
(ime_indeksirane_kolone, ... )
[definicija_reference]
ALTER [COLUMN] ime_kolone {SET DEFAULT literal l DROP DEFAULT}
CHANGE [COLUMN] staro_ime_kolone definicija kolone
[FIRST l AFTER ime_kolone]
MODIFY [COLUMN] definicija_kolone [FIRST l AFTER ime_kolone]
DROP [COLUMN] ime_kolone
DROP PRIMARY KEY
DROP INDEX ime_indeksa
DISABLE KEYS
ENABLE KEYS
RENAME [TO] novo_ime tabele
ORDER BY ime kolone
opcije_za_tabelu
Veina ovih opcija razumljive su same po sebi ili odgovaraju opcijama u komandi
' 'll EATE TABLE, kao to je ADD PRI MARY KEY Opisaemo ukratko one koje moda nisu
t1.1[j asnije.
pcije CHANGE i MODIFY zapravo su jedna te ista opcija i omoguavaju izmenu defilltnj e kolone ili njenog mesta u tabeli.
Opcija DROP COLUMN brie kolonu iz tabele, dok opcije DROP PRIMARY KEY i DROP
1NDEX briu samo indeks pridruen koloni.
Opcija DISABLE KEYS nalae MySQL-u da ne aurira sadraj indeksa, ali upotrei>lpva je samo za My ISAM tabele. Opcija ENABLE KEYS ukljuuje auriranje indeksa.
Opcija RENAME omoguava promenu imena tabele.
Opcija ORDER BY e poreati zadatim redosledom redove tabele na koju je primeIIJCI1a, slino opciji ORDER BY u komandi SELECT, koju emo razmatrati u poglavlju 6,
.. Korienje upita u MySQL-u". Taj red o sled nee biti ouvan kada se kasnije unesu
Ilovi podaci u tabelu.
Opcija opcije_za_tabelu omoguava da na kraj komande zadate iste opcije za
t.ll>elu kao u komandi CREATE TABLE- vie detalja o tome nai ete u prethodnom
dl'lu ovog poglavlja.
58
;:,azetaK
Saetak
U ovom poglavlju, nauili ste da pravite i briete baze podataka, tabele i indekse, i da
izmenite strukturu postojee tabele.
SU
i DECIMAL.
pomou
komande
Tabelu briete
pomou
komande
Indeks briete
pomou
komande
Strukturu tabele menjate pomou komande ALTER TABLE, iji opti oblik
izgleda ovako:
ALTER [IGNORE) TABLE ime_tabele vrsta izmene [, vrsta_izmene ... ]
Pravljenje tabela
Tome slui komanda create table,
iji
definicija_kolone:
ime_kolone tip_podataka [NOT NULL J NULL) [DEFAULT
podrazumevana_vrednost] [AUTO_INCREMENT]
[PRIMARY KEY] [definicija_reference]
ili PRIMARY KEY (ime_indeksirane_kolone, .. . )
ili KEY [ime_indeksa] (ime_indeksirane_kolone, .. . )
ili INDEX [ime_indeksa] (ime_indeksirane_kolone, .. . )
ili UNIQUE [INDEX] [ime_indeksa] (ime_indeksirane_kolone, ... )
ili FULLTEXT [INDEX] [ime_indeksa] (ime_indeksirane_kolone, .. . )
ili
[CONSTRAINT simbol] FOREIGN KEY [ime_indeksa]
(ime_indeksirane_kolone, ... )
[definicija_reference]
ili CHECK (izraz)
vrsta izmene:
ADD [COLUMN] definicija_kolone [FIRST l AFTER ime kolone
ili ADD [COLUMN] (definicija_kolone, definicija_kolo;e, ... )
ili ADD INDEX [ime_indeksa] (ime_indeksirane_kolone, .. . )
ili ADD PRIMARY KEY (ime_indeksirane_kolone, .. . )
ili ADD UNIQUE [ime_indeksa] (ime_indeksirane_kolone, .. . )
ili ADD FULLTEXT [ime_indeksa] (ime indeksirane kolone, ... )
ili ADD [CONSTRAINT simbol] FOREIGN-KEY [ime_indeksa]
(ime_indeksirane_kolone, ... )
[definicija_reference]
ili ALTER [COLUMN] ime_kolone {SET DEFAULT literal l
DROP DEFAULT}
ili CHANGE [COLUMN] tekue_ime_kolone definicija kolone
[FIRST l AFTER ime_kolone]
ili MODIFY [COLUMN) definicija_kolone [FIRST l AFTER ime kolone]
ili DROP [COLUMN] ime_kolone
ili DROP PRIMARY KEY
ili DROP INDEX ime_indeksa
ili DISABLE KEYS
ili ENABLE KEYS
ili RENAME [TO] novo_ime tabele
ili ORDER BY ime_kolone
ili opcije_za_tabelu
bU
VU~UVUII
5. Da biste izbrisali bazu podataka (ije je ime dbname) i ceo njen sadraj, zadali biste
Pitanja
a) employee
e) drop dbname;
b) select
e) employee.skill
d) employeeSkills
2. Od
sledeih
Vebe
1. Napiite SQL komande koje formiraju bazu podataka porudzbine
a) Kolona tipa CHAR uvek zauzima isti prostor na disku, bez obzira na sadraj.
b) Podatak u koloni tipa VARCHAR uvek se dopunjava razmacima pri upisivanju na disk.
d) Kolona tipa VARCHAR uvek zauzima isti prostor na disku, bez obzira na
sadraj.
a)
Odgovori
Pitanja
1. e
b)
create table department type=InnoDB
2. a
3. e
4. d
5. b
department ID int not null auto inc remen t pri mary key,
name varchar ( 2 o}
};
e)
create department
department ID int not null auto - increment pri mary key,
name varchar(20}
type=InnoDB;
Vebe
create database porudzbine;
use porudzbine;
cre ate table kupac
d)
create table department
(
department ID int not null auto- inc remen t pri mary key,
name varchar(20}
type =InnoDB;
ema
e) Kolona tipa CHAR, u proseku, zauzima manje prostora na disku od ekvivalentne kolone tipa VARCHAR.
ija je
sledea:
b.l
III
Upotreba MySQL-a
Korienje
upita u MySQL-u
7 Sloeniji upiti
8 Upotreba MySQL-ovih
U sledeem poglavlju
U poglavlju S",Umetanje, brisanje i auriranje podataka", uneemo
u bazu podataka employee.
odreene
podatke
ugraenih
5
Umetanje, brisanje
i auriranje podataka
OBJASNIEMO
pomou
kako se
komande
i auriraju podaci u MySQL-ovoj bazi podataka .
Razmotriemo sledee teme:
OVOM POGLAVLJU
1 UPDATE umeu
Komanda
Komanda
DELETE
Komanda
UPDATE
INSERT
podataka
pomou
komande
Proirenja: komande
REPLACE
i TRUNCATE.
INSERT, DELETE
Uitavanje
Sada smo preli na komponentu DML (Data Manipulation Language, jezik za rad s
podacima) jezika SQL. Poto nauite kako da umeete nove podatke u bazu podataka,
11arcdnih nekoliko poglavlja proveemo uei mnogobrojne naine za uitavanje
podataka iz baze.
Koman da INSERT
"iQL-ova komanda INSERT slui za umetanje novih redova u tabele. Pogledaemo
najpre jedan primer. U ovom sluaju takoe, komande moete zadavati direktno u
MySQL monitoru ili pisati u datoteku, ili moete preuzeti datoteku s Web lokacije
posveene ovoj knjizi.
U listingu 5.1 prikazano je nekoliko primera komande insert.
employee_data.sql
Listing 5.1
use employee;
lete from department;
insert into department values
(42
'Finance')
(128
'Rs arch and Development')
(Nur.r,
'll um<~ n R aout ces' )
---~~~~~~-------~~~~~-~~----------------......- -
(NlJI,Io,
M II')U l__
l r_H
__,_' _) _; -~~~-~----~~~~~~-------
Komand a INSERT
from employeeSkills;
into employeeSkills values
e)'
Perl'),
'Java'),
'DB2'),
'VB'),
'Java'),
'NT'),
'Linux');
'Fred Smith',
'Jan Tristan',
U prva dva reda izriito smo zadali vrednosti za kolonu departmentiD. Pogledajmo ponovo definiciju kolone departmentiD. Verovatno se seate iz prethodnog
poglavlja da deklaracija te kolone izgleda ovako:
departmentiD int not null auto_increment primary key
Budui daje u pitanju kolona tipa auto_increment, moemo izriito zadati
vrednost za nju, ili prepustiti MySQL-u da sam generie neku vrednost. (Pri upotrebi
kolona tog tipa obino se preputa MySQL-u da sam izrauna vrednost, ali postoje
i sluajevi, kao to je ovaj, gde ete imati postojeu vrednost koju ete eleti da
upotrebite.)
U redovima s podacima o slubama Human Resources i Marketing, u koloni
department ID zadato je NULL. To aktivira "magiju" mehanizma auto_increment
koji izraunava novu vrednost. Pogledajmo ta emo dobiti s tom komandom
lNSERT.
Ako paljivije pogledate pojedine komande INSERT, uoiete da su podaci koji se
umeu u kolone tipa string ili date uokvireni polunavodnicima, na primer, 'Research and Development'. Polunavodnici se ne koriste za numerike tipove.
Ukoliko se podaci uokviruju polunavodnicima, ta treba uraditi kada podatak
sadri polunavodnike? Odgovor je da se polunavodnici moraju preslikati (engl. escape).
Jednostavnije reeno, ispred svakog polunavodnika treba dodati obrnutu kosu crtu
(\), na primer, 'o\'Leary'.
ta treba uraditi ako elimo da obrnuta kosa crta bude ba obrnuta kosa crta, bez
ikakvog posebnog znaenja? U tom sluaju, morate na isti nain preslikati i obrnutu
kosu- zamenite je s dve obrnute kose crte (\ \).
Podatke uitavamo iz baze pomou komande SELECT. Tu komandu emo veoma
detaljno razmotriti u narednih nekoliko poglavlja. Zasad je dovoljno znati da e se,
ako zadate:
sledee:
----- ---------+----------------------+
l departmentiD l name
!---------------+----------------------+
~
42
128
129
130
Finance
Research and Develop
Human Resources
Marketing
----------- --+----------------------+
~
GB
Komanda INSERT
sledei
opti oblik:
opcija LOW PRIORITY blokira klijentski program koji umee podatke, dok opcija
DELAYED to ne ini. Ukoliko izdate komandu za umetanje podataka s opcijom
LOW PRIORITY, moda ete morati da saekate pre nego to budete mogli da
nastavite izvravanje upita iz svog klijentskog progran1a. Ako upotrebite opciju
DELAYED, bie vam dozvoljeno da zaponete izvravanje drugog upita, ali onda
morate imati u vidu da vai podaci nee biti upisani u tabelu dok ona ne bude
potpuno slobodna.
ili
U prime rima koje smo dosad videli, upotrebljen je prvi oblik komande. Obratite
panju na to da rezervisana re INTO nije obavezna. Mogli smo je izostaviti i zapoeti
upit s insert employee values, ali smatramo da re INTO doprinosi razumljivosti
upita.
Kada koristite prvi oblik komande INSERT, za svaki novi red tabele morate zadati
listu vrednosti poredanih istim redosledom kao odgovarajue ciljne kolone tabele.
U ovom primeru, morali smo prvo da zadamo vrednost za kolonu department ID,
a zatim i za kolonu name jer je takva struktura tabele. Iz primera se vidi da ovaj oblik
omoguava da se jednom komandom INSERT umetne vie novih redova u tabel u.
Drugi oblik komande INSERT zavrava se komandom SELECT. Um.esto da vrednosti umeete runo, ovaj oblik omoguava da podatke uita te iz jedne ili vie tabela
baze podataka i da ih zatim umetnete u ciljnu tabelu.
Trei oblik komande INSERT omoguava da izriito zadate kolone u koje treba
umetnuti podatke. Primer upotrebe ovog oblika komande INSERT:
insert into department
set name='Asset Management';
Ovaj oblik omoguava da umetnete samo jedan red po komandi, ali ne morate da
zadate vrednosti za sve kolone. U ovom primeru, zadajemo vrednost samo za kolonu
name. Sve ostale kolone e preuzeti podrazumevane vrednosti (u kolonama u kojima su
takve vrednosti definisane) ili vrednost NULL. U ovom sluaju, koloni department ID
prosleuje se vrednost NULL, usled ega se aktivira mehanizam auto_increment koji
generie novu vrednost u toj koloni. (U to se moete uveriti ako ponovo izdate
komandu select * from department.)
Komanda INSERT ima nekoliko neobaveznih odredaba. Pogledajmo ukratko kako
one deluju:
Moete zadati da se komanda INSERT izvrava s niskim prioriteom (opcija LOW
PRIORITY), ili da se izvravanje odloi (opcija DELAYED). Obe opcije ine da se
umetanje podataka u tabelu odloi dok vie ne bude nijednog klijenta koji pokuava da uita podatke iz tabele. Razlika izmeu ove dve opcije je u tome to
Moete izriito zadati da kolona treba da preuzme svoju podrazumevanu vrednost ako umesto vrednosti za kolonu zadate opciju DEFAULT.
Opcija ON DUPLICATE KEY UPDATE prua elegantno reenje problema dupliranog primam og kljua ili duplirane jedinstvene vrednosti. Iza ove opcije sledi
komanda update koja menja postojeu vrednost primarnog kljua ili postojeu
jedinstvenu vrednost u koloni tako da se ona vie "ne sudara" s podacima iz
novog reda.
~
J,Y
' t
70
Komanda DELETE
Komanda REPLACE
ili
Komanda REPLACE deluje slino komandi INSERT, s tom razlikom to ako doe do
dupliranja kljua, novi red koji umeete zamenjuje postojei r~d.
,. v
IlE LETE
.il i
ili
ili
Komanda DELETE
SQL-ova komanda DELETE omoguava brisanje redova iz tabele. U listingu 5.1 prikazano je nekoliko primera komandi delete, kao to je sledei:
delete from department;
U ovom obliku, komanda delete brie sve redove iz tabele department.
Pomou opcije WHERE moete zadati redove koji se briu, na primer:
delete from department where name:Asset Management';
Ova komanda brie samo redove koji ispunjavaju uslove zadate u odredbi where.
U ovom primeru, bie izbrisani samo redovi koji u koloni name sadre vrednost
Asset Management.
Nije uobiajeno da se briu ba svi redove. Meutim, poto je to najkrai oblik
komande delete, moe vam se dogoditi daje grekom zadate bez odredbe WHERE.
Moete potedeti sebe te glavobolje ako na komandnoj liniji klijentskog programa .
mysql zadate opciju --safe-updates ili --i-am-a-dummy, kako je opisano u.pogl.~vlju
2 Kratak obilazak". Te opcije e vas spreiti da izbriete redove (Ih da Izmemte nJihov
s~d~aj) ako pomou odredbe WHERE ne zadate uslov za klju, tj. morate zadati da elite
da izbriete samo redove koji sadre odreene vrednosti kljueva.
U MySQL-ovoj dokumentaciji stoji da komanda DELETE ima sledei opti oblik:
DELETE [LOW_PRIORITY] [QUICK] FROM ime tabele
[WHERE uslov]
[ORDER BY ... ]
[LIMIT broj_redova]
[,
ime tabele [. *]
... ]
72
sintaksa.
Opti oblik komande DELETE prihvata i druge neobavezne odredbe:
Odredba LOW_PRIORITY deluje na isti nain kao
komandi INSERT.
Odredba QUICK moe ubrzati komandu DELETE jer nalae MySQL-u da odloi
neke od poslova odravanja indeksa dok brie podatke iz tabele.
Odredba ORDER BY odreuje redosled brisanja redova. Najkorisnija je u kombinaciji sa opcijom LIMIT - na primer, kada elite da izbriete iz tabele samo n
najstarijih redova.
Odredba LIMIT odreuje maksimalan broj redova koji komanda DELETE srne da
izbrie. Korisna je u kombinaciji sa odredbom ORDER BY ili kada elite da sp reite brisanje prevelikog broja redova.
Komanda TRUNCATE
Moete dodati neobavezno opciju WHERE da biste aurirali samo odreene redove,
1 d o je izosta vite, auriraete sve redove tabele. U ovom sluaju takoe, moe vam se
,1, ,Koditi da zaboravite opciju WHERE- seam se kad je jedan moj povrni kolega zadao
111 liO nalik na sledee:
1
ul te user
l password='test';
Komanda UPDATE
pomou
komande
l bli ng 5.2
l
128
IWLL
NULL
department_infile.txt
Finance
Research and Development
Human Resources
Marketing
Ova mogunost je naroito korisna kada treba u itati podatke iz formata neke
1li ugc baze podataka, iz tabele programa za tabelarne proraune ili iz CSV (comma\l'parated values) datoteke .
lli
Saetak
Komanda LOAD DATA INFILE zahteva da korisnik ima pravo FILE- detaljnije
infom1acije o tome potraite u poglavlju ll, "Upravljanje pravima korisnika", naroito
ako imate problema pri izvravanju ove komande. Pravo izvravanja ove komande
esto je ogranieno iz ozbiljnih bezbednosnih razloga- na primer, da biste spreili
korisnike da bilo ta unesu u /etc/passwd.
Opti oblik komande LOAD DATA INFILE izgleda ovako:
LOAD DATA [LOW_PRIORITY
CONCURRENT]
[LOCAL]
INFILE
'imeDatoteke.txt'
[REPLACE l IGNORE]
INTO TABLE ime_tabele
[FIELDS
[TERMINATED BY ' \t' ]
[[OPTIONALLY] ENCLOSED BY '']
[ESCAPED BY ' \ \ ' ]
[LINES TERMINATED BY '\n']
[IGNORE broj LINES]
[ (ime_kolone, ... ) l
Komanda
Odredba LOW PRIORITY deluje na isti nain kao u komandi INSERT, tj. eka da
drugi klijentski programi zavre uitavanje podataka iz tabele. Odredba CONCURRENT, s druge strane, omoguava drugim klijentskim programima da uitavaju
podatke iz tabele dok je vi punite podacima pomou komande LOAD DATA
INF ILE .
new_programmers.csv
pomou sledeeg
upita:
Kao to vidite, za prenoenje ovih podataka naveli smo vie opcija nego kada su
podaci u podrazumevanom formatu za komandu LOAD DATA INFILE. Vredno je istai
sledee:
Budui
Saetak
U ovom poglavlju razmatrali smo
tabelama baze podataka.
naine
76
Umetanje podataka
ili
ili
... ]
[LOCAL]
INFILE
. .. l
Komanda REPLACE deluje na isti nain kao komanda INSERT, s tom razlikom to u
sluaju dupliranja kljua zamenjuje postojee redove. Ako se to dogodi u komandi
INSERT, komanda se ne izvrava ili aktivira odredbu ON DUPLICATE KEY UPDATE.
Pitanja
1. Koja od narednih komandi uspeno umee nov red u tabelu employee?
a)
insert into employee values
set employeeiD=NULL, name='Laura Thomson',
job='Programmer', departmentiD=128;
Brisanje podataka
Izbegnite katastrofu pomou opcije --i-am-a-dummy.
Komanda DELETE brie podatke iz atebele:
DELETE [LOW_PRIORITY]
omoguava
b)
insert employee values
(NULL, 'Laura Thomson',
[WHERE uslov]
[ORDER BY ... ]
[LIMIT redova]
ili DELETE [LOW_PRIORITY] [QUICK] ime tabele [. *]
[,ime tabele[.*] ... ]
FROM reference_na_tabele
[WHERE uslov]
ili DELETE [LOW_PRIORITY] [QUICK]
FROM ime_tabele[.*] [, ime_tabele[.*] ... ]
USING reference_na_tabele
[WHERE uslov]
Auriranje podataka
Podatke u tabelama aurirate pomou komande UPDATE TABLE:
UPDATE [LOW_PRIORITY] [IGNORE] ime_tabele
SET ime_kolonel=izrazl [, ime kolone2=izraz2 ... ]
[WHERE uslov]
[ORDER BY ... ]
[LIMIT redova]
ili UPDATE [LOW_PRIORITY] [IGNORE] ime_tabele [, ime_tabele ... ]
SET ime_kolonelizrazl [, ime kolone2 izraz2 ... ]
[WIIERE us 1ov]
'Programmer', 128);
e)
insert into employee values
(NULL, Laura Thomson, Programmer, 128);
d)
insert employee values
(NULL, 'Laura O'Leary',
'Programmer', 128);
2. Komanda REPLACE
a) slina je komandi INSERT, s tom razlikom to se u sluaju dupliranja vrednosti kljua postojei red zamenjuje novim redom
b) slina je komandi INSERT, s tom razlikom to se u sluaju dupliranja vrednosti kljua postojei red zadrava a novi zanemaruje
e) slina je komandi UPDATE, s tom razlikom to se u sluaju dupliranja vrednosti kljua postojei red zamenjuje novim redom
d) slina je komandi UPDATE, s tom razlikom to se u sluaju dupliranja vrednosti kljua postojei red zadrava a novi zanemaruje
3. Opcija --i-am-a-dummy zadata u klijentskom programu mysql
a) spreava unoenje podataka
b) spn:nva auriranje podataka ako ni rc zadat~ vrednost odgovarajueg kljua
78
a) zareztma
b) razmacima
e) znakovima za tabulator
d) znakovima vertikalna crta
5. Neobavezna opcija LOCAL U komandi
Korienje
upita u MySQL-u
Vebe
1. Napiite grupu komandi INSERT pomou kojih ete napuniti podacima tabele
u svojoj bazi podataka porudzbine.
Odgovori
Pitanja
l. b
2.
3.
4.
5.
d
e
Vebe
Ne postoji jedno " tan o" reenj e vebi iz ovog poglavlj a. Potrudite se samo da ih sve
uradite do kraja .
U sledeem poglavlju
U poglavlju 6, "Korienje upita u MySQL-u", poeemo da se bavimo SQL-ovom
"dcvojkom za sve", tj. komandom SELECT i njenim brojnim varijantama.
SELECT
Jednostavni upiti
U itavanje podataka samo iz
Alijasi kolona
odreenih
Upotreba odredbe
uitavanje
WHERE
za
kolona
samo
odreenih
redova
O grani avanje
LIMIT
U poglavlju 7, "Sloeniji upiti" , b aviemo se sloenijim upitima, a naro ito upitima koji obuhvataju vie tabela, te podupitima i raznim vrstama spoj eva izme u
tabela.
U poglavlju 8, "Upotreba M ySQL- ovih ugraeni h funkcija u komandi SELE CT",
razmotrie mo brojne fu nkcij e koj e postoj e u M ySQL- u da bi vam pomogle pri upotrebi upita.
Najpre emo pogledati opti oblik komande SELECT.
HU
sledei
rcdosledom koji vam treba. Imena kolona treba da zadate u obliku liste vrednosti
r:tzdvojenih zarezima.
Sledei upit uitava samo vrednosti iz polja employeeiD i name tabele employee:
opti oblik:
SELECT kolone
FROM tabele
[WHERE uslovi]
[GROUP BY grupe
[HAVING uslovi_za_grupe]]
[ORDER BY kolone_za_sortiranje]
[LIMIT broj] ;
Jednostavni upiti
Primer najjednostavnijeg oblika komande SELECT izgleda ovako:
---------------+-------------+
l name
l employeeiD
---- -----------+-------------+
Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith
6651
7513
9006
9842
---- ---------+---------------+
~
Kao to vidite, prikazane su samo vrednosti iz kolona koje smo zadali u upitu.
Obratite panju na to da su kolone prikazane redosledom koji smo zadali u upitu, a ne
rcdosledom kojim su definisane u emi baze podataka.
+---------------+--------------------------+
l departmentiD l name
l
+---------------+--------------------------+
42
Finance
l
128
Research and Development l
129
Human Resources
l
130
Marketing
l
+---------------+--------------------------+
4
Ovaj upit je u itao sve podatke iz zadate tabele - tj. sve redove i sve kolone iz
tabele department.
Postupak moete isprobati i na nekoj drugoj tabeli- na primer, uitajte sve redove
i sve kolone iz tabele employeeSkills.
Razume se, sutina relacione baze podataka svakako nije u tome da vam daje sve
podatke koje ste u nju uneli, ve da vam omogui da naete odreene podatke.
Uitavanje
podataka iz
odreenih
---------------+
l name
t---------------+
Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith
nn primer:
kolona
selec t name
irom employee.employee;
(Trebalo bi da pomou ovog upita dobijete isti rezultat kao pomou prethodnog
upita.)
t"OglaVIJe O
select employee.employee.name
from employee;
se lect e.name
from employee e;
Ova sintaksa nije naroito korisna za ovakve jednostavne upite, ali kad budete
preli na sloenije upite, ona e vam omoguiti da na nedvosmislen nain zadajete
podatke koji su vam potrebni.
re
~ctrnu
uurcucr1111 rt:uuvd
Alijasi
Sada bi trebalo da objasnimo koncept alijasa kolona i tabela.
Kolonama i izrazima u komandi SELECT moete dodeliti drugaija imena, koja
se prikazivati u rezultatima. Na primer, moemo upotrebiti sledei upit:
+---------------+
l employeeName
+---------------+
Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith
+---------------+
4
Kao to vidite, sadraj kolone name sada je prikazan ispod zaglavlja employeeName .
Identifikator employeeName poznat je kao a/ijas (engl. alias). Postoje odreena pravila o tome ta se moe a ta se ne moe raditi sa alijasima, koja emo objasniti kad
doemo na tu temu .
Navedeni primer alijasa nije naroito koristan. Meutim, pravu mo alijasa shvati ete kad ponete da piete sloenije upite i upite u kojima se neto izraunava.
Alijasi se mogu zadavati i za tabele, kao u sledeem primeru:
select e.name
from employee as e;
Trebalo bi da rezultati ovog upita budu isti kao da smo ga napisali bez upotrebe alij asa. Ovaj nain notacije postae koristan kada u narednom poglavlju ponete da
izvravate upite koji obuhvataju vie tabela.
uitavanje
Dosad smo razmatrali uitavanje svih podataka sadranih u tabeli i uitavanje svih
podataka samo iz odreenih kolona. Sada emo prei na uitavanje samo odreenih
redova. To je korisno jer esto treba da iz jedne ili vie tabela uita te samo zapise koji
ispunjavaju odreene uslove. Ta mogunost postaje jo vanija kada je potrebno ui
tati samo nekoliko traenih redova iz veoma obinme tabele.
To se moe obaviti pomou odredbe WHERE komande SELECT. Jednostavan primer
bio bi sledei:
se lect employeeiD, name
from employee
where job='Programmer';
(Uzgred, imajte u vidu da se tekst upita moe rasporediti u vie redova. Svaki upit
se zavrava znakom taka i zarez. (;). Upite piemo na taj nain da bi bili itljiviji.)
Rezultati izvravanja ovog upita u bazi podataka employee izgledaju ovako:
+- --- - --------+--------------+
l employeeiD l name
+--- ----------+--------------+
6651 l Ajay Patel
l
7513 l Nora Edwards l
+- ------------+--------------+
2
U odredbi WHERE zadali smo uslov zbog kojeg se izdvajaju samo redovi tabele koji
ga ispunjavaju - u ovom primeru, to su zaposleni koji rade kao programeri.
Obratite panju na to da smo u upitu kombinovali uslov s kolonama koje nam trebaju (employeeiD i name) da bismo uitali samo podatke koji su nas zanimali .
U ovom primeru, u odredbi WHERE zadali smo ispitivanje jednakosti. Obratite
pa nju na to da u SQL-u znak = slui za ispitivanje jednakosti. To je razliito od mn gi b drugih programskih jezika, u kojima se za tu namenu koristi == ili eq.
84
Postoji veliki broj funkcija koje se mogu zadati u odredbi WHERE i koje emo detaljno
objasniti u poglavlju 8. Zasad emo navesti samo operatore koji se najee koriste:
Jednakost, ili=, to smo
ve
--- ------------------+
job
koristili.
--- ------------------+
vee
Programmer
Programmer
Sys tems Administrator
OBA
-- -------------------+
rows in set (0 . 01 sec)
Obratite panju na to da se podatak Programmer pojavljuje dvaput jer postoji
dva reda tabele. Upit je u itao listu svih vrednosti iz kolone job tabele employee .
A sada, pogledajte sledei upit:
Uobiajeni aritmetiki
ll
-- -------------------+
(l
job
8;
Ovaj upit uitava iz kolone assignment sve poslove na kojima je zaposleni ija je
ifra employeeiD 6651 (Ajay Pate!) radio vie od osam asova.
Vano je istai da u odredbi WHERE nije dozvoljena upotreba alijasa za kolone
tabela, ve morate navesti izvorno ime kolone. To je ogranienje ANSI standarda za
jezik SQL. Razlog je to to vrednost kolone predstavljene alijasom moda nee biti
poznata u trenutku ispitivanja uslova zadatih u odredbi WHERE.
pomou
Programmer
Systems Administrator
OBA
- --------------------+
rows in set (0.04 sec)
--- -------+
count (job)
-- --------+
4 l
-- --------+
row in set (0 . 01 sec)
Prema rezultatima ovog upita, kolona j ob sadri etiri vrednosti . To navodi na
po~rean zakljuak jer nije tano da u toj koloni postoje etiri razliite vrednosti. Ako
pogledate podatke u tabeli, videete da kolona j ob sadri samo tri razliite vrednosti.
Lako vam se moe dogoditi da grekom zadate prethodni upit kada ste imali na
11111u sledei upit:
l
86
ltlzultati
sledee:
ount (*)
niji podatak.
biti nalik na
-- ---+---------------------- -+
l job
l
--- ---+-----------------------+
l l Systems Administrator l
2 l Programmer
l
l l DBA
l
-- ----+-----------------------+
+---------------------+
l count(distinct job) l
+---------------------+
3 l
+---------------------+
1
. .
Sledea odredba koju emo razmotriti jeste GROUP BY koJa omogucava gruptsanJe u ct-
tanih redova. Ona je zaista korisna samo kada je upotrebite u kombinaciji s funkcijama
koje deluju na grupe redova. Jedina takva funkcija koju smo dosad pomenuli jeste
count (), ali u poglavlju 8 razmotriemo vie drugih.
Pogledajte sledei upit:
select count(*), job
from employee
group by job;
Ovaj upit prebrojava zaposlene po radnom mestu- tj. utvruje broj zaposlenih. po
svakom radnom mestu. Ako izvrite ovaj upit u bazi podataka employee, trebalo bt da
dobijete rezultat nalik na sledei:
+----------+-----------------------+
l count(*) l job
l
+----------+---------------- - ------+
l l DBA
l
2 l Programmer
l
1 l Systems Administrator l
+----------+----------------- - -----+
3
l e om
O vaj upit uitava sva radna mesta u firmi na kojima je zaposlen samo po jedan slu:hl'nik. Trebalo bi da rezultati budu nalik na sledee:
---- ----+-----------------------+
l job
l
----- -- -+-----------------------+
l l DBA
l
l l Systems Administrator l
-- ------+---------------------- -+
count(*)
Sortiranje
uitanih
rezultata
S k-d e a
ct *
om employee
o td r by j ob a se , n me d sc ;
' 1
l t
odredbe ORDER BY
t l'rttltujuih
st'
pomou
BB
Saetak
Ovaj upit uitava sve redove i kolone iz tabele emplo~e~ .. R:zul.tati. ~e bi~i sortirani
po abecednom redosledu sadraja kolone job, a .ako dvoje 1h v1se ljudl 1~1a 1s.t o radno
mesto, oni e biti sortirani opadajuim abecedmm redosledom po unemma l prezlmenima. Rezultati upita izgledaju ovako:
+ --------------+-----------------------+--------------+
1 b
+------------ -
employeeiD
name
JO
l departmentiD l
--------------+
+------------+---------------+-----------------------i
9842 l Ben Smith
DBA
l
l
7513 l Nora Edwards
Programmer
l
l
6651 1 Ajay Patel
42
128
128
l
l
l
Programmer
Ako za kolonu zadate odredbu ORDER BY bez opcije ASC ili DESC, p~~razumeva se
ASC. Ukoliko ne zadate odredbu ORDER BY, nita se ne moe pretpostav1t1 o redosledu
redova u skupu rezultata.
Saetak
. .
Poslednja odredba komande SELECT koju emo razmotriti u ovom poglavlju jeste
.
.
.
leodredba LIMIT.
Odredba LIMIT ograniava broj redova rezultata koje up1t daje. Na pnmer, pog
dajte
sledei
upit:
select *
from employeeSkills
limit 5;
Ovaj upit daje samo prvih pet redova koji ispunj.ava~u zadati uslov. U ovom sluaju, to je prvih pet redova uitanih uz tabele, kao sto je pnkazano:
+------------+-------+
1 employeeiD l skill
+------------+-------+
6651 l Java l
6651 l VB
l
7513 l e
l
7513 l Java
l
7513 l Perl
l
+----------- -+-- --- --+
5 rows in set (0.44 sec)
Moete zadati i da elite podskup redova drugaiji od prvih n. Ako pomo~u p:ethodnog upita hoemo da uitamo redove od 6 do 8, to emo uraditi na sledeCl nacm:
select *
from employeeSkills
limit 5, 3;
Kada u odredbi LIMIT za damo dva parametra, prvi je relativni pomak (red od
kojeg poinje uitavanje) a drugi je maksimalni broj redova koji elimo da se uita.
Uporedite to s prethodnim sluajem: kada zadamo samo jedan parametar, on predstavlja maksimalni broj redova koji elimo da se uita.
Kada zadajemo pomak, on poinje od O (kao to se vidi u prethodnom primeruza esti red zadali smo pomak 5). Prvi navedeni primer upotrebe odredbe LIMIT uitava
redove od O do 4, a drugi primer uitava redove od 5 do 7.
Ako kao vrednost drugog parametra zadate -1, upit e uitati redove od pomaka
do kraja tabele.
Odreba LIMIT se najee koristi u kombinaciji sa odredbom ORDER BY da bi redesled redova u rezultatima upita imao odreeni smisao. Imajte u vidu da bez odredbe
ORDER BY, redosled redova rezultata nije predvidljiv.
Ova odredba je naroito korisna u We b ili GUI aplikacijama koje koriste MySQL
jer omoguava jednostavan mehanizam podele rezultata na stranice.
sledei
opti oblik:
SELECT kolone
FROM tabele
[WHERE uslovi]
[GROUP BY grupa
[HAVING uslovi_ za_grupe]]
[ORDER BY kolone_za_sortiranje]
[LIMIT broj] ;
Odredba select * uitava sve kolone; select ime kolone uitava samo navedenu kolonu.
Tabele moemo navoditi kao baza_podataka. tabela a kolone kao tabela. kolona ili baza_poda taka. tabela. kolona da bismo izbegli dvosmislenost.
Alijasi su alternativna imena za tabele i kolone, a zadaju se na sledei nain:
select kolona as alijas_kolone
from tabela as alijas_tabele;
slino
Odredba ORDER BY sortira redove rezultata prema sadraju kolona koje navedete.
Odredba LIMIT odreuje koji e redovi biti uitani iz mogueg skupa rezultata.
Maksimalni broj redova zadaje se u obliku pomaka od kojeg poinje u itavanje.
90
Ud govon
Pitanja
a) za kolone
b) za tabele
a)
select *
from client
where clientiD=2;
e)
odredbi WHERE
d)
odredbi SELECT
b)
a) LIMIT lS, 20
b) LIMIT 14, 19
e) LIMIT 14, s
e)
select * from client
limit l;
d)
select all from client;
2. Koji od sledeih upita uitava sve programere iz tabele employee?
a)
select *
from employee
where job='Programmer';
d) LIMIT lS, s
Vebe
1. Napiite upit koji daje sve podatke o zaposlenima u slubi (tabela department)
ija je ifra 128.
2. Napiite upit koji iz kolone employeeiD uitava sve ifre zaposlenih koji su radili
za klijenta ija je ifra l.
strunu kvalifikaciju evidentiranu u tabeli employeeSkills daje ukupan broj zaposlenih koji je imaju.
b)
select *
from employee
having job='Programmer';
Odgovori
e)
select *
from employee
where job='Programmer'
group by job
having job='Programmer';
d)
select job
from employee;
3. Koji od sledeih upita ne daje ukupan broj zaposlenih evidentiranih u tabeli
employee?
Pitanja
l. b
2. a
3. d
4. e
S. e
Vebe
1.
select *
from employee
where departmentiD=128;
a)
select count(employeeiD) from employee;
b)
2.
select employeeiD
from assignment
where clientiD=l;
e)
select count(distinct employeeiD) from employee;
3.
d)
select count(employeeiD) from employee group by employeeiD;
s l cL skill , count(skill)
f 1om mploy Skills
CJI Oll Jl
IJy ll k { ) J ;
92
Poglavlje 6
Korisenje
upita u
My~UL-u
U sledeem poglavlju
Sloeniji upiti
BAVIEMO
Razmatraemo
OVOM POGLAVLJU
SE sloenijim upitima.
prvenstveno kako se mogu izvravati upiti koji obuhvataju vie tabela istovremeno. Zbog
toga ete morati da savladate koncept spajanja tabela, tj. nain na koji se tabele mogu
meusobno povezati.
Razmotriemo sledee teme:
sledeih
vrsta spojeva:
Jednakovrednih spojeva
Levih i desnih spojeva
Podupiti
Upotreba opcija komande
SELECT
sledei
upit:
rogtaVIJC l
Kao to vidite, u odredbi FROM zadali smo dve tabele umesto samo jedne. U ovom
elimo da uitamo imena zaposlenih i nazive slubi u kojima rade. Rezultati
ovog upita izgledaju ovako:
sluaju
+---------------+--------------------------+
l name
l name
+---------------+--------------------------+
Ben Smith
Ajay Patel
Nora Edwards
Candy Burnett
Finance
Research and Development
Research and Development
Research and Development
+---------------+--------------------------+
4 rows in set
(0.42 sec)
Kako smo dobili ove rezultate? Prvo, zadali smo kolone koje postoje u razliitim
tabelama. (Obratite panju na to da smo upotrebili notaciju s takom, kako je opisano
u poglavlju 6, da bismo razlikovali kolonu name iz tabele employee od istoimene
kolone koja postoji i u tabeli department.) Da bi to moglo da radi, morali smo da
navedemo imena obeju tabela u odredbi FROM.
Najzanimljiviji deo ovog upita jeste odredba WHERE. Ako ovaj upit izvrite bez
odredbe WHERE, u sledeem obliku:
select employee.name, department.name
from employee, department;
dobiete sledee
rezultate:
+-- -- -----------+--------------------------+
l name
l name
+---------------+--------------------------+
Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith
Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith
Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith
Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith
Finance
Finance
Finance
Finance
Research and Development
Research and Development
Research and Development
Research and Development
Human Resources
Human Resources
Human Resources
Human Resources
Marketing
Marketing
Marketing
Marketing
+- - -------------+--------------------------+
16
:>IOZCniJI Upili
Prvi upit, kojem je pridruena odredba WHERE, prikazuje zaposlene s tanim podacima o slu bama u kojima rade, a drugi upit prikazuje sve kombinacije zaposlenih i
slu bi , pri e mu nij e mogue utvrditi koji redovi rezultata sadre ta n e pod.11 kl a koji
' " podaci besmisleni! Ovaj skup rezultata, koji se sastoji od svih moguih kombinacija
lt'dova iz dve tabele, zove se Dekartov proizvod (engl. Cartesian product) dveju tabela.
Sasvim je oigledno da je odredba WHERE kljuna za dobijanje rezultata koji nam
li l!baju. Kada u upitu spajamo dve tabele, uslov ili grupa uslova pomou kojih povet ujemo tabele zove se spojni uslov. U ovom sluaju, uslov je employee. department ID
de partment. department ID, to je veza izmeu tabela koju smo definisali preko
\poljnih kljueva jo u emi baze podataka.
Kada elite da istovremeno uita te podatke koji se nalaze u vie tabela, morate upotrebiti veze izmeu tih tabela da biste pronali podatke koje traite. Ponekad to znai
da morate pronai put od podataka koje znate do podataka koje traite. U narednom
odeljku opirnije emo objasniti tu ideju.
U prethodnom primeru rezultata obratite panju i na to da u zaglavljima obe
kolone stoji natpis"name"jerje to ime svake kolone u kontekstu tabele kojoj pripada.
ltezultati e biti razumljiviji ako upotrebite alijase, na primer:
sel ect employee.name as employeeName, department.name as departmentName
Jrom employee, department
where employee . departmentiD
department.departmentiD;
Ovaj upit daje
sledee
rezultate:
1---- -----------+--------------------------+
l employeeName l departmentName
1--- ------------+--------------------------+
Ben Smith
Ajay Patel
Nora Edwards
Candy Burnett
Finance
Research and Development
Research and Development
Research and Development
--- ------------+--------------------------+
1 rows in set (0.55 sec)
I'U911VIJe
::IIUZeniJI Ufllll
+--------------------------+
l name
+--------------------------+
l Research and Development l
+--------------------------+
l row in set (0.00 sec)
U upitu koji smo napisali uoiete da smo morali navesti sve tabele u putanji koju
smo sJedili i zadati spojne uslove koji povezuju jednu tabelu s drugom. U ovom sluaju
imamo jedan obian uslov- client. name = 'Tel co Inc' - i vie spojnih uslova.
Obratite panju na to da smo spojili etiri tabele pomou tri spojna uslova.
Primenom ovog pravila moete proveriti da li ste zadali sve potrebne uslove. Kada
spajate n tabela, u veini sluajeva, trebae vam po jedna veza izmeu svakog para tabela,
to znai da ete imati n-1 spojnih uslova. Spojevi definisani u ovom primeru prikazani
su na slici 7.1.Jasno se vidi zbog ega je za etiri tabele potrebno tri (n-1) spoja.
To moemo obaviti
pomou sledeeg
1:1
upita:
select e2.name
from employee el, employee e2
where el.name = 'Nora Edwards'
and el.departmentiD = e2.departmentiD;
Kao to vidite, u ovom upitu deklarisali smo dva razliita alijasa za tabelu employee.
Time smo opisali MySQL-u da emo raditi kao da imamo dve zasebne tabele, el i e2,
koje sluajno sadre iste podatke. Zatim smo te tabele spojili, na isti nain kao to
bismo to uradili s bilo kojim drugim dvema tabelama. Najpre smo u tabeli el potraili
red s Norinim podacima (u kojem je ispunjen uslov el. name=' Nora Edwards'), a
zatim smo u tabeli e2 potraili redove koji u koloni departmentiD sadre istu ifru
slube kao ona u kojoj radi Nora (el. department ID = e2. department ID).
Moda e vam trebati malo vremena da se naviknete, ali ako moete da zamislite da
radite s dve razliite tabele, ne bi trebalo da imate veih tekoa.
Ovo su rezultati prethodnog upita:
+--------- ------+
l name
l
+---------------+
Ajay Patel
l
l Nora Edwards l
l Candy Burnett l
+------ ---------+
3 rows in set (0.00 sec)
Prikazani su svi zaposleni koji rade u istoj slubi kao Nora. Kao to se vidi, na listi se
nalazi i Nora. Upitu moemo lako dodati nov uslov koji e je iskljuiti is skupa rezultata:
assignment.employeeiD=employee.employeeiD
assignment.departmentiD=department.departmentiD
select e2.name
from employee el, employee e2
where el.name = 'Nora Edwards'
and el.departmentiD = e2.departmentiD
and e2.name != 'Nora Edwards';
Vrste spojeva
Slika 7.1
Za povezivanje
etiri
izmeu
tabela
izmeu
MySQL-ovih tabela.
Osnovni spoj
Spajanje tabele same sa sobom - samospoj
Kao to jednu tabelu spajamo s drugom, isto tako moemo je spojiti i sa samom sobom.
Zato bismo to uradili? Ponekad ete traiti veze izmeu redova u istoj tabeli. Pretpostavimo da elimo da saznamo imena svih zaposlenih koji rade u istoj slubi kao Nora
Edwards. Da bismo doli do tih podataka, prvo moramo u tabeli employee pronai ifru
slu be (kolona department ID) u kojoj radi Nora, a zatim emo u tabeli employee
potra7iti i sve ostale zaposlene koji rade u toj slubi.
ruyli:IVIJt: l
.:>IULt:nljl Upili
Podu piti
Dosad smo u odredbi FROM zadavali listu tabela razdvojenih operatorom zarez. Time
se dobija unakrsni spoj, kao to je ve opisano, koji se pretvara u jednakovredni spoj kada
mu dodamo odredbu WHERE. MySQL podrava vie oblika sintakse za ou vrstu spoja.
Pogledajmo izvorni upit:
select employee.name, department . name
from employee, department
where employee.departmentiD ; department.departmentiD;
Umesto zareza, moe se zadati neobavezna rezervisana
re
JOIN:
Levi spoj radi tako to za sve redove tabele na levoj strani spoja (u ovom primeru to
ll' tabela employee) trai odgovarajue redove u tabeli na desnoj strani spoja. Pronaeni
1 dovi se postavljaju pored leve tabele. Za svaki red iz leve tabele koji nema parnjaka u
desnoj tabeli, operator LEFT JOIN dodaje red vrednosti NULL . Redove iz leve tabele bez
parnjaka u desnoj moete pronai ako zadate uslov daje vrednost kljua u desnoj tabeli
NULL.
Pogledajte ponovo primer. U ovom spoju, za svakog zaposlenog koji je radio za
nekog spoljnog klijenta, dobiemo red s podacima o zaposlenom i o poslu koji je
obavio. Kada za nekog zaposlenog ne postoji odgovarajui red u tabeli assignment, levi
spoj generie "prazan red" u kojem sve kolone sadre vrednost NULL. Te prazne redove
moemo pronai tako to potraimo sve zaposlene koji su neto radili za spoljnog
klijenta ija ifra (kolona clientiD) sadri vrednost NULL. (Ne bi trebalo da takav
s l uaj postoji u tabeli assignment budui daje clientiD polje kljua.)
U verzijama MySQL-a pre 4.1, ta tehnika se esto koristila jer nije bilo podu pita.
Podupiti su objanjeni u nastavku ovog poglavlja.
U ovom primeru upotrebili smo operator LEFT JOIN, ali isto tako smo mogli da
upotrebimo i operator RIGHT JOIN, koji deluje na isti nain, s tom razlikom to je
desna tabela osnova, a nedostajui redovi iz tabele na levoj strani dopunjuju se vrednostima NULL .
sledee
rezultate:
+- - -------------+
l name
l
+--- ------------+
l Ajay Patel
l
l Candy Burnett l
l Ben Smith
l
+-- -------------+
3 rows in set (0.49 sec)
Ako pogledate sadraj tabela, lako ete se uveriti da su rezultati tani, ali kako sm o
do njih doli ?
Pod upiti
Podupit (engl. subquery) jeste upit unutar drugog upita, odnosno upit iji se rezultat
koristi u drugom upitu. Ponekad se nazivaju i ugneenim upitima (engl. nested queries).
Pod upiti su novina uvedena u MySQL-u 4.1. Tu mogunost korisnici su ve due
vreme zahtevali. Podupiti ne dodaju novu funkcionalnost, ali su upiti esto lake razunlljivi kada se, umesto sloenih spojeva izmeu tabela, upotrebe podupiti.
Ve ste videli primer podupita a da toga niste ni bili svesni. Upiti za brisanje i aurira nj e redova u vie tabela istovremeno koje smo razmatrali u poglavlju 5, "Umetanje,
brisanje i auriranje podataka" ,jedna su vrsta specijalizovanog pod upita.
U ovom poglavlju opisaemo upotrebu podupita u komandama SELECT.
MySQL-u su dodate dve osnovne vrste podupita:
Podupiti za izvedene tabele
Podupiti za izraze.
Podupiti za izraze zadaju se u odredbi WHERE komande SELECT. Oni se dele na dve
podvrste:
Pod upite
iji
Podupite za izraze
Po gledaemo
logikog
tipa
l UU
ruyiCIVIJt: l
.:>IULt:IIIJI UfJill
Pod upiti
Podupiti za izvedene tabele (engl. derived table subqueries) omogucavaJU zadava~Je u~lta
u odredbi FROM drugog upita. Time se formira privremena tabela koja se dodaje up1tu.
Pogledajte sledei jednostavan upit:
select employeeiD, name from employee where job='Programmer';
Jasno je da ovaj upit uitava ifre i imena zaposlenih koji su programeri. Ovaj upit
moemo upotrebiti u drugom upitu da bismo dobili drugi koristan rezultat:
select programmer.name
from (select employeeiD, name from employee where job='Programmer')
as programmer,
assignment
where programmer.employeeiD = assignment.employeeiD;
sadre samo kolone employee ID i name. Privremenoj tabeli dodelili smo alijas 'programmer . Tu tabel u moemo potom pretraivati na isti nain kao bilo koju drugu
tabelu. U ovom primeru upotrebili smo je da bismo utvrdili koji su programeri radili
za spoljne klijente i dobili smo sledee rezultate:
+--------------+
l name
+--------------+
l Nora Edwards l
+--------------+
1 row in set
(0.42 sec)
Mogu se napisati i upiti koji umesto jedne vrednosti, vraaju red s vie vrednosti, ali
.Jl: korist od toga esto ograniena. U nastavku teksta obradiemo primer takvog upita.
(0.01 sec)
from assignment;
Rezultat ovog upita je jedna vrednost, koja predstavlja najvei broj radnih sati utroenih na neki posao. Ovde smo upotrebili MySQL-ovu funkciju koju dosad nismo
pominjali: to je funkcija max () , koja pronalazi najveu vrednost u zadatoj koloni_
tabele. Funkcijom max () baviemo se vie u poglavlju 8, "Upotreba MySQL-ov1h
ugraenih funkcija u komandi SELECT". U pod upitima koji vraaju jednu vrednost
(engl. single-value subqueries), esto se ova vrsta funkcija koristi za dobijanje meurezul
tata koji se potom koristi za druge proraune.
Kao u prethodnim odeljcima, ovaj upit emo upotrebiti unutar drugog upita.
Rezultat upita koji vraaju jednu vrednost jeste odreena vrednost koja se potom
obino poredi s nekom drugom vrednou. Pogledajte sledei upit:
select e.employeeiD, e.name
from employee e, assignment a
where e.employeeiD = a.employeeiD
and a.hours = (select max(hours) from assignment);
Ovaj upit daje jednake rezultate kao razmatrani upit u primeru za operator LEFT
JOIN (levi spoj), a to su zaposleni koji nisu obavili nijedan posao za nekog spoljnog
klijenta. Rezervisana re IN omoguava da utvrdite da li se data vrednost nalazi u
odre enom skupu moguih vrednosti. U ovom sluaju dobijamo jednake rezultate
kao one koje smo dobili u primeru upita za operator LEFT JOIN:
(0.45 sec)
102
+---------------+-------------+
l
name
employeeiD
+---------------+-------------+
l
l
l
Ajay Patel
Candy Burnett
Ben Smith
l
l
l
6651
9006
9842
l
l
vei od broja radnih sati nekog programera. To se radi u delu upita a. hours > ALL,
gde se utvruje da li je broj radnih sati zaposlenog vei od broja radnih sati svakog
programera pojedinano.
Nee vas iznenaditi informacija da ovaj upit ne vraa nijedan red podataka, ime
dokazuje da niko u toj firmi ne radi vie od programera.
...
+---------------+-------------+
3 rows in set (0.00 sec)
Rezervisane rei ALL, ANY i SOME omoguavaju poreenje sa skupom vrednosti koje
podupit.
Pretpostavimo da Nora Edwards, koje se moda seate kao programera koji najvie
radi, eli da dokae da niko nema vie radnih sati od programera . Da bi dokazala tu
injenicu, smislila je sledei upit:
select e.name
from employee e, assignment a
where e.employeeiD = a.employeeiD
and a.hours > all
(select a.hours
from assignment a, employee e
where e.employeeiD = a.employeeiD
and e.job='Programmer');
vraa
Podu pit uitava listu radnih sati, pojedinano po programeru i po poslu koji je
obavio. Potom glavni upit ispituje da li postoji drugi zaposleni iji je broj r:~dnih sati
104
SQL CACHE
Odredbe FOR UPDATE i LOCK IN SHARE MODE deluju samo ako vaa maina baze
podataka zakljuava podatke na nivou stranice ili reda. U praksi, opcija je upotrebljiva ako koristite maine InnoDB i BDB.Ako zadate FOR UPDATE, zakljua
vanje podataka e biti iskljuivo, a ako zada te LOCK IN SHARE MODE, zakljuavanje
e biti deljeno.Vrste zakljuavanja razmotriemo u poglavlju lO",Upotreba transakcija u InnoDB tabelama".
Saetak
Spojevi
Spoj je postupak povezivanja dveju tabela. Tabele koje povezujemo navodimo u
odredbi FROM, zajedno s vrstom spoja. Treba takoe zadati i uslov koji opisuje na
koji nain bi tabele trebalo da budu spojene.
Operator zarez i rezervisane rei JOIN, INNER JOIN i CROSS JOIN deluju na isti
na in, tj. kombinuju zadate tabele tako da omogue traenje podataka u svim
tim tabelama.
Lev i desni spojevi omoguavaju pronalaenje redova u jednoj tabeli koji nemaju
odgovarajue redove u drugoj tabeli.
rrranJa
Pod upiti
Pod upit je upit ugneen unutar drugog upita.
Pod upiti mogu da vrate jednu vrednost, red podataka ili skup vrednosti. Mogu se
koristiti i za ispitivanje logikih uslova pomou operatora SOME, ALL ili ANY
Pomou operatora EXISTS moe se utvrditi da li u rezultatima podupita postoji
red koji je povezan s nekim redom glavnog upita.
Pitanja
1. De kart ov proizvod je
a) skup svih moguih kombinacija redova iz dve ili vie tabela
b) skup kombinacija redova iz dve ili vie tabela koji su logiki povezani
e) skup redova iz jedne tabele kojima su dodati odgovarajui redovi iz druge
tabele, a gde to nije mogue, rezultujui red je popunjen vrednostima
NULL na mestima gde bi bili podaci iz druge tabele
d) nije nita od prethodnog
2. Levi spoj je
a) skup svih moguih kombinacija redova iz dve ili vie tabela
b) skup kombinacija redova iz dve ili vie tabela koji su logiki povezani
e) skup redova iz jedne tabele kojima su dodati odgovarajui redovi iz druge
tabele, a gde to nije mogue, rezultujui red je popunjen vrednostima
NULL na mestima gde bi bili podaci iz druge tabele
d) nije nita od prethodnog
3. Jednakovredni spoj je
a) skup svih moguih kombinacija redova iz dve ili vie tabela
b) skup kombinacija redova iz dve ili vie tabela koji su logiki povezani
e) skup redova iz jedne tabele kojima su dodati odgovarajui redovi iz druge
tabele, a gde to nije mogue, rezultujui red je popunjen vrednostima
NULL na mestima gde bi bili podaci iz druge tabele
d) nije nita od prethodnog
106
u s1eaecem poglaVlJU
izmeu
e) dva spoja
d) redova glavnog upita i redova podupita
5. Razlika izmeu upita oznaenih sa 5.1 i 5.2 u nastavku teksta j e
a) nema razlike
b) uitavaju razliite podatke
e) uitavaju iste podatke ali je verovatno da
ui tavati
d) uitavaju iste podatke ali je verovatno da
ui tavati
1.
select name, skill
from employee, employeeSkills
where employee.employeeiD = e mpl oye e Skills.employeeiD;
2.
select employee.name
from employee left join assignment
on employee.employeeiD = assignment.employeeiD
where clientiD is null;
Upit 5.2:
e. employeeiD) ;
Pitanja
1. a
2. e
3. b
4. d
5. e
3.
select clientiD, name
from client
where not exists
(select *
from assignment
where assignment . clientiD
client.clientiD);
U sledeem poglavlju
U poglavlju 8",Upotreba MySQL-ovih ugraenih funkcija u komandi SELECT",
razmatraemo funkcije koje postoje u MySQL-u za upotrebu u komandi SELECT.
Vebe
Odgovori
sledea
Upit5 .1:
Vebe
8
Upotreba MySQL- ovih ugraenih
funkcija u komandi SELECT
UGRAENIH
BY.
Vano je zapamtiti da se u MySQL-u svaki izraz koji sadri vrednost NULL svodi na
vrednost NULL, uz nekoliko izuzetaka koje emo istai kada budemo naili na njih. O
lome e biti vie rei u odeljku o operatorima za poreenje vrednosti.
Uporedite to sa
se lect 2+2;
rezultat
+- ----+
1 row in set (0.42 sec)
Moete izvravati izraze koji ne sadre imena tabela i u kojima moete zadavati irok
opseg matematikih i drugih operatora i funkcija. Izraun~:ranje 2+2 je ~aista trivijalno,
ali to svakako ne vai za izvravanje matematikih operaciJa u komandi SELECT. Na
primer, to vam omoguava da uradite finansijsku analizu vrednosti u tabelama i da
Operatori
+-- -- - -- - -- - +
l NULL=NULL l
+-------- - - -+
NULL l
re
uitava
Tabela 8.1
Operator
Operatori za
poreenje
Znaenje
Jednako
!= ili <>
Razliito
<
Manje od
Jednako ili manje od
Vee od
Jednako ili vee od
<=
>
>=
sec )
re
Ovaj primer istie ono to smo napomenuli u poglavlju 6, a to je da morate oprezno korisiti operatore za poreenje ukoliko se meu podacima moe pojaviti i NULL.
Druga injenica koju bi trebalo da zapamtite jeste da se u veini sluajeva , pri pareenju vrednosti znakovnog tipa u MySQL-u ne pravi razlika izmeu malih i velikih
slova. Ako elite da se znakovne vrednosti porede tako da se ipak pravi razlika izmeu
malih i velikih slova, ispred jedne od njih dodajte prefiks BINARY. Na primer,
Aritmetiki operatori
v
-----------+
1 row i n set (0 . 00
+--------------+
l row in set (0.00 sec)
+-- ---+
l 2+2 l
+-- ---+
4
upitom:
za date
dobiete
sledeim
od
poreenje. Najee
se koriste
ll
Tabela 8.1
Operatori za
poreenje
(nastavak)
Znaenje
Operator
n BETWEEN min AND max Poreenje da li se n nalazi u opsegu vrednosti od min do max.
n IN (skup vrednosti) Pripadnost skupu vrednosti koji se moe zadati u obliku liste
<=>
n IS NULL
ISNULL(n)
Logiki operatori
MySQL podrava sve uobiajene logike operatore koji povezt~u delove izraza.
Logiki izrazi u MySQL-u mogu imati vrednost 1 (true), o (false) ili NULL. Osim toga,
MySQL tumai kao true (istinito, tano) svaku vrednost razliitu od nule i razliitu od
NULL.
Kada su vrednosti NULL u pitanju, neki elementi tabela istinitosti su malo drugaiji
od onog to biste oekivali. Tabela 8.2 prikazuje logike operatore.
Tabela 8.2
Logiki
operatori
Operator
Primer
Znaenje
n && m
Logiko
OR ili ll
NOT ili
XOR
n ll m
NOT n
n XOR m
(el,
e2,
e3)
Ako izraz el ima vrednost true, funkcija IF vraa rezultat e2; u suprotnom, rezultat
funkcije je e3. Na primer, ako ovu funkciju upotrebimo u bazi podataka employee,
moemo zadati sledei upit:
select name, if(job='Programmer', "nerd", "not a nerd")
from employee;
Ovaj upit daje sledee rezultate:
+---------------+--------------------------------------------+
l name
+---------------+--------------------------------------------+
l
l
l
l
Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith
nerd
nerd
not a nerd
not a nerd
+---------------+--------------------------------------------+
4 rows in set
(0.00 sec)
1'14
ugraenih
Ovaj upit ispituje vrednost kolone workdate (datum posla) u svakom redu tabele
assignment. Datumi iz prethodnog veka oznaavaju se sa "archived", datumi iz prethodne godine oznaavaju se sa "old", dok se svi ostali datumi oznaavaju kao
"current".
Poreenje
s regularnim izrazima.
MySQL-ove funkcije za rad sa znakovnim vrednostima dele se u dve kategorije: funkcije za obradu znakovnih vrednosti i funkcije za poreenje znakovnih vrednosti.
Verovatno ete ustanoviti da su funkcije iz druge grupe korisnije od onih iz prve.
Funkcija
Namena
trim (s)
U ovom odeljku objasniemo funkcije LIKE, RLIKE i STRCMP. Tekstualno pretraivanje je na raspolaganju samo u My ISAM tabelama. Vie informacija o tome nai ete
u poglavlju 9, "Tipovi tabela u MySQL-u".
Poreenje s dokerskim znacima pomou funkcije LIKE
+---------------+--------------------------+
l departmentiD l name
+---------------+----------------- ---------+
128 l Research and Development l
+---------------+------ --------------------+
l row in set
(0.04 sec)
Funkcija LIKE podrava dva naina poreenja s dokerskim znacima. Znak za procenat (%), upotrebljen kao u navedenom primeru, utvruje poklapanje s grupom znakova bilo koje duine (ukljuujui i nula). To znai da se izraz '%research%' poklapa
sa svakom znakovnom vrednou koja sadri re research. Imajte u vidu da se pri
poreenju znakovnih vrednosti obino ne pravi razlika izmeu malih i velikih slova,
kao to je objanjeno u prethodnom delu ovog poglavlja.
Stariji dokerski znak je podvlaka U, kojim se utvruje poklapanje s jednim znakom. Na primer, '_at' se poklapa sa znakovnim vrednostima cat , mat , bat itd.
Poreenje s regularnim izrazima pomou funkcije RUKE
116
Ako elite da ablon pronalazi samo re 'cat', onda ga morate izmeniti u '"'cat$'.
Znak karet ("') znai "fiksni poetak niza znakova"; drugim reima, niz znakova koji
traimo mora da poinje reju 'cat'. Znak za dolar($) znai "fiksni kraj niza znakova"; drugim reima, niz znakova koji traimo mora da se zavrava reju 'cat'.
Prema tome, ablon '"'cat$' prihvata samo re 'cat' i nita drugo.
U regularnim izrazima podrani su i dokerski znaci, isto kao u funkciji LIKE.
Meutim, dokerski znak je drugaiji. Postoji samo jedan - taka (.) - koji odreuje
poklapanje s jednim znakom, bilo kojim. Na primer, ' . at' utvruje poklapanje s
'cat', 'bat', 'mat' itd.
Dovoljan je samo jedan dokerski znak jer se u traenom nizu znakova moe zadati
i ponavljanje znakova (ukljuujui i dokerske znakove) odreen broj puta.
Kada iza nekog znaka postavite specijalni znak *, to znai da se prethodni znak
moe pojaviti nula ili vie puta. Na primer, ablon 'n*' prihvata ' ', 'n', 'nn', 'nnn'
itd. Znaci se mogu grupisati izmeu zagrada, tako da ablon ' (cat)*' prihvata ' ',
'cat', 'cat cat', 'catcatcat' itd. Mogua je i upoteba dokerskih znakova, pa
ablon ' . * ' prihvata neogranien broj znakova, to praktino znai svaki niz znakova.
Slino tome, znak plus(+) znai da se znak ili niz znakova ispred njega moe pojaviti jedanput ili vie puta, a upitnik (?) znai jednom ili nijednom. Moete zadati i
opseg vrednosti, tako da ablon ' (cat) (2, 4) ' prihvata 'catcat ', 'catcatcat ' i
'catcatcatcat'.
Osim pojedinanih znakova i nizova znakova, moete zadavati i skupove znakova,
koji se piu izmeu uglastih zagrada. Na primer, ablon ' [a-z] ' prihvata bilo koje
pojedinano slovo, dok ablon ' [a- z]*' prihvata nizove sastavljene od proizvoljno g
broja znakova.
I najzad, postoji vie klasa znakova, koje su zapravo unapred definisani skupovi
uslova. Na primer, [ [:al num: JJ prihvata svaki alfanumeriki znak.
Ako se bavite programiranjem na jeziku Perl, vredno je napomenuti da MySQL
podrava regularne izraze u formatu POSIX, koji se razlikuje od formata Perlovih
regularnih izraza.
A sada, pogledajmo primer upotrebe ablona s funkcijom RLIKE. Razmotrite sledei upit:
select * from department where name rlike 'an';
Ovaj upit pronalazi sve redove koji bilo gde u koloni department sadre niz znakova 'an':
+---------------+---------- ----------------+
l departmentiD l name
+------------ ---+-------------- ------- -----+
42
Finance
128 l Research and Development l
129 l Human Resources
l
+---------------+------- ------- --------- ---+
3 rows in set (0.00 sec)
Numerike funkcije
. Regularni izrazi mogu biti veoma moni, ali i veoma sloeni. Ako vam treba vie
pnmera i opirniji opis sintakse, na Webu ete nai mnogo dobrih tekstova na tu
temu.
Poreenje nizova znakova pomou funkcije STRCMP()
~a .funkciju s:RCMP (). ~ MySQL-u vae iste konvencije kao i u drugim programskim
JeZlCllUa, kao so su e lh P HP. Prototip funkcije izgleda ovako:
STRCMP(sl, s2)
a funkcija vraa sledee vrednosti:
-l
s2
+- ---------------------+
l strcmp ('cat', 'cat') 1
+- ---------------------+
o l
+- ---------------------+
l row in set (0.42 sec)
- -------------- -------+
l strcmp( 'cat', 'dog') 1
+- ---------------------+
-1
1- ---------------------+
l row in set (0.00 sec)
-- --------------------+
l
-- -------------------+
l
l l
l
- --------------------+
l
row in set
(0.00
sec)
Imajte u vidu da ~edosled s~rtiranja zavisi od lokalnog skupa znakova koji je aktivan . Ako Je aktivan Jez1k razlicit od engleskog, znakovne vrednosti e biti sortirane
kako biste i oekivali, pod uslovom da ste zadali odgovarajui skup znakova kada ste
11:tprav1h tabelu.
Numerike funkcije
l'.1bela .8.4
prikazuje
nekoliko korisnih numerikih funkciia.
U MySQL- OVOJ d O k ll _
..
" ,
~
rete opise mnogih drugih funkcijn iz ll' kategorije.
111\'lltnc~p nar1
118
Tabela 8.4
Numerike funkcije
Svrha
Funkcija
abs (n)
ceiling (n)
floor (n)
mod (n, m) i div
n podignuto na stepen m.
..
Vraa sluajno generisan broj u opsegu o~ O do l. Parametar n mJe
.
obavezan, ali kada ga zadate, njime se tructJalizuJe algontam za g~nensanJe
pseudosluajnih brojeva. ~Za istu vrednost n prosleenu funkciJI rand
generie se ista pseudoslucaJna vrednost.)
Vraa n zaokrueno na najbliu celobrojnu vrednost. Ako zadate
i parametar d, n vrednost se zaokruuje na d dectmalruh mesta.
power (n, m)
rand(n)
sqrt (n)
..
e zi sa ovim funkcijama
mod(9, 2)
Funkcija
ili
9 mod 2
ili ak
9 %2
+---------+
9 mod 2
+---------+
Namena
tekue
vreme, odnosno
tekui
dayname (datum)
+---------+
1 row in set (0.00 sec)
Pogledajmo primer upotrebe funkcije adddate (). Datumu 1. januar 1990. dodajemo godinu i est meseci:
+---------+
9 div 2
+-- - -- ----+
----
L-------~--~--l_o_w__l_n~n--__(o . oo ae:c~)--------------~------------------------------~---
120
Rezultat je sledei:
+--------------------------------------------------+
l adddate("l999-0l-01", INTERVAL "1-6" YEAR_MONTH) l
+------------------- ----------------------- --------+
l 2000-07-01
l
+------------------------------------------------- -+
1 row in set (0.41 sec)
U mnogim aplikacijama u kojima formatirate izlazne podatke namenjene drugom
programu, to moda nee biti najpogodniji oblik prosleivanja datuma. Unixov format timestamp nije razumljiv oveku, ali su vrednosti zadate u tom formatu potpuno
kompatibilne sa API funkcijama drugih programskih jezika.
Isti upit, ali s funkcijom unix_timestamp ()
Druge funkcije
U MySQL-u postoje i funkcije koje se mogu svrstati u grupu "ostalo". Na primer,
postoje funkcije za generisanje he vrednosti i ifrovanje, ali i mnoge druge veoma
korisne funkcije. U tabeli 8.6 navedene su najee koriene funkcije.
Tabela 8.6
Ostale funkcije
Funkcija
Namena
benchmark
(broj, izraz)
encrypt(s[,zrnce])
found_rows ()
+------------------------------------------------------------------+
l unix_timestamp(adddate("l999-01-0l", INTERVAL "1-6" YEAR_MONTH)) l
+------------------------------------------------------------------+
962373600 l
+------------------- -- ---------------------------------------------+
1 row in set (0.01 sec)
last_insert_id ()
md5 (s)
password(s)
cast(izraz AS tip)
convert(izraz, tip)
Funkcija cast () podrana je u ANSI standardu, a funkcija convert () podrana je
u ODBC standardu.
Parametar tip moe imati vrednost BINARY, CHAR, DATE, DATETIME, SIGNED
(INTEGER)
i UNSIGNED (INTEGER).
Izraunava
uvek
vraa
122
Ove funkcije se
obino
Odgovo1
sledeem
primeru:
4. Koju od sledeih funkcija poziva MySQL kada interno ifruje lozinke svojih
korisnika?
Tabela 8.7
Funkcija
avg (kolona)
count(kolona)
min (kolona)
max (kolona)
std (kolona)
sum (kol ona)
Namena
a) password()
Vraa
b) encrypt ()
e) rodS()
d) sha()
Vraa
Vraa
Vraa
Vraa
Vraa
MySQL prua izbor aritmetikih i logikih operatora, kao i operatora za pereenje vrednosti. Pri upotrebi operatora morate naroito obratiti panju na
mogunost pojave vrednosti NULL jer u tom sluaju rezultati nee uvek biti
kakve oekujete.
MySQL prua bogat izbor funkcija za rad s vrednostima znakovnog i numeri
kog tipa, za rad s datumima, za konverziju tipova podataka i druge funkcije .
Funkcije za rad s grupama podataka deluju na grupe vrednosti u kolonama
tabela. Te grupe se formiraju ako je zadata odredba GROUP BY, ali ako nije, funkcije deluju na sve vrednosti u koloni tabele.
Vebe
l. Napiite upit koji prikazuje imena zaposlenih i radnih mesta, ali ako je naziv rad
nog mesta 'Programmer', treba da se prikae 'Analyst 1 Programmer'.
2. Napiite upit koji u kolonu department dodaje novu slubu iji je naziv Property
Services. Zatim napiite upit koji dodaje novog zaposlenog, ije je ime Fred Smith
a radno mesto DBA i radi u toj slubi. Upotrebite funkciju last_insert_id (} da
biste dobili identifikator nove slube.
3. Napiite upit koji uitava najnoviji posao iz tabele assignment. Savet: upotrebite
grupnu funkciju max () .
Pitanja
l . Koji se od sledeih operatora ne mogu upotrebiti za ispitivanje da li je
vrednost jednaka NULL?
a) ISNULL ()
<=>
e) IS NULL
d)
2. Rezultat ovog pozivanja funkcije strcmp ( 'fred' , 'Fred') jeste
a) -1
b)
Saetak
b)
obrauje
e) 1
d) 2
odreena
Odgovori
Pitanja
l. d
2. b
3. b
4. a
5. e
124
Vebe
I~
l.
select name, replace(job,
from employee;
'Programmer',
'Analyst/Programmer')
2.
insert into department values
(NULL, 'Property Services');
insert into employee values
(NULL, 'Fred Smith', 'DBA', last_ins ert_id());
u MySOL-
3.
select max(workdate)
from assignment;
U sledeem poglavlju
Ovo poglavlje zavrava deo "Upotreba MySQL-a" . U narednom. delu knjige, "Tipovi
tabela i transakcije u MySQL-u", razmotriemo pojedine maine baze podataka koje
MySQL podrava i posebne mogunosti koje one pruaju.
9
Tipovi ta bela u MySQL-u
RAZMOTRIEMO
OVOM POGLAVLJU
TIPOVE TABELA koje su na raspolaganju
projektantu MySQL aplikacija. U dosadanjim primerima koristili smo uglavnom
InnoDB ili My ISAM tabele, ali postoje i druge.
Projektovanje sistema za upravljanje bazama podataka, slino projektovanju sistema
za druge namene, podrazumeva mnogo kompromisa. Na primer, poeljno je da se
mnogi poslovi u bazi podataka obavljaju kao transakcije, ali da bi se to obezbedilo,
treba vie vremena i troi se vie prostora na disku i vea koliina memorije. Deo posla
pronalaenja najboljih kompromisa autori MySQL-a su preneli na vas, projektanta
baze podataka, tako to su vam prepustili izbor tipa tabela koje ete koristiti. Moete
se opredeliti zajedan od tipova koji podravaju transakcije, ukoliko je to neophodno
u vaoj aplikaciji, ili moete izabrati tip tabela koji obezbeuje bolje performanse, ali
ne podrava transakcije. U oba sluaja morate biti svesni kompromisa koje morate
da napravite.
Moda ete uti da se tipovi tabela nazivaju maine za skladitenje (engl. storage
engine). To odraava injenicu da je za upotrebu nekih tipova tabela neophodna znaajna koliina posebnog programskog koda koji upravlja smetanjem podataka, indeksiranjem, zakljuavanjem podataka i pristupanjem disku. To takoe odraava sutinu
baze podataka: skladitenje podataka.
Izrazi transakcij"a ili podrka za transakcije pojavljivae se esto u ovom poglavlju. To
je vaan uslov o kojem treba da vodite rauna kada birate tip tabele. U primerima koje
smo dosad naveli u ovoj knjizi, SQL upiti su se izvravali potpuno izolovana do drugih
korisnika baze podataka, ali u mnogim aplikacijama to se u stvarnosti ne deava.
Zamislite da imate bazu podataka o prometu na bankovnim raunima. Ako elite
da prebacite 1.000 dinara s jednog rauna na drugi, potrebna su vam najmanje dva
SQL upita- jedan, koji na prvom raunu smanjuje stanje za 1.000 dinara i drugi, koji
poveava stanje na drugom raunu za 1.000 dinara. Bilo bi prava katastrofa kada bi se
128
IVIYIJMIVI
zbog neeg (na primer, prestanka napajanja) prvi upit izvrio do kraja, ali ne i drugi.
U takvim sluajevima bilo bi neuporedivo bolje da se izvre ili oba upita, ili nijedan,
jer baza podataka mora uvek biti u usklaenom stanju.
Tabele koje podravaju transakcije omoguavaju da za date da je odreena grupa
upita nedeljiva jedinica obrade -transakcija. Trebalo bi da se cela transakcija obavi do
kraja, a ako to nije mogue, baza podataka mora da je po11iti (engl. roll back), odnosno
da se vrati u stanje u kojem je bila pre poetka transakcije.
Transakcije i MySQL-ova sintaksa za njihovu upotrebu opisane su u poglavlju 10,
"Upotreba transakcija u InnoDB tabelama".
U MySQL-u se mogu koristiti sledei tipovi tabela:
MERGE
Sve navedene tipove tabela objasniemo pojedinano, ali najvie prostora posvetiupotrebljavanim tipovima: My ISAM i InnoDB. InnoDB i BerkeleyDB
podravaju transakcije. Drugi (ISAM, My ISAM, MERGE i HEAP) to ne ine.
U ovom poglavlju objasniemo i posebne mogunosti koje pruaju My ISAM tabele,
a to su komprimovane tabele i tekstualno pretraivanje. Celo poglavlje 1O posveeno je
posebnim mogunostima maine za skladitenje InnoDB.
emo najee
ISAM tabele
ISAM tabele su ukljuene u MySQL samo radi podrke starijim aplikacijama. Budui
daje njihova funkcionalnost u potpunosti odrana MyiSAM tabelama, neemo ih
detaljno razmatrati. Planirano je da budu uklonjene iz budue verzije MySQL-a 5.0.
Naredni kod pravi ISAM tabelu, ukoliko vam je iz nekog razloga potrebna:
create table asset
assetiD int not null,
description varchar(255}
type=ISAM;
ISAM tabele omoguavaju brz pristup podacima ali ne podravaju transakcije. Vei
deo onoga to emo rei o My ISAM tabelama vai i za ISAM tabele, pri emu za starije ISAM tabele postoji vie ogranienja.
poboljanja:
Prenosivost tabela. Tabele smeten e na disk ili na druge medije mogu se prene ti na
drugi raunar na kojem radi MySQL, bez obzira na platformu. To ne vai za
ISAM tabele.
Podrka za veoma velike tabele. Veliina ISAM tabela je ograniena na 4 GB.
MyiSAM omoguava da tabela bude velika onoliko koliko to dozvoljava operativni sistem. Budui da e to biti vano samo nekim korisnicima, moraete
paljivo da odaberete operativni sistem (i sistem za rad s datotekama). Mnogi
sistemi za rad s datotekama ograniavaju veliinu datoteka na najvie 2 GB.
(Imajte u vidu da to ogranienje moete zaobii ako upotrebite MERGE tabele.)
Efikasnije iskorienje prostora na disku. Manji su rascepkanost i praznine na disku.
Manja ograni{enja klju{eva. ISAM tabele podravaju najvie 16 kljueva po tabeli,
a podrazumevana maksimalna duina kljua je 256 bajtova. My ISAM tabele
podravaju 64 kljua po tabeli, a podrazumevana maksimalna duina kljua je
1024 bajta.
ISAM
MyiSAM
InnoDB
BerkeleyDB (BDB)
HEAP
sledea
ldU~I
ISAM tabele treba smatrati zastarelim. One i dalje postoje, ali ne bi trebalo da ih
koristite u novim aplikacijama koje razvijate. Ako upotrebljavate ISAM tabele, trebalo
bi da ozbiljno razmislite o njihovoj konverziji u My ISAM. Napor koji treba uloiti je
veoma mali, a prednosti su znaajne.
MyiSAM tabele
Mnogi ljudi godinama koriste MySQL ne znajui da moe da radi i s tabelama drugog
tipa. Razlog je to to se taj tip tabela podrazumeva u svim novijim verzijama MySQL-a.
My ISAM tabele omoguavaju veoma brz pristup podacima ali ne podravaju
transakcije. One obezbeuju visoke performanse u mnogim situacijama, ak i kada
projektant napravi odreene greke, a u rukanu strunog administratora mogu da
podre i veoma obimne i/ili veoma optereene baze podataka.
Naredni kod formira MyiSAM tabelu:
create table article (
articleiD int not null auto_increment primary key,
title varchar(255},
body text
};
sledei
red
type=MyiSAM;
dobiete
isti rezultat.
MyiSAM tabele mogu biti jedne od sledee tri vrste: dinamike, statike ili kompri
movane.Tabela automatski postaje dinamika ili statika u zavisnosti od definicija njenih
kolona. Komprimovane tabele moete praviti samo runo, pomou alatke myisampack.
IJU
ruyodYIJC ::J
IVIYI.li'IIVI liiUCIC
Tabele iji su redovi fiksne duine automatski se prave kao statike, dok se tabele s
redovima promenljive duine prave kao dinamike tabele. Po emu moemo utvrditi
da li tabela ima redove fiksne ili promenljive veliine?
Tip podataka char i svi numeriki tipovi su fiksne veliinc . Veli ina kolona tipa
varchar, text i b lob menja se u zavisnosti od sadraja. Tabela ije su sve kolone tipa
char ili numerikog tipa, bie statika, ali tabela koja sadri barem jednu kolonu tipa
varchar, text ili blob bie dinamika.
U odeljku "Tekstualno pretraivanje My ISAM tabela", napraviemo tabel u koju
emo nazvati article. To e biti dinamika tabela zato to sadri kolonu tipa varchar
i kolonu tipa text. Prostor na disku koji e biti potreban za skladitenje svakog reda
tabele zavisie od tekuih podataka u poljima tabele.
Statika tabela prua vie prednosti. Pretrauje se bre od dinamike ili komprimovane tabele. Baza podataka moe veoma lako uitati zapis pronaen na osnovu indeksa
kada se svaki zapis nalazi na odreenom pomaku od poetka datoteke. Tabela se veoma
lako smeta u ostavu (ke). Manja je verovatno a nepovratnog oteenja podataka u
sluaju ozbiljnog kvara sistema- alatka za popravku tabela obino uspeva da restaurira
sve redove osim oteenog.
Nedostatak statikih tabela jeste to to se pri umetaqju stvarnih podataka u kolone
fiksne veli ne gotovo uvek rasipa prostor na disku. Tu cenu mogli biste da platite ukoliko se veliina vaih podataka ne razlikuje previe. Na primer, to vai za imena i prezimena ljudi. Meutim, cena e vam moda biti previsoka ako se podaci veoma
mnogo razlikuju po veliini. Ako smatrate da e prezimena zaposlenih imati uvek
maqje od 80 znakova, moda neete eleti da nepotrebno rasipate po 75 znakova svaki
put kada se neko preziva Peri ili Jovi.
Za dinamike tabele potrebno je sloenije upravljanje unutar samog MySQL-a.
Posao keiranja, uitavanja ili popravljaqja zapisa nije tako jednostavan za mainu za
skladitenje. Razlog je delimino to to je veliina tabele promenljiva, ali i to to tabela
postaje rascepkana (fragmentirana).Ako je zbog promene sadraja red postao vei, deo
podataka e ostati na izvornom mestu, a deo e biti smeten u novi blok unutar datoteke.To znai da se ne moe garantovati da segment datoteke koji je operativni sistem
u itao u ke sadri sve delove reda. Osim toga, oteenje tabele moe biti tee popravljivo jer ako se izgube blokovi podataka ili veze izmeu njih, ne moe se lako utvrditi
koji delovi kojim redovima pripadaju.
Da biste popravili ili defragmentirali My ISAM tabelu, moete s komandne linije
upotrebiti alatku myisamchk ili MySQL-ovu komandu REPAIR TABLE. (To je opirnije objanjeno u poglavlju 13",Administriranje baze podataka") . Za defragmentiranje
baze podataka, ali bez popravljanja, moete upotrebiti MySQL-ovu komandu OPTIMIZE TABLE. (To je opirnije opisano u poglavlju 18",0ptimizovanje baze podataka".)
KomprimovanjeMyiSAM tabela
Iako tabele nastaju kao statike ili dinamike bez vaeg izriitog zahteva (ali kao rezultat
odluka koje ste doneli pri projektovanju), tabele se ne komprimuju automatski. Da biste
komprimovali tabelu, morate upotrebiti alatku myisampack s komandne linije. (Postoji
pack_isam, njena verzija iskljuivo za ISAM tabele, ukoliko ih koristite.)
Mada se komprimovanje na prvi pogled ini korisno, trebalo bi da ga primenjujetc
samo za neke aplikacije jer se komprimovane tabele mogu samo itati. Ako treba da
izmenite strukturu komprimovane tabele, ili da aurirate podatke u njoj, ili da joj
dodate nove, morate da dekomprimujete celu tabelu, unesete odgovarajue izmenc
i zatim ponovo komprimujete tabelu.
Postupak komprimovanja koji obavlja alatka myisampack ini kombinacija pravog
komprimovanja (Hafinanovim kodom) i vie optimizacija iji je cilj saimanje kolona,
na primer, konverzijom postojeih tipova podataka u manje, i konverzijom sadraja
kolona u nabrajanja . Budui da se svaki zapis komprimuje zasebno, dekomprimovanje
pojedinanog zapisa je relativno jednostavno. Na sporijim ureajima za skladiteqje
podataka trajanje operacije dekomprimovanja moe ak biti i zanemarljivo u pareenju s trajanjem uitavanja podataka s diska.
l ..lL
u~tdVIJI;;:
,,._,uv1
LdUCid u
tvty..JuL.-u
MyiSAM tabele
U engleskom jeziku, rei kao to su 'the', 'and', 'then' i 'soon' neophodne su, ali
najee nisu korisni pojmovi za traenje. U MySQL-u postoje standardne liste takvih
rei (za engleski j ezik) , a moete i sami sastaviti takve liste za tekstove na drugim
rei.
nmogi tekstovi u zaglavlju sadrati re 'Acme'. Pretraga po toj rei e verovatno generisati mnogobrojne rezultate, koji ipak nee biti upotrebljivi. Ako 50% ili vie zapisa
sadri odreenu re, smatra se da ta re nema vrednosti za izraunavanje koeficijenta
povezanosti.
uitava.
Pri pretraivanju moete imati vei stepen kontrole ako upotrebite modifikator
BOOLEAN MODE.
Naredni upit e ui tati samo zapise koji sadre re 'linux' i izraz "Open source",
ali ne i re 'desktop'. Rei 'Java' i 'Oracle' nisu obavezne, ali kada se odreuje
koeficijent povezanosti, re 'Java' poveava rang zapisa, a re 'oracle' smanjuje
rang zapisa. Redosled traenih rei u nizu znakova ili u zapisu nije bitan.
nele ct title
from article
where match (title,body)
against ('+linux +"Open Source" -desktop Java -Oracle'
IN BOOLEAN MODE) ;
Operatori za
()pcrator
Znaenje
odreene rei
IN
odreene rei
ll
ll
logiko
pretraivaqje
Ova re je obavezna.
Ova re ne treba da se pojavi u rezultatima.
Ova re je manje vana.
Ova re je vanija.
Grupie rei u podizraz.
Ova re se moe pojaviti u rezultatima ali smanjuje rang zapisa.
Dokerski sufiks. Na primer, merge nee pronai i merger, ali merge* e
pronai i merge i merger. Moe se upotrebiti samo na kraju rei za prctragu.
vo je izraz. Pronalazi samo identian sadraj, u istom redosledu .
--------------------
134
Za logiko pretraivanje nije neophodno da postoje indeksi za tekstualno pretraivanje. Tako se mogu pretraivati i neindeksirane tabele, ali je postupak veo~a spo~.
Jo jedna mala razlika izmeu tekstualnog pretraivanja i logikog p~etr_a_lvanJa jeste
to to se pri logikom pretraivanju zanemaruju rei koje se esto poJaVlJUJU _me~u
podacima. U tom sluaju ne vai pravilo 50%. Ako pretraujemo tekstove obJaVlJene
u biltenu kompanije Acme PTY Ltd., naredni upit bi verovatno uitao gotovo sve
redove, dok bi rezultat upita iza njega bio prazan skup.
select title from article
where match (title,body) against ('Acme' IN BOOLEAN MODE);
select title from article
where match (title,body) against ('Acme');
lnnoDB tabele
Sada emo razmotriti InnoDB tabele. InnoDB je maina za skladitenje koja je brza i
podrava transakcije. Njene mogunosti transakcione obrade su toliko vane da emo
njihovoj primeni posvetiti celo naredno poglavlje.
InnoDB table omoguavaju
Iako je razvijen odvojeno od veeg dela MySQL-a, InnoDB se moe koristiti pod
jednakim uslovima dve vrste licence.
Mnoge opsene i veoma poseene Web lokacije koje koriste MySQL, kao to su
Slashdot (www. slashdot. org), Google (www. google. com) i Yahoo! Finance (http: l l
finance. yahoo. com), koriste mainu InnoDB. Naroito je pogodna za obradu velikih
koliina podataka, velikom brzinom i u okruenju koje podrava transakcije.
InnoDB je jedan od najbrih sistema na svetu koji podrava transakcije, ali po cenu
izvesnih rtava. Pri veini upotreba, My ISAM e biti bri, ali razlika najee nee biti
tako znaajna.
InnoDB proizvodi kompanija InnoBase Oy, koja ima vlastitu Web lokaciju. Najnovije informacije o InnoDB-u nai ete na www. innodb. com.
IVICn\JC taUt'll"
osobine: ima istu strukturu kao tri tabele koje emo grupisati, njen tip je MERGE,
a sadraj je unija (UNION) tekueg sadraja sve tri tabele. Osim toga, zadali smo last
(poslednja) kao vrednost opcije INSERT_METHOD. To znai da e nov red koji unesemo
u ovu MERGE tabel u biti fiziki smeten u poslednju tabelu u grupi, u ovom sluaju,
log2003Mar. Ostale mogunosti su FIRST (podaci se umeu u prvu tabelu u grupi) ili
NO (umetanje novog reda nije dozvoljeno u MERGE tabelu).
Tako smo formirali tabelu s kojom moemo da radimo na uobiajeni nain i koja
prividno sadri sve podatke iz svih tabela u grupi. Ako izvrimo upit
MERGE tabele
Listing 9.1
dobiemo sledee
rezultate:
2003-01-01 00:00:00
2003-02-01 00:00:00
2003-03-01 00:00:00
l
l
l
l
l
l
+-------+---------------------+-----------------+
3 rows in set (0.01 sec)
Kao to vidite, prikazani su podaci iz sve tri tabele. Zaista je vano da zapamtite da,
iako smo zadali da je kolona log id primarni klju MERGE tabele, mehanizam radi
malo drugaije od naina na koji obino rade primarni kljuevi. Njihove vrednosti
obino moraju biti jedinstvene, ali poto MERGE tabela upravlja istovremeno s tri
skupa primarnih kljueva, nipoto nije iskljueno da postoji vie od jednog reda koji
sadre istu vrednost primarnog kljua, kao to je prikazano u rezultatima navedenog
upita.
ak i kad su tabele koje ine njene komponente grupisane u MERGE tabel u, nad
njima i dalje moemo izvravati upite na uobiajeni nain. Meutim, komande DROP,
ALTER, DELETE FROM TABLE, REPAIR, TRUNCATE, OPTIMIZE i ANALYZE ne mogu se vie
izvriti ni nad jednom tabelom u grupi. Neke od tih komandi (DELETE FROM TABLE)
ipak moete izvriti ukoliko MERGE tabela trenutno nije otvorena. Moete je zatvoriti
pomou komande FLUSH TABLES. U MySQL-ovoj dokumentaciji stoji da nakon
komande FLUSH moete izvriti i bilo koju od navedenih komandi, ali mi smo ustanovili
da to nije uvek sasvim tano. Na primer, u vreme pisanja ove knjige, ako se pomou
komande DROP izbrie jedna od tabela u grupi, automatski se brie i sama MERGE
tabela. Ako je potrebno da neku od navedenih komandi izvrite nad jednom od tabela
u grupi, najbolje je da prethodno izbriete MERGE tabel u i da je zatim ponovo napravite. Brisanje MERGE tabele ni na koji nain ne utie na njene komponente niti na
podatke u njima.
Tabele koje ine MERGE tabelu moete komprimovati pomou alatke myisampack. To je naroito korisno u sluajevima kao to je na primer u kojem skladitima
datoteke dnevnika promena -jer se datoteke iz ranijih meseci mogu ko mp rimovati
budui da se novi podaci upisuju samo u poslednju datoteku.
'
138
.Jdl.l:ldl\
MyiSAM
HEAP tabele
HEAP tabele su izuzetno brze i cele se uvaju u memoriji. Brzina se postie zahvalju-
":eliina ~yiSAM
tabela je
ograniena
kljua
lnnoDB
HEAP.
praktino pravilo ograniavanja maksimalnog broja redova u tabeli. Ako vaa HEAP
tabela previe naraste, lako se moe dogoditi da vam ponestane memorije. Maksimalan
broj redova u HEAP tabeli moe se zadati u konfiguracionoj opciji
max_heap_table_size.
Saetak
MySQL podrava est tipova tabela: ISAM, My ISAM, InnoDB, BDB, MERGE
i HEAP.
Samo tabele tipa InnoDB i BDB podravaju transakcije.
Samo MyiSAM tabele podravaju tekstualno pretraivanje i indeksiranje.
BDB
Kao i InnoDB tabele, BDB tabele podravaju transakcije. BDB tabele
koriste u MySQL-u od InnoDB tabela .
BDB podrava zakljuavanje podataka na nivou stranice.
ree
se
MERGE
MERGE tabele omoguavaju da se vie My ISAM tabela tretira kao jedna
logika tabela, zahvaljujui emu se zaobilazi problem najvee dozvoljene
veliine MyiSAM tabela .
HEAP
~o~aci ~meteni
JanJa racunara .
HEAP tabele su superbrze, pod uslovom da imate dovoljno
koju ete ih smestiti.
ISAM
(znakova).
veliina
sluaju
mora
ograniiti
prestanka napa-
fizike
AUTO_INCREMENT, TEXT
memorije u
BLOB.
140
~1euecem
poglaVlJU
Vebe
Pitanja
1. Potrebne su nam transakcije i tabele koje se lako mogu preneti na drugi operativni sistem. Za tu namenu pogodne su tabele tipa
a) ISAM
b) MyiSAM
Odgovori
e) InnoDB
d) BDB
2. Potrebna nam je privremena tabela za brzo pretraivanje. Trebalo bi da upotrebimo tabelu tipa
a) ISAM
b) MyiSAM
e) MERGE
d) HEAP
3. Potrebne su nam izuzetno velike tabele. Za tu namenu nisu pogodne tabele tipa
a) ISAM
e) InnoDB
d) nijedan od prethodnih
4. Potrebno nam je tekstualno pretraivanje. Za tu namenu pogodne su tabele tipa
a) MyiSAM
b) InnoDB
e) BDB
d) HEAP
S. Pogledajte sledei upit za tekstualno pretraiva~e:
select title
from article
where match (title,body)
against ('+php +pdf pdflib >tutorial -reference'
IN BOOLEAN MODE);
sledeih
Pitanja
1. e
2. d
3. a
4. a
5. b
U sledeem poglavlju
U sled eem poglavlju, "Upotreba transakcija u Inn oD B tabelama", razmatraemo ta
ta no znai pojam transakcija, zbog ega su transakcije tako vane i kako se one primenJUJU u InnoDB tabelama.
b) MERGE
Koja od
Za ovo poglavlje nema formalnih vebi, ali bi bilo korisno da vebate pravljer~je
upotrebu tabela pojedinih tipova.
tana?
bie
povean.
10
Upotreba transakcija
u lnnoDB tabelama
BAVIEMO
praktinim pri-
OVOM POGLAVLJU
SE transakcijama u MySQL-u. U
merima koristiemo tip tabela InnoDB, ali gotovo sve to bude reeno
nako i za BerkeleyDB tabele.
Razmotriemo sledee teme:
vaie
podjed-
ta je transakcija
Upotreba transakcija u MySQL-u
InnoDB-ov model transakcije i
usklaenost
s ACID pravilima
ta je transakcija?
U ovom poglavlju, prvo moramo razjasniti ta je transakcija. U kontekstu sistema za
upravljanje bazama podataka, transakcija je niz povezanih komandi koje se moraju
obraivati kao nedeljiva celina. Drugim reima, sve to treba da bude uraeno u transakciji mora se uraditi u celini, ili ne sme nita uraditi. Ovaj koncept je poznat kao
nedeljivost (engl. atomicity). Kae se da je transakcija atom obrade jer se ne moe razbiti
na manje delove - obrauje se u celini ili se uopte ne obrauje.
Ovaj koncept ima vane posledice kada se razmatra pristup podacima u okruenju s
vie korisnika, procesa i niti izvravanja (engl. threads) istovremeno, a vaan je i za obnavljanje podataka nakon kvara. Savremenim raunarima esto pristupa vie korisnika
istovremeno. Na njihovim raunarima obino je aktivno vie programa u isto vreme,
a esto koriste i programe kao to je softver za Web server koji formiraju vie istovremenih procesa ili niti izvravanja. Svakom od tih korisnika, programa, procesa ili niti
izvravanja moe biti neophodan pristup serveru baze podataka.
Vie niti izvravanja ne smeju uticati jedna na drugu kada rade istovremeno. Ako
doe do greke, pri obnavljanju podataka baza podataka mora zavriti otvorene transakcije. To znai da se baza podataka mora vratiti u stanje u kojem je bila pre poetka
transakcije, ili mora da izvri celu transakciju do kraja. Uglavnom je bolje izgubiti celu
transakciju koja se sastoji od meusobno povezanih izmena nego doi u stanje delimino unetih izmena iji rezultat moe biti neusklaenost sadraja baze podataka.
Ovaj koncept se moe izraziti formalno, ali je verovatno najbolje da na primeru
shvatite o emu se tano radi. Recimo da imate vrlo jednostavnu (ali potencijalno
veoma vanu) bazu podataka u kojoj se uvaju podaci o prometu na bankovnim rau
nima. Za svaki raun postoje barem podaci o identifikatoru rauna i tekuem stanju.
Tabelu bankovnih rauna, accounts, moemo napraviti sa sledeom strukturom:
crea te table account
number int not null auto increment primary key,
balance float
type = InnoDB;
Verovatno vas nee iznenaditi nain na koji emo otvoriti tri nova rauna pomou
s l edei h upita:
insert into account (balance) values (O. O);
insert into account (balance) values (1000.0);
insert into account (balance) values (2000.0);
Poto dosad nita nije moglo da krene ba naopako, trebalo bi da rezultati budu sledei podaci:
+--------+---------+
l number l balance l
+ ------- +---------+
o l
l l
l
1000 l
2 l
l
2000 l
3 l
l
+--------+---------+
# najpre
select
ll upit
ll sada
\lpdate
Ova dva upita su meusobno povezana i moraju se izvriti zajedno. Ako klijentski
programi s drugih raunara mogu da izmene stanje na ovom raunu izmeu nae provere stanja i naeg aurira~a stanja, moe se dogoditi da ne dobijemo rezultate koje
SiliO oekivali.
select
# upit
# sada
update
Jasno je da bi to bilo neprihvatljivo, ali se u ovom suaju problem moe lako reiti.
Ako izmene zadamo kao relativne a ne kao apsolutne, postae nedeljive jedinice i reili
smo problem. Naredni upit e davati ispravne rezultate, bez obzira na to da li se u isto
vreme izvravaju i drugi upiti:
update account set balance = balance
ruyldVIjt:
lU
UJJUllt:Ud
lldll~dr\\:ljd
U IIIIIUUD l.dU'Cidllld
UjJUllt:Ui:l
U mnogim sluajevima nee biti mogue zdruivanje svih povezanih upita u jedan
kao u navedenom primeru.Jedino reenje u takvim sluajevima, ukoliko elite razumljiv kod, jeste da koristite MySQL-ovu sintaksu za transakcije. Ako grupu komandi
oznaite kao transakciju, time obavetava te bazu podataka da je to povezan i nedeljiv
skup, koji se mora obraditi kao nedeljiva jedinica; moraju se izvriti ili sve komande u
skupu ili nijedna od njih. Pomenuta dva upita moete izvriti kao jednu transakciju
pomou sledeih SQL komandi:
s tart transaction;
update account set balance
update account set balance
commit;
balance
balance
1000
+ 1000
where number
where number
'
l
'
Vana osobina transakcija jeste da nisu vidljive u drugim sesijama dok ne budu
zavrene i potvrene (tj. izmene unete u bazu podataka). Nijedna druga nit izvravanja
(proces) ne moe da ita neusklaene podatke iz tabele ili tabela dok se ne zavri
postupak auriranja koji ste zapoeli.
Druga prednost transakcija jeste to da se delimino izvrene transakcije mogu
ponititi. Ako transakciju ponitimo pre nego to je potvrdimo (engl. commit), sve
izmene koje su nainili upiti koji ine transakciju bie ponitene.
U naem primeru prenoenja novca na drugi raun, ako dodamo komandu SELECT
da bismo proverili da ne skidamo vie novca sa izvornog rauna nego to ga ima na
njemu, moemo upotrebiti rezervisanu re ROLLBACK ukoliko elimo da ponitimo
r clu transakciju. Sintaksa upita izgledala bi ovako:
aLart transaction;
update account set balance = balance - 1000 where number
\lpda t e account set balance = balance + 1000 where number
s lec t balance from account where number = 2;
ll select kae da je stanje na raunu broj 2 negativno!
ll bolj e da ponitimo promenu
ro llba ck;
lli:lll~i:ll\\:ljCI
IVIY;)UL- U
2
'
l
'
2;
balance
+ 1000
where number
'
Ukoliko upiete
s tart transaction;
nita se nee dogoditi dok ne upiete i
commit;
Automatsko potvrivanje transakcija moete iskljuiti pomou komande
SET
na
sledei nain:
set autocommit=O;
2;
l;
Kao to biste i sami zakljuili, sledea komanda vraa MySQL u reim autocommit:
set autocommit=l;
Poto je promenljiva autocommi t lokalna za sesiju, izmena reima rada vai samo za
upite koje pokree tekua sesija, dok je ta sesija aktivna.
Ako iskljuite automatsko potvrivanje transakcija, nije potrebno izriito zadati
komandu START TRANSACTION da biste zapoeli transakciju. Nipoto ne zaboravite da
povremeno izdate komandu COMMIT da biste izmene koje ste nainili trajno preneli u
bazu podataka.
Bez obzira na to da li je reim autocommit ukljuen ili iskljuen, u odreenim sluajevima se izmene koje nainite automatski potvruju (i prenose u bazu).Ako koristite
tip tabela koji ne podrava transakcije, kao to je My ISAM, sve izmene koje nainite
odmah se prosleuju u bazu, bez obzira na vrednost promenljive autocommit. Slobodno moete grupisati komande izmeu komandi START TRANSACTION i COMMIT, ali to
nee imati nikakvog uticaja ako tabela ne podrava transakcije. Moete ak upotrebiti
i komandu ROLLBACK. Time neete izazvati greku, ali u tabeli koja ne podrava transakcije, ta komanda prosto nee imati nikakvog efekta ni na ta to ste izmenili.To moe
biti korisno kada testirate kod ili kada iz datoteke slike stanja uitava te podatke na server
koji radi s drugim tipom tabela.
ruyldVIJt: lU
UfJUllt:Ud
lldll~d"~IJ<l
U IIIIIUUD ldUt:ldllld
H<~n~iKtiOnl
podataka
2;
Komanda LOCK TABLES pokuava da zakljua sve tabele koje navedete da bi tekua
nit izvrenja mogla da radi s njima bez ometanja. Komanda UNLOCK TABLES oslobaa sve
blokade koje je tekua nit postavila. Postupak deblokade tabela vrlo je jednostavan.
Ukoliko ste zakljuali tabel u, imajte u vidu da je morate to pre osloboditi da biste to
manje ometali druge niti. Zakljuavanje tabela je sloenije pitanje.
Sve tabele koje vam trebaju morate zakljuati istom komandom. U prethodnom
prim eru zahteva se zakljuavanje samo jedne tabele, ali ako nameravate da pristupate
grupi tabela istovremeno, ili ak razliitim alijasima iste tabele, morate ih sve navesti u
istoj komandi, na primer:
lock tables account write, account as a read, othertable low_priority
write;
Poto komanda LOCK TABLES oslobaa sve blokade koje ste pre nje postavili, ako
pokuate da grupiete blokade koje su vam potrebne za vie komandi, sve prethodne
blokade bie ukinute a blokada e vaiti samo za poslednju komandu u grupi.
Postoje dve vrste blokada: za itanje i za pisanje. Ako vam je potreban pristup tabeli
radi upisivanja podataka i ne moete dozvoliti da druge niti pristupaju tabeli u isto
vreme kad i vi, blokada za pisanje e spreiti da bilo koja druga nit ita tabelu ili pie
u nju dok vi ne oslobodite tabelu. Ukoliko nameravate samo da itate tabelu, nema
nik:lkvc tete ako dozvolite da i druge niti itaju tabelu u isto vreme. Blokada za itanje
sprcbva druge niti da piu u tabel u samo dok je vaa nit blokira.
nlokada za pisanje moe se zadati sa opcijom low_priority (nizak prioritet). U svakon! sistemu koji omoguava blokiranje tabela, ukljuujui i MySQL, neophodna su
pr.1v1Ll koja odreuju ko e u sluaju sukobljenih zahteva moi prvi da postavi blokadu.
MySQL obino daje vei prioritet zahtevima za blokade radi pisanja da bi omoguio da
mncnc uskladitenih podataka budu obavljene to pre. Ako vam takvo ponaanje ne
odgov:mt, moete zahtevati blokadu za pisanje niskog prioriteta kao to smo uradili
"' tabel u othertable u prethodnom primeru. Meutim, postoji zakoljica. Kad god
:t.illtcvatc blokadu tabele, moe se dogoditi da morate saekati da ona bude odobrena.
moae1
1nn on
Blokada niskog prioriteta bie odobrena samo ako nema nijedne druge niti koja je
zahtevala blokadu za itanje ili pisanje u toj tabeli. Meutim, ako je server veoma optereen, takva situacija se moda nikad nee dogoditi.
Verovatno neete esto runo upravljati blokadama na ovakav nain, ali postoje
izvesni razlozi zbog kojih biste to ipak uinili. Ako imate aplikaciju koja treba da obezbedi veoma visoke performanse a transakciona obrada joj je potrebna samo u redim sluajevima, moe biti isplativije da koristite brze tabele koje ne podravaju transakcije i da
runo postavljate blokade da biste reili problem nemogunosti transakcione obrade.
Jo jedan est sluaj u kojem ete izdavati komande LOCK TABLES jeste kada
direktno manipuliete MySQL-ovim datotekama s podacima. Na primer, ako elite da
obezbedite da sadraj datoteka na disku ostane usklaen i nepromenjen dok pravite
njihove rezervne kopije, morate zakljuati te datoteke.
Najvanije to treba da zapamtite u vezi sa zakljuavanjem podataka jeste da morate
to pre ukinuti sve blokade koje ste postavili inae e drugi sistemi i korisnici morati
da vas ekaju. Imajte u vidu da neki poslovi za ije obavljanje ete postavljati blokade,
kao to su indeksiranje ili izrada rezervne kopije velike datoteke, mogu potrajati prilino dugo.
sa ACID pravilima
Vaan pojam iz terminologije baza podataka koji jo nismo definisali jeste ACID. To je
akronim od engleskih rei Atomicity, Consistency, Isolation i Durability (nedeljivost,
usklaenost, izolovanost i trajnost). Mnogima smeta injenica da pri korienju
MyiSAM tabela",MySQL pada na ACID ispitu". Kada se koriste InnoDB tabele,
MySQL je usklaen sa ACID pravilima.
Atomicity (nedeljivost) znai da je svaka transakcija nedeljiva celina. U bazu podataka moraju se uneti sve izmene koje transakcija zahteva, ili nijedna od njih. U sluaju
spoljne greke, jasno je da bi bilo savreno kada bi postupak obnavljanja baze podataka
bio u stanju da dovri sve transakcije koje su bile zapoete u trenutku greke; meu
tim, prihvatljivo je i da te transakcije budu ponitene.
Izolovanost transakcija
Kao i u mnogim drugim sluajevima, morate napraviti kompromis izmeu robusnesti i performansi.
Podrazumevani nivo za InnoDB je repeatable read. Pri tom nivou izolovanosti svaka
transakcija radi sa zasebnom verzijom tabele u kojoj svaki red ima isti sadraj k;o na
poetku transakcije. Garantuje se da je itanje reda ponovljivo, tj. da se iz istog reda
svaki put uitavaju isti podaci. Ako na poetku transakcije pozovete
sel ect
a zatim isti upit ponovo izvrite kasnije u transakciji, oba puta dobiete isti rezultat.
Meutim, moete dobiti i ono to se zove jm1tomski podaci (engl. phantom reads). Moe
se dogoditi da druga transakcija koja se zavri pre vae doda nove redove u tabelu.Ako
dvaput izvrite isti upit koji sadri odreeni uslov, kao sledei
sele ct
moe se dogoditi da pri drugom itanju dobijete nove redove - fantomske redove kojih nije bilo prvi put.
Trebalo bi da u praksi vrlo retko naiete na fantomske podatke u MySQL-u.
lnnoDB reava problem pomou algoritma nazvanog blokiranje sledeeg kljua (engl.
11ext key lock ing) , pod uslovom da je kolona za koju ste zadali uslov u upitu indeksirana.
Verovatno ve znate da InnoDB primenjuje zakljuavanje podataka na nivou redova .
~ad~ se transakcija odnosi na odreeni red tabele, taj red se zakljuava da bi transakcija
bila Izolovana od drugih. Osim zakljuavanja redova na koje se transakcija odnosi,
,tlgoritam blokiranja sledeeg kljua blokira i razmake izmeu redova koje nae u
tndeksu. Poto se problem fantomskih podataka reava na taj nain, nivo izolovanosti
wrializ able moraete da koristite samo u malom broju sistema .
_Kada na serveru podesite nivo izolovanosti read committed, transakcije zapravo vie
nece b1t1 ~asv1m 1z~~ovane. Ako izvrite neki upit, a zatim ga kasnije u transakciji ponoVIte, dob1cete razhc1te rezultate ukoliko je druga transakcija u meuvremenu izmenila
podatke i prenela izmene u bazu. Ako vam ba to odgovara, komanda je sledea
Hl'L transaction isolation level read committed;
Pri korienju najnieg nivoa izolovanosti, read uncommitted,javljaju se dva pitanjada li su transakcije izolovane i usklaene, pa prema tome, ne kre ACID pravila, i da li
se uopte moe priati o transakcijama. U ovom reimu rada, transakcije mogu da
itaju izmene koje su druge transakcije nainile a da te izmene jo nisu potvrene
(prenete u bazu podataka). To se zove itanje prljavih podataka (engl. dirty reads) i moe
sc prihvatiti samo u zaista posebnim okolnostima, npr. kada znate da e sve aktivne niti
samo itati ili samo upisivati podatke, ali ne i jedno i drugo. Da biste podesili nivo read
uncommitted, upotrebite sledeu komandu:
2. Nedeljivost transakcije
Neponovljivi podaci
Fantomski podaci
Read Uncommitted
Read Committed
Repeatable Read
Mogui
Mogui
Mogui
Nisu
Nisu
mogui
Mogui
Mogui
mogui
Nisu
Serializable
Nisu
mogui
Nsu
Mogui
mogui
(ali malo
verovatni)
Nisu mogui
mogui
Saetak
Transakcija je grupa SQL upita koja se obrauje kao nedeljiva celina. Izvrava se
u potpunosti ili se ponitava u potpunosti.
Standardna SQL-ova sintaksa za
definisa~e
uitate
fantomske podatke
d) nijedno od prethodnog
Vebe
start transaction;
# do work
commit;
naina
Pitanja
l. Ako je reim autocommit
znai sledee:
iskljuen,
transakcija
e) i a) i b)
d) ni u jednom od navedenih
sluajeva
biti
potvrena
Na serveru koji nije previe vaan za poslovanje firme, sruite MySQL dok ste
usred neke transakcije. Nije neophodno da gurnete kuite vrstih diskova s velike
visine, niti da iupate kabi za napajanje iz utinice. Dovoljno je da prekinete rad
MySQL-ovog procesa. Pregledajte sadraj dnevnika izmena i posmatrajte ta se dogaa
kada ponovo pokrenete server.
154
Odgovori
Pitanja
l. e
2. a
Administriranje MySQL-a
3. e
4. d
5. e
U sledeem poglavlju
U poglavlju ll razmotriemo MySQL-ov sloen sistem upravljanja pravima korisnika .
Na raspolaganju je bogat izbor mogunosti za mo koju ete dati korisnicima baze
podataka. U tom poglavlju savladaete postojee opcije i naine na koje se njima
upravlja.
11
12
Podeavanje MySQL-a
11
Upravljanje pravima korisnika
pomou
Tabele prava
pomou
komandi
'laura127.0.0.1'
(Using pass-
Dodeljivanje prava
Najpre emo razmotriti komandu GRANT, koja omoguava da pravite nove korisnike
naloge i da dodeljujete korisnicima prava za pristup bazama podataka, tabelama i funkcija mn. Pogledajte sledei primer:
gran l
liU
(e
158
Nivoi prava
Ova komanda fomura nalog za korisnika ije je ime l uke kada on pokua da se prijavi na MySQL server s raunara localhost. Tom nalogu dodeljuje lozinku (re
lozinka, koju je vrlo teko pogoditi - razume se, vi ete zadati neto bolje!). Re
usage opisuje pravo koje dodeljujemo korisniku luke. Pravo usage znai da korisnik
moe samo da se prijavi na server i nita vie. U odredbi ON zadajemo objekte na koje
se odnose prava koja dodeljujemo korisniku. Budui da korisniku dodeljujemo samo
pravo da se prijavi na server, ta odredba je u ovom sluaju izlina.
Opti oblik komande GRANT je, kako stoji u MySQL-ovoj dokumentaciji, sledei:
GRANT vrsta_prava [(lista_kolona)]
[, vrsta_prava [(lista_kolona)]
... ]
ON {ime_tabele l * l *.* l ime_baze.*}
TO ime_korisnika [IDENTIFIED BY [PASSWORD] 'lozinka']
[, ime_korisnika [IDENTIFIED BY 'lozinka'] . .. ]
[REQUIRE
NONE l
[{SSLI X509}]
[CIPHER nain_ifrovanja [AND]]
[ISSUER davalac_sertifikata [AND]]
[SUBJECT subjekt]]
[WITH [GRANT OPTION l MAX_QUERIES_PER_HOUR # l
MAX_UPDATES_PER_HOUR # l
MAX CONNECTIONS_PER_HOUR #]]
U odredbi GRANT treba da navedete prava koja dodeljujete. Koja sve prava postoje,
saznaete u narednom odeljku . Neka prava su globalna (odnosno, vae za sve baze
podataka na serveru), dok druga vae samo za odreene objekte (baze podataka, tabele
ili pojedine kolone tabela).
U odredbi ON treba da navedete objekte na koje se odnose prava koja dodeljujete.
To moe biti ime tabele ili ime baze podataka, ili ime baze podataka sa svim njenim
tabelama (oblik ime_baze. *). Umesto imena objekta, moete zadati i *. *, to oznaava sve baze podataka i sve tabele u njima. Ako zadate samo *, prava koja dodeljujete
vae samo za tekuu otvorenu bazu podataka. Ako nije otvorena nijedna baza podataka, prava se dodeljuju kao da ste zadali *. * u odredbi ON.
U odredbi TO treba da navedete korisnika kome dodeljujete prava. Ako taj korisnik
ve ima nalog, dodaju mu se nova prava. Ukoliko nalog ne postoji, MySQL e ga
napraviti. U ovoj odredbi moete zadati vie od jednog korisnika te imena raunara s
kojih se mogu prijavljivati, na primer, fredlocalhost. Ako imate tekoa pri prijavUivanju kao korisnik za kojeg je upravo napravljen nalog, u komandi GRANT navedite
i ime raunara s kojeg se prijavljujete. Ime MySQL-ovog korisnikog naloga ne mora
biti jednako imenu pod kojim se korisnik prijavljuje u operativni sistem. Ime korisnika moe sadrati najvie 16 znakova.
Odredbom IDENTIFIED BY zadaje se lozinka novog korisnika, ili dodeljuje nova
lozinka postojeem korisniku.
Korisnici mogu da menjaju svoje lozinke pomou komande:
seL
password = password('novalozinka');
Nivoi prava
Prava koja moete dodeliti pomou komande GRANT dele se u dve osnovne kategorije:
prava za obine korisnike i prava za adnunistratore.
Prava za
Prava za
ob i ne
obine
Ta be la 11 .1
korisn ike
Pravo
Zn aenje
CREATE
SELECT
SHOW DATABASES
Korisniku je dozvoljeno da izdaje komandu SHOW DATABASES da bi dobio listu baza podataka koje postoje na serveru.
Korisniku je dozvoljeno da aurira podatke.
UPDATE
USAGE
Prava za administratore
U tabeli 11.2 prikazana su prava koja bi trebalo da se dodeljuju samo administratorim3 .
Neka meu njima moete dodeliti i odreenim korisnicima, ako procenite da bi to bilo
ispravno, ali nijedno od tih prava ne treba da se podrazumeva za obine korisnike.
..............
Tabela 11.2
Prava za administratore
Znaenje
Pravo
ALL
ALTER
SUPER
WI TH GRANT OPTION
Postoji jo jedno pravo koje se zove REFERENCES. Rezervisano je za buduu upotrebu i mada ga moete dodeljivati, zasad nema nikakvog efekta.
Utvrivanje
ukupnih prava
Globalna prava koja vae za sve baze podataka na serveru. Zadaju se pomou
niza znakova*.* u komandi GRANT. Na primer:
grant all on*.* to fred;
Prava koja vae samo za odreenu bazu podataka. Zadaju se izrazom
irne_ba z e . * u komandi GRANT:
a ll on e mpl oy ee .* to fred;
q n mL
,., ......
Tabele prava
Podaci koje menjate pomou komandi GRANT i REVOKE uvaju se u bazi podataka koja
se zove mysql. Umesto pomou komandi GRANT i REVOKE, tabele u toj bazi podataka
moete me~ati i direktno, ukoliko tano znate ta treba da uradite. Osim toga,
podatke iz tih tabela moete i da uitavate da biste lake reili probleme u vezi s pravima ukoliko se pojave.
Ako sadraj tih tabela menjate direktno, morate izdati komandu
flush privileges;
da bi izmene poele da vae.
U bazi podataka mysql nalazi se est tabela:
user
tables_priv
db
columns_priv
host
func
Prvih pet tabela koristi se za uvanje podataka u vezi s pravima korisnika. (U tabeli
func skladite se podaci koji se tiu funkcija koje korisnici piu, ali to je tema koja
izlazi izvan okvira ove knjige.)
t"091CIVIjt: ll
Prve tri tabele- user, db i host -koriste se kada se utvruje da li imate pravo pristupa bazi podataka. Svih pet tabela se koristi kada se utvruje imate li pravo da
izvrite odreenu komandu.
Tabela user
Tabela user sadri podatke o globalnim pravima korisnika.
Ova tabela ima sledee kolone:
Kolone za opseg vidljivosti Na osnovu sadraja ovih kolona utvruje se koji red
treba uitati. Ovoj grupi pripadaju sledee kolone:
Host: Ime raunara s kojeg korisnik uspostavlja vezu
user: Ime korisnika
Password: Korisnikova lozinka, u formatu ifrovanom pomou funkcije
PASSWORD ()
Kolone za prava Svaka kolona odgovara jednom globalnom pravu i moe
sadrati vrednost y (korisnik ima to globalno pravo) ili N (korisnik nema to globalno pravo). Ovoj grupi pripadaju sledee kolone:
Select_priv
Insert _pri v
Update_priv
Delete _pri v
Index_pri v
Alter_pri v
Create_priv
Drop _pr iv
Grant _pri v
References _pri v
Reload_priv
Shutdown_priv
Process_priv
File _pri v
'i' db _pri v
'shOW'_
Super_pr iv
Create_tmp_table_priv
Lock_tables_priv
Execute _pr iv
Repl_slave_priv
Repl_client_priv
Tabela db
U ovoj tabeli uvaju se podaci o pravima korisnika za pojedine baze podataka. Tabela
se sastoji od sledeih kolona:
Create _pri v
Drop_pri v
Grant_priv
Create_tmp_table_priv
Lock_tables_priv
Tabela host
MySQL pretrauje tabelu host kad god naie na prazno polje u tabeli db. Takvo
ponaanje ne moete zadati komandom GRANT, ali moete ga runo podesiti. Tabela
ima sledee kolone:
Select _pri v
Insert_priv
Update_priv
Delete_priv
Index_pr iv
Alter_pri v
Create _pri v
Drop_pr iv
Grant_priv
Create_tmp_table_priv
Lock_tables_priv
ou-.
Sa ela
Tabela tables_priv
U tabeli tables_priv uvaju se podaci o pravima koje korisnici imaju za pojedine
tabele. Ova tabela ima sledee kolone:
Kolone za opseg vidlj"ivosti Imaju istu namenu kao i u prethodne tri tabele. U
ovom sluaju imamo i kolonu Table_name, koja sadri podatke o tabeli na koju
se pravo odnosi. Kolone za opseg vidljivosti su sledee:
Host
Db
User
Table name
Kolone o dodeli uvaju podatke o tome ko je i kada dodelio pravo. Ovoj grupi
pripadaju sledee kolone:
Gran tor
Time stamp
Kolona Column_pri v
Saetak
GRANT i REVOKE
Komanda GRANT omoguava da korisniku dodelite prava pristupa ili da napravite
nov korisniki nalog. Format komande je sledei:
GRANT vrsta_prava [ (lista_kolona) J [, vrsta_prava [ (lista_kolona) J
... ]
ON {ime_tabele l * l *.* l ime_baze.*)
TO ime_korisnika [IDENTIFIED BY [PASSWORD] 'lozinka']
[, ime_korisnika [IDENTIFIED BY 'lozinka'] ... ]
[REQUIRE
NONE l
[{SSLI X509}J
[CIPHER nain_ifriranja [AND]]
[ISSUER davalac_sertifikata [AND]]
[SUBJECT subjekt]]
[WITH [GRANT OPTION l MAX_QUERIES_PER_HOUR # l
MAX_UPDATES_PER_HOUR # l
MAX_CONNECTIONS_PER_HOUR #JJ
Komanda REVOKE ukida prava dodeljena korisniku. Format komande je sledei:
REVOKE vrsta_prava [ (lista_kolona) l [, vrsta_prava [ (lista_kolona) J
... ]
ON {ime_tabele l * l *.* l ime_baze.*)
FROM ime_korisnika [, ime_korisnika ... ]
Prava
Prava se mogu dodeljivati korisnicima pojedinano.
Tabela columns_priv
U tabeli columns _pri v uvaju se podaci o pravima korisnika za pojedine kolone.
Tabela ima sledee kolone:
utvruje
koji
Kolona column_pri v
navedenoj u kolonama za opseg vidljivosti. Moe sadrati jednu iz skupa sledeih vrednosti: Select, Insert, Update i References.
UPDATE
INDEX
USAGE
INSERT
Ovo su prava name~ena administratorima:
ALL
ALTER
REPLICATION CLIENT
DROP
SHUTDOWN
FILE
SUPER
PROCES S
RE LOAD
REPLICATION SLAVE
U sledeem po!Jiavl u
Tabele prava
uva
u bazi poda-
uvaju
b) ima vrednost Y ili N kada je korisniku dozvolj en pristup toj bazi podataka
e) opisuje jedno od prava koje korisnik ima za tu tabel u
uvaju
U tabeli columns_priv
u tabelama.
raunara
uvaju
Pitanja
Vebe
l. Napiite komandu GRANT koja pravi korisniki nalog bill, ija je lozinka
secret i kome je dozvoljeno da uitava podatke iz tabele department, aurira ih,
Odgovori
FLUSH
Pitanja
l. b
2. e
3. d
4. a
5. a
Vebe
l.
REVOKE
FILE omoguava
uitava
korisniku da
podatke iz datoteke
2.
U sledeem poglavlju
12
Podeavanje MySOL-a
170
Kada je MySQL instaliran na Unixu, moete imati jednu globalnu datoteku opcija,
po jednu datoteku opcija za svaki MySQL server instaliran na raunaru i po jednu
datoteku opcija za svakog korisnika. (Na jednom fizikom raunaru moe raditi
istovremeno vie MySQL servera, to je objanjeno u nastavku ovog poglavlja.)
Globalna datoteka opcija nalazi se u direktorijumu /etc/my. cnf. Datoteke opcija
za pojedine servere nalaze su direktorijumima data svakog servera, a datoteke opcija za
pojedine korisnike nalaze se u matinom direktorijumu svakog korisnika. Imajte u
vidu da imena datoteka opcija za korisnike imaju prefiks taku- tj. ime datoteke je
.my.cnf a ne my.cnf.
Pogledajmo ponovo datoteku opcija koju smo u poglavlju 1 naveli kao primer
sintakse za tu vrstu datoteka. Njen sadraj ponovo prikazujemo u listingu 12.1.
Listing 12.1
[mysqld]
# binarno beleenje i beleenje sporih upita
log-bin
log-slow-queries
podeavanje za InnoDB tabele
ovo je osnovna datoteka opcija predloena u dokumentaciji.
Datoteke za podatke treba da omogue
skladitenje podataka i indeksa.
obezbedite dovoljno slobodnog
prostora na disku.
innodb_data_file_path = ibdatal:lOM:autoextend
# podesite veliinu rezerve za bafere na
# so-so% koliine memorije
# na raunaru
set-variable = innodb_buffer_pool_size=70M
set-variable = innodb_additional_mem_pool_size=lOM
# podesite veliinu dnevnika na priblino
# 25% veliine rezerve za bafere
set-variable = innodb_log_file_size=20M
set-variable = innodb_log_buffer_size=BM
# podesite .. flush_log_at_trx_commit
# na o ako moete da prihvatite gubljenje
u nekoliko poslednjih transakcija
innodb_flush_log_at_trx_commit=l
#
#
#
#
#
#
upnJA
Na isti nain kao to zadajete opcije za pojedine programe, moete zadati i grup11
opcija [client], koje e vaiti za sve programe.
Redovi koji poinju znakom # su komentari .
Postoje tri oblika sintakse za zadavanje vrednosti opcija:
Moete navesti ime opcije koju elite da ukljuite; na primer:
log-bin
Ovo je ekvivalentno pozivanju mysqld --log-bin s komandne linije.
Moete navesti ime opcije i vrednost koju joj dodeljujete; na primer:
innodb_flush_log_at_trx_commit=l
Moete navesti ime opcije i do deli ti joj vrednost pomou sintakse set -vari able; na primer:
set-variable = innodb_log_buffer_size=BM
Trei oblik sintakse smatra se zastarelim, ali smo ga naveli radi celovitosti. Poto
ete nailaziti na ovaj oblik sintakse u nekim datotekama primera, trebalo bi da
znate ta on znai. Na primer, to je sluaj s primerom datoteke my. cnf, koju
smo preuzeli iz MySQL-ove dokumentacije kao jednostavnu datoteku opcija
za lnnoDB.
Neke opcije koje
odreuju
--no-defaults
znai
kako
iji
bi sadraj trebalo
uitati.
tekui
program.
1/2
emo
uraditi
Opcije za lnnoDB
U primeru datoteke koji smo naveli, postoji i nekoliko opcija koje se odnose na
InnoDB. Komponentu InnoDB moete koristiti i ako ne zadate izriito vrednosti za
te opcije, ali trebalo bi da ih podesite radi boljih performansi . Ranije smo podesili sledee opcije:
innodb_data_file_path = ibdatal : lOM:autoextend
Ova opcija opisuje MySQL-u gde da smeta podatke kojima upravlja InnoDB.
Za razliku od My ISAM tabela koje su smetene svaka u svojoj datoteci, InnoDB
tabele se uvaju u deljenom prostoru za tabele, koji se moe sastojati od jedne ili
od vie datoteka. U ovom primeru nalaemo MySQL-u da sve InnoDB podatke
smeta u istu datoteku ije je ime ibdatal, a poetna veliina 10 MB automatski
se poveava (u koracima od po 8 MB) kada se prostor za tabele popuni.
Opti format ove opcije je
imedatoteke : veliina [; imedatoteke:veliina; .. . ] [ :autoextend [:max: veliina]]
Opcija autoextend omoguava da se veliina prostora za tabele poveava prema
potrebama. Opcija max omoguava da zadate maksimalnu veliinu do koje datoteka moe da naraste.
innodb_buffer_pool_size=70M
Ova opcija podeava veliinu bafera koji se koristi kao ostava za (ke) pri radu
s podacima u InnoDB tabelama i indeksima . Kao i svaka druga ostava, to vea,
to bolja- omoguava manje direktnih pristupa disku . Koliko ete memorije
odvojiti za rezervu bafera zavisie od toga da li na serveru ima i drugih aplikacija
i kmisnik.l, ali i ml koliine memorijl' s kojo111 raspolaete.
innodb_additional_mem_pool_size=lOM
Ova opcija odvaja memoriju koja e sluiti za smeta~e MySQL-ovih internih
struktura podataka. Ako MySQL- u ponestane ove vrste memorije, poee da
upisuje upozorenja u dnevnik greaka .
innodb_log_file_size=20M
Ova opcija podeava veliinu datoteka dnevnika . InnoDB cikli no popunjava n
datoteka dnevnika- gde je n vrednost zada ta opcijom innodb_ log_ files_
in_group; podrazumevana vrednost je 2 i preporu uje se.
innodb_log_buffer_size=8M
Ova opcija podeava veliinu bafera u koji sc upisuje dnevnik izmena pre nego
to se upie na disk.
innodb_flush_log_at_trx_commit=l
Ako ovoj opciji zadate vrednost 1, to znai da se sadraj dnevnika izmena iz
bafera upisuje na disk kad god potvrdite transakciju. To je normalno ponaanje.
Kada je ova opcija podeena na vrednost nula, dnevnik se upisuje i prenosi na
disk otprilike jedanput u sekundi. Ako je vrednost ove opcije 2, podaci se upisuju u dnevnik kad god potvrdite transakciju, ali se sadraj bafera prazni i upisuje
na disk jedanput svake sekunde.Vrednosti o ili 2 poboljavaju performanse, ali
verovatno ne treba da objanjavamo koliko je to rizino.
Postoje i druge konfiguracione opcije za InnoDB. Vie informacija o tome
u MySQL-ovoj dokumentaciji.
nai
ete
prikljuku.
1 14
Jednostavan nain da to postignete jeste da opciji basedir dodelite razliitu vrednost za svaki server. Tako e direktorijumi data i datoteke dnevnika automatski biti
razliiti. Toplo preporuujemo da svaki server ima svoj direktorijum data, tako izbegavate razne neprijatnosti.
Opcija --defaults-fileje veoma korisnajer omoguava da se svaki server
pokrene s razliitim skupom podrazumevanih vrednosti opcija (ili da se svaki server
instalira kao Windowsov servis s vlastitim skupom podrazumevanih vrednosti opcija).
Vano je da zapamtite sledee: kada na istom raunaru radi vie servera, klijentskim
programima i drugim programima koji uspostavljaju veze sa serverom, kao to je mysqladmin, morate zadati server s kojim treba da se poveu. U takvim situacijama moe
biti veoma pametno da za svakog korisnika napravite po jednu datoteku my. conf u
kojoj ete zadati odgovarajui broj TCP prikljuka- tako korisniku omoguavate da
automatski uspostavi vezu sa svojim serverom.
lnternacionalizovanje
Postoje dve opcije za mysqld koje omoguavaju da se zada podrazumevani skup znakova i jezikih pravila. Skup znakova je skup simbola koji se moe koristiti na serveru.
Jezika pravila odreuju nain na koji se parede nizovi znakova iz tog skupa- ime se
odreuje i redosled sortiranja- to zavisi od govornog jezika.
Podrazumevani skup znakova moete zadati pomou opcije --default -character-set. Svakom skupu znakova pridruen je i podrazumevani skup jezikih pravila,
ali moete zadati i neki drugi pomou opcije --default-collation option. Ako
kombinacija skupa znakova i skupa jezikih pravila nije ispravna, mysqld e prikazati
poruku o greci.
Ako nijedna od ovih opcija nije zadata, podrazumeva se skup znakova latin l i skup
jezikih pravila latinl_swedish_ci. Taj skup znakova se takoe oznaava kao IS0-8859-1 West European. Jezika pravila latinl_swedish_ci odreuju redosled sortiranja teksta na vedskom i finskom jeziku koji se sastoji od znakova iz skupa latin l.
(Moda niste znali da za rei napisane istim slovima vae razliita pravila sortiranja u
razliitim jezicima.) Postoje i jezika pravila koja se mogu pridruiti skupu znakova
latinl koja opisuju kako se sortira tekst na nemakom, danskom i norvekom jeziku.
Vie informacija o skupovima znakova koje MySQL podrava, naroito ako vas
z~nima ba odreeni skup, potraite u MySQL-ovoj dokumentaciji.
Saetak
MySQL-ovi programi mysql, mysqladmin, mysqld, mysqld_safe, mysql.server,
mysqldump, mysqlimport, mysqlshow, mysqlcheck, myisamchk i myisampack
podravaju upotrebu zajednikih datoteka opcija.
Opcije moete podesiti tako da vae na globalnom nivou, na nivou pojedina
nog servera i/ ili korisnika, ili na svim navedenim nivoima istovremeno.
Listu svih opcija za program mysqld moete dobiti pomou komande mysqlcl
--help.
Vie MySQL servera moe raditi na istoj maini u isto vreme, pod uslovom da
podesite opcije tako da serveri ne ometaju jedan drugog. Za svaki server morate
zadati razliite brojeve TCP prikljuka, utinica i datoteka dnevnika.
U datoteci opcija moete zadati podrazumevani skup znakova i jezikih pravila
koja e vaiti na serveru. Skup znakova se sastoji od skupa dozvoljenih simbola .
Jezika pravila odreuju redosled sortiranja.
Pitanja
l. Opcija --no-defaults za mysqld znai
veliinu
prostora za tabele je
a) innodb_buffer_pool_size
b) innodb_data_file_path
e) innodb_log_buffer_size
d) nijedna od prethodnih
3. Opcija za InnoDB koja podeava veliinu bafera za podatke je
a) innodb_buffer_pool_size
b) innodb_data_file_path
e) innodb_log_buffer_size
d) nijedna od prethodnih
4. Kada vie servera radi na istom raunaru, nUe neophodno da
budu odvojeni:
a) datoteke dnevnika
b) TCP prikljuci
e) utinice
d) klijentski programi
sledei
elementi
~G
S. ta je od sledeeg tano?
a) Jedan skup jezikih pravila moe se pridruiti samo jednom skupu znakova.
b) Jedan skup jezikih pravila moe se pridruiti svakom skupu znakova.
e) Jednom skupu znakova moe se pridruiti samo jedan skup jezikih pravila.
d) Nijedno od prethodnih.
Vebe
Instalirajte stariju verziju MySQL-a (na primer, 3.23) na svoj raunar. Podesite sistem
tako da imate i tekuu i stariju verziju servera koje rade na istom fizikom raunaru
Pokuajte da uspostavite vezu sa obe verzije.
.
Odgovori
Pitanja
l. b
2. b
3. a
4. d
S. a
Analiziranje tabela
Pregledanje datoteka dnevnika izmena
U sledeem poglavlju
U sledeem poglavlju, "Administriranje baze podataka", razmotriemo uobiajene
t svakodnevne poslove odravanja koje treba obavljati u MySQL-ovoj bazi podataka.
RAZMOTRIEMO uobiajene
OVOM POGLAVLJU
poslove koji su neophodni za
upravljanje MySQL-ovom bazom podataka. To obuhvata sledee aktivnosti:
/t
18
III~UL.I.UIIJ'-
-- ---.---------~
ali samo ako imate kopiju izvrne datoteke mysqld u direktorijumu koji se podrazumeva u distribuciji Red Hat. Ako se ta datoteka nalazi na drugom mestu, moraete da
zadate tanu putanju. Vie informacija o tome nai ete u poglavlju l. Server moete
pokrenuti i pomou skripta
safe_mysqld
Ovaj skript najpre pokuava da automatski odredi odgovar~ue opcije za pokretanje MySQL-a, a zatim pokree MySQL s tim opcijama.Ako skript nije na vaoj
podrazumevanoj putanji, moraete da zadate celu putanju na kojoj se on nalazi.
Da biste na Linuxu spustili MySQL server, imate dve mogunosti. Moete izdati
komandu
.......
........
1'1-0Yidosn..,
~o
...
~'-
Atltritvw:t ...
l'rl;wlcle$p . .
Stted
Crut
5tted
Mlnoqei: ...
PnNidest ...
~t
ili
,...,"..,.
NetWOik.S...
51:ted
51:ted
/etc/init.d/mysqld stop
Locd~~Sys;t~
Lout5o,ostem
Cohdtpe ...
fnobiH ...
toc~
'"""""'
(alecb ..... ..
...
........ ,....
............-
-.......
Local~
"..,
Locals-,.tem
LCIUIISyod:em
........
""""".......
.........
,....
.........
Loct/Sysl:.-!1
LQ(also,stem
"""....
Net.-lo.S ...
lCIUIISerw;
ENbletrl ...
Stttd
Offeru- . ..
.....
.....
.........
........
5tt..:l
.-
"._
su..-.....
~-
Sl4IPCIUI'i...
-.....
...
..... 5lted
Stt..:l
Razume se, moete koristiti i neki drugi adm.inistratorski nalog, ali nalog root je
uvek upotrebljiv. Nalozi pod kojima rade obini korisnici ne bi trebalo da imaju pravo
sputanja servera.
Na Windowsu, ukoliko ste mysqld instalirali kao Windowsov servis, najjednostavniji
nain da pokrenete bilo koji servis jeste da otvorite Control Panel i preete u Administrative Tools, Services. Ako izaberete servis MySQL,Windows e vam za njega ponuditi
opcije Stop (sputanje), Pause (zaustavljanje) ili Restart (ponovno pokretanje), kao to je
prikazano na slici 13.1. (Poto je ovo ekranska slika iz Windowsa XP Professional, sadraj
vaeg ekrana e se moda malo razlikovati, to zavisi od verzije operativnog sistema.)
Server moete spustiti i pomou skripta mysqladmin za Linux, na opisani nain.
J~W~eoet:e ...
fNtllessu .. .
~-..
Tr.:boy~.
Slika 13.1
.......
Lou!So,lt.,..
"....
,....
,.... ,.,...
Loul System
"._
Loul Sylt. .
LouoiSeMc:e
loc.. s.r.t:e
Lauls,.st. .
Loul~
LocdiiSytten~
Kao i veinu skriptova koji se pokreu s komandne linije, skript mysqlshow moete
pokrenuti s parametrom -u kojem sledi ime korisnikog naloga, i parametrom -p,
kojim se prosleuje lozinka tog naloga. Postoje i druge korisne opcije. Ako zadate
mysqlshow --help
prikazae
Ako na kraj ovog reda dodate i parametar --status, dobiete detaljnije podatke
o tabelama. Isprobajte to na bazi podataka employee, na sledei nain:
mysqlshow
prikazae se lista baza podataka u koje vam je dozvoljen pristup pod vaim tekuim
korisnikim nalogom. Rezultat je isti kao kada zada te
Rezultati su malo tee itljivi zbog dugakih redova, ali se za svaku tabelu prikazuju podaci o maini za skladitenje podataka koja se koristi, koliini podataka u tabeli,
tekuoj vrednosti u koloni tipa auto-increment (ukoliko postoji takva kolona) i podaci
o skupu znakova koji vai za tabelu.
show databases;
u programu mysql ili u nekom drugom
korisnikom
interfejsu.
l tlU
111'-U"-IWUIIJ"'-
r----~----
-''l
"'
SET.
.t'',
show databases;
Koji su sve procesi aktivni na serveru moete videti ako unutar MySQL-a izdate sledeu komandu:
show processlist;
show tables;
Na primer, zadajte
Prikazae se podaci barem o upitu koji ste upravo poslali (show processlist).
pomou
komande DESC.
Slino
pomou
Da biste dobili podatke o !l!!rveru i nainu na koji radi, pogledajte status servera i vrednosti serverskih promenljivih
Da biste saznali kakav je tekui-sta~us MY_SQL-a, moete izdati komandu
Rezultat je izraen u obliku komande GRANT pomou koje moete zadati drugom
korisniku ista prava kao tekui korisnik. Na primer,
SHOW STATUS
+--------------------------------------------------------------------+
l Grants for root@localhost
l
+--------------------------------------------------------------------+
l GRANT ALL PRIVILEGES ON* * TO 'root'@'localhost' WITH GRANT OPTION!
+--------------------------------------------------------------------+
na komandnoj liniji.
Time ete dobiti veu koliinu statistikih podataka o tome ta se sve dogaalo na
serveru od trenutka pokretanja. Moe vas zanimati da pogledate vrednosti svih promenljivih ije ime poinje s com_*- na primer, promenljiva com_ select pokazuje
koliko je server izvrio komandi select.
Ovo su neke od najzanimljivijih vrednosti:
threads_connected: Broj otvorenih i aktivnih veza izmeu korisnika i servera.
sledee
rezultate:
slow_queries: Ukupan broj upita koje je server izvrio i ije je izvravanje trajalo
na komandnoj liniji.
Ako vas zanima kako bi izgledala komanda create koja formira odreenu tabelu
koja postoji u sistemu, zadajte
show create table ime_tabele;
182
Uatoteke dnevnTk.t
dobiete sledei
rezultat:
(Obratite panju na to da su, za svaki sluaj, imena ko~ona napisa~:. izmeu polunavodnika i naveden je podrazumevani skup znakova, koj l rusmo lZnClto zadah kada
Datoteke dnevnika
.. .
Unitavanje niti
Komanda show processlist koju smo pomenuli u prethodnom delu ovog poglavlja
omoguava da vidite koje se sve niti izvravaju na serveru. Izmeu ostalog, komanda
prikazuje i jedinstveni identifikator dodeljen svakoj niti. Ak~ za ~:~~ m.~ sum~jate da
je uzrok problema (na primer, upit koji s; izv.rava "celu vecnos: ih klljentskl program zbog kojeg je nastao problem), mozete je prekinuti pomocu komande
kill id_procesa;
Pranjenje ostava
nain
MySQL koristi pri radu grupu internih ostava (keova), koje m.ozete 1spra~mt1 pom~cu
komandi FLUSH i RESET. Na primer, ako ste izmenili prava konsmka tako sto ste rucno
izmenili sadraj tabela prava, te izn1.ene e poeti da vae u celom sistemu tek kad izdate
komandu:
flush privileges;
Druga esta upotreba komande FLUSHjeste pranjenje bafera za upite:
(lush query cache;
Time ete defragmentirati bafer za upite, ime se poboljavaju performanse.
MySQL odrava vie datoteka dnevnika koje mogu biti korisne. Budui da beleenje
u veinu tih datoteka dnevnika nije ukljueno u standardnoj konfiguraciji servera,
to ete morati sami da uinite. Svaki dnevnik se aktivira pomou opcije zadate na
komandnoj liniji pri pokretanju servera ili pomou komande set.
Moete odravati sledee dnevnike:
Dnevnik greaka (engl. Error log): tu se belee sve greke nastale pri radu servera.
Ovaj dnevnik je standardno aktivan a njegova datoteka se nalazi u direktorijumu
data. U Linuxu, ime te datoteke je hostname. err, a u Windowsu, njeno ime je
mysql. err. Moete je smestiti i u neki drugi direktorij um, koji morate navesti u
opciji log-error=imedatoteke u konfiguracionoj datoteci my. ini ili my. cnf.
Dnevnik upita (engl. Query log): tu se belee svi upiti koji se izvravaju u sistemu.
Ovaj dnevnik moete aktivirati i zadati direktorijum za njegovu datoteku
pomou opcije log=imedatoteke.
Dnevnik izmena (engl. Binary log): tu se belee rezultati svih upita koji menjaju
podatke. Ovaj dnevnik zamenjuje nekadanji Update log, koji e ostati na raspolaganju i u MySQL-ovoj verziji 5.0, ali se smatra zastarelim. Ovaj dnevnik
moete aktivirati i zadati direktorijum za njegovu datoteku pomou opcije
log-bin=imedatoteke.
Dnevnik sporih upita (engl. Slow query log): tu se belee svi upiti ije izvravanje
traje due od vremena zadat og u promenljivoj long_query_t ime. Ovaj dnevnik
moete aktivirati i zadati direktorijum za njegovu datoteku pomou opcije
log-slow-queries=imedatoteke
Svi navedeni dnevnici, osim dnevnika izmena, obine su tekstualne datoteke.
Sadraj dnevnika izmena moete videti pomou komande
mysqlbinlog logfile
Upotrebu dnevnika sporih upita razmotriemo u poglavlju 19.
Poto veliina datoteka dnevnika raste, trebalo bi da ih ciklino zamenjujete dru gim datotekama. Ako koristite Linux, uz MySQL dobijate i skript mysql-log- rota te
koji formira grupu datoteka za ciklinu upotrebu.
R4
Ako koristite neki drugi operativni sistem, stare datoteke dnevnika moete runo
premestiti na bezbedno mesto a zatim naloiti MySQL-u da zapone upisivanje u
novu datoteku dnevnika, pomou sledee komande
pomou
konlalhh
menlj iva=vrednost;.
mysqladmin flush-logs
Ostave se prazne
Za skript mysqladmin postoje mnogobrojne, manje ili vie korisne opcije.
Neki poslovi, kao to je pravljenje i brisanje baza podataka, mogu se obaviti
pomou SQL-ovih komandi ili pomou skripta mysqladmin:
mysqladmin create databasename
mysqladmin drop databasename
dugaak
RESET.
poveati pomou
komandl"
111,
Pitanja
1. Koji su od
sledeih
a) dnevnik upita
b) dnevnik sporih upita
e) dnevnik greaka
d) dnevnik izmena
e) svi prethodni
2. SQL-ova komanda
SHOW
odreenoj
bazi podataka
odreenoj
tabeli
d) svega prethodnog
3. Skript mysqladmin moe se upotrebiti za
sledee:
a)
mysqladmin processlist
MySQL belei podatke u dnevnik greaka, dnevnik upita (svi upiti), dnevnik
izmena (upiti koji menjaju podatke) i dnevnik sporih upita (upiti ije izvrava liJI'
traje due nego to je zadato upromenljivoj long_query_time).
sledee:
mysqladmin status
mysqladmin extended-status
FLUSH
mysqladmin version
komandi
mysqladmin ping
pomou
1 11
uitavanje
ponu
da
vae
sledei nain:
sledee:
mysqladmin variables
Saetak
Server se moe pokrenuti pomou skripta mysqladmin, pokretanjem izvrne
datoteke mysqld, ili pomou Windowsove alatke Services manager.
Server se moe spustiti pomou komande mysql. server stop ili pomou
skripta mysqladmin shutdown .
Komanda mysqlshow omoguava prikazivanje podataka o tekuoj bazi ili
o MySQL serveru .
e) sve prethodno
Vebe
Aktivirajte sva etiri dnevnika. Poto izvrite vie upita, pregledajte sadraje dnevnika .
Ako nemate pristup veoj bazi podataka, moda neete postii da se neto upie u
dnevnik sporih upita. Definicija "sporog" je najmanje jedna sekunda .
186
Odgovori
Pitanja
l. e
2. d
3. e
U sledeem poglavlju
U poglavlju 14, "Izrada rezervnih kopija i obnavljanje podataka", objanjavamo izradu
rezervnih kopija baza podataka i ta treba uraditi kad neto krene naopako.
OVOM POGLAVLJU
RAZMOTRIEMO
raunar
skripta mysqldump napravite datoteku slike stanja (engl. dump file), tj.
datoteku koja sadri sve SQL komande koji su neophodne da biste obnovili
tekue stanje baze podataka.
Pomou skripta mysqlhotcopy napravite datoteku s podacima. Ovaj skript
direktno kopira datoteke u kojima se nalaze podaci koji pripadaju bazi.
Sami direktno napravite obinu kopiju datoteka s podacima. Time zapravo runo
radite ono to skript mysqlhotcopy radi. Ako se opredeli te za ovu mogunost,
moraete da zatvorite bazu podataka, ili da ispraznite ostave za podatke i da
zakljuate tabele da biste obezbedili da podaci u njima ostanu meusobno uskla
eni. Poto skriptovi mysqldump i mysqlhotcopy prazne ostave i zakljuavaj u
tabele umesto vas, oni su bezbednije reenje .
Upotrebite komande BACKUP TABLE i RESTORE TABLE da biste napravili rezervne
koptjt :tadatc tabele ili grupe tabela.
188
ILiaUO
Najuobiajeniji nain izrade rezervnih kopija baze podataka jeste pomou skripta
mysqldump koji pokrenete s komandne linije svog sistema. Ovaj skript uspostavlja vezu
s MySQL serverom i formira datoteku slike stanja, koja sadri sve SQL komande
potrebne za rekonstruisanje tekueg stanja baze podataka.
Tipian primer upotrebe ovog skripta izgledao bi ovako
>
backup.sql
U ovom primeru zadali smo samo opciju--opt; ona grupie nekoliko drugih
opcija, koje su opisane u nastavku teksta. Naveli smo ime baze podataka, a rezultat
preusmeravamo u datoteku rezervne kopije koju elimo da napravimo.
Ako skript pri meni te na jednostavnu bazu podataka employee, dobiete rezultujuu datoteku iji e sadraj biti nalik na listing 14.1.
Listing 14.1
Database: employee
4.1.0-alpha-max-debug
"VtJIJU
1\..L\..1 VIlli l
~v
l U~ldVIJC
l ""t
ILl dUd ICLCI V lilJI r\UtJIJ l UUIIc:tYIJOIIJ\. tJUUQUII\CI tJUIIIU\..U .:JI" l tJ lO IIIJ-;,'-tl\1~1"11}'
odgovarajuim
IL.IUUU
Ako vam zatreba da pomou ove datoteke ponovo formirate bazu podataka i njen
sadraj, postupak e biti bri nego kada zadate niz pojedinanih komandi INSERT.
--lock-tables: Nalae MySQL-u da
izradu datoteke slike stanja.
zakljua
zapone
Imajte u vidu da opcija --opt (koja znai optimizovati) optimizuje vreme potrebno
za rekonstruisanje baze podataka pomou datoteke slike, a ne vreme potrebno za izradu same
datoteke slike. Postupak izrade datoteke slike moe biti prilino spor.
Evo jo nekoliko korisnih opcija:
--databases: Omoguava da zadate vie odjedne baze podataka
elite da napravite.
ije
slike stanja
pomou
Ovaj skript se
pokree
1'-L.'-1
na
or ooooo
'"""I"''J..,.
o."..,..,,_,.,)-'')- r - - - o o - -
r--.----.--...... . - - - - -
sledei nain:
Umesto skripta mysqlhotcopy, moete i sami runo uraditi sve to taj skript radi. To
podrazumeva pranjenje bafera, zakljuavanje tabela i kopiranje datoteka s podacima
u odredini direktorij um, pri emu tabele moraju biti zakljuane.
To znai da morate otvoriti novu sesiju na MySQL serveru. Moete najpre izdati
komandu LOCK TABLES da biste zakljuali sve tabele za koje nameravate da napravite
rezervne kopije:
lock tables
employee read,
department read,
client read,
assignment read,
employeeSkills read;
Parametri komande LOCK TABLES su lista imena tabela i vrsta blokade koju postavljate, READ ili WRITE. Za izradu rezervnih kopija obino je dovoljna blokada tipa
READ. To znai da druge niti (otvorene veze sa serverom) mogu neometano da itaju
tabele ali ne mogu nita da menjaju u njima dok traje postupak kopiranja.
Zakljuavanje tabela je vano u ovakvim situacijama jer kopiranje moe da potraje
prilino dugo. U naem primeru baze podataka employee, bilo bi veoma nezgodno da
nakon izrade rezervne kopije tabele, a pre kopiranja tabele department, neko izbrie
sve zaposlene iz neke slube, a zatim izbrie i samu slubu. Rezultat bi bio neusklaena
kopija podataka u kojoj bismo imali zaposlene koji rade u nepostojeoj slubi.
Sledei korak je izdavanje komande FLUSH TABLES:
flush tables;
Ako pravite rezervnu kopiju svih baza podataka na serveru, ovaj korak moete
kombinovati s prethodnim pomou sledee komande:
flush tables with read lock;
Sada moete zapoeti kopiranje datoteka s podacima.Veoma je vano da vaa sesija
(u kojoj ste zakljuali tabele i ispraznili njihove bafere) ostane otvorena tokom celog
I!J4
postupka jer e tako blokade koje ste postavili biti odrane. Kada zatvorite tu sesiju,
tabele e biti osloboene.
Kada zavrite kopiranje, trebalo bi da oslobodite tabele:
unlock tables;
Opisani postupak je ono to radi skript mysqlhotcopy, a podatke moete obnoviti
iz kopija na isti nain kao da ste kopije napravili pomou tog skripta.
O-'
-- O
--- .-e...._.....,_____
1:70
rU!JiliVIJC
l'+
Ako se tabele upravo koriste, nemojte pokretati skript myisamchk ili isamchk.
Bolje je da spustite server pre nego to pokrenete jedan od tih skriptova, ali ako je
neophodno, moete i zakljuati tabele. Ako te skriptove pokrenete za tabele s kojima
u isto vreme moda rade druge MySQL-ove niti, podaci se mogu otetiti. Komande
CHECK, REPAIR i skript mysqlcheck mogu se slobodno koristiti dok server radi i tabele
se koriste.
Razmotriemo redom navedene alatke.
pomou
pomou
+---------------------+-------+----------+----------+
l Table
Msg_type
Msg_text
l Op
+---------------------+-------+----------+----------+
l
employee.department
check
status
OK
+---------------------+-------+----------+----------+
myisamchk -r tabela
Ako i to bude bezuspeno, pokuajte opciju --s af e- recover, koja ispravlja neke
greke koje opcija -r ne moe da ispravi:
myisamchk --safe-recover tabela
Program myisamchk ima veliki broj moguih opcija, koje
komandnoj liniji otkucate myisamchk bez parametara.
ete
videti ako na
+---------+--------+----------+----------+
l Table
Msg_type
Msg_text
l Op
+- --------+--------+----------+----------+
l
test.tl
l
repair
status
OK
-- ------+--------+----------+----------+
l row in set
(0.03 sec)
Ako se pojavi poruka drugaija od OK, komanda REPAIR nije delovala i morate da
upotrebite moniju alatku myisamchk.
OK
OK
OK
OK
OK
flUUCILCIII.d
U ~II::Ut:l:t:m
Opcijom --databases moete zadati listu baza podataka koje treba proveriti,
a opcija --all-databases ini da se proveravaju sve baze podataka na serveru.
Programu mysqlcheck moete zadati opciju -r da bi popravio sve oteene
MyiSAM tabele na koje ie.
Saetak
Izrada rezervnih kopija
Restauriranje podataka
Izvrite komande iz datoteke slike stanja napravljene pomou skripta mysqldump.
Vratite kopije datoteka koje ste napravili pomou skripta mysqlhotcopy ili
runo.
Proverite stanje tabela pomou komandi CHECK TABLE ili skriptova myisamchk,
isamchk ili mysqlcheck.
Popravite tabele pomou komande REPAIR TABLE ili skriptova myisamchk,
isamchk ili mysqlcheck.
TABLE?
d) InnoDB i BDB
Pomou
CHECK
b) samo MyiSAM
e) MyiSAM i BDB
BACKUP TABLE
t' J
mysqldump
poglaVlJU
b) komanda CHECK
e) tabela je dobra
TABLE
REPAIR TABLE?
is already up
to date
d) nijedno od prethodnog
Vebe
Napravite rezervnu kopiju ~voje baze podataka primenom svih metoda opisanih u
ovom poglavlju. RestaunraJte bazu podataka iz svake kopije koju ste napravili.
Odgovori
Pitanja
Pitanja
l. Ako elite da napravite rezervnu kopiju baze podataka, morate prethodno
a) spustiti server
b) zakljuati tabele i isprazniti njihove bafere
e) i a) i b)
d) nijedno od prethodnog
1. b
2. a
3. a
4. b
5. e
U sledeem poglavlju
U sledeem poglavlju",Zatita MySQL servera", saznaete kako da izbegnete najee
bezbednosne propuste.
l'
15
Zatita MySQL servera
razmatraemo
OVOM POGLAVLJU
opte probleme zatite o kojima bi trebalo da
vodite rauna kada koristite MySQL server. Iako je jedno poglavlje nedovoljno da se
objasne i najsitniji detalji, prilaemo spisak najvanijih preporuka o tome ta ne treba
raditi. Obradiemo sledee teme:
202
Imajte u vidu da dva reda mogu sadrati razliite lozinke. To moe biti uzrok velike
zabune. (Primer takve situacije pogledaemo u odeljku "Brisanje anonimnih naloga",
u nastavku ovog poglavlja.)
Drugi korak se odvija kada pokuate da izvrite odreene upite ili komande. Pre
izvrenja svakog upita, MySQL proverava u tabelama prava da li je vam dozvoljeno
izvravanje upita koji ste poslali.
Ako je za upit koji pokuavate da izvrite potrebno globalno pravo - npr. kao za
komande LOAD DATA INF ILE ili SHOW PROCESSLIST - ispituje se tabela user. Pri izvravanju upita u odreenoj bazi podataka, najpre se ispituje tabela user. Kad korisnik
ima pravo pristupa u sve baze podataka na serveru, to pravo je dovoljno. Ako nema to
pravo, ispituju se tabele db i host. Ako korisnik nema prava ni na tom nivou, na kraju
se utvruje da li moda ima pravo pristupanja odreenim tabelama i kolonama.
Zadavanje lozinke za
korisniki
nalog Root
Kada zavrite instaliranje MySQL-a, korisnik root nema lozinku. Obavezno zadajte
lozinku za tog korisnika pre nego to ponete da koristite MySQL za bilo ta drugo
osim iskljuivo za eksperimentisanje. Dok ne zadate lozinku za korisnika root, svako
se moe prijaviti na va server i raditi s vaim podacima ta god pocli.To gotovo nikad
nije prihvatljiva situacija. Ako jo niste zadali lozinku, uinite to odmah.
Opasna prava
MySQL ima veoma detaljan sistem prava korisnika, to je opisano u poglavlju ll.
Morate vrlo paljivo razmotriti kome ete dodeliti neka od tih prava. Budite veoma
oprezni s pravima FILE, PROCESS i WITH GRANT OPTION.
Pravo FILE omoguava korisnicima da izdaju komandu LOAD DATA INF ILE. Ta
komanda moe se zloupotrebi ti za menjanje sadraja datoteka na serveru (kao to je
datoteka za lozinke, /etc/passwd) ili ak za menjanje datoteka baza podataka, ime se
zaobilazi sistem prava pristupa.
Pravo PROCESS omoguava korisnicima da izdaju komandu SHOW PROCESSLIST.
Tako u svakom trenutku mogu videti koji se sve upiti izvravaju, to im omoguava da
dou do poverljivih podataka o drugim korisnicima.
Pravo WITH GRANT OPTION omoguava korisnicima da svoja prava dodeljuju drugim korisnicima. Ako znate kakve mogu biti posledice tog prava, moete ga oprezno
dodeljivati drugima.
ifrovanje lozinki
MySQL uva lozinke korisnika u ifrovano m obliku. Pre verzije 4.1, mogli ste pri prijavljivanju na server da zadate i ifrovani oblik lozinke.To je sada ispravljeno i ugraena
je jaa zatita lozinki i mehanizma prijavljivanja.
Ako piete aplikaciju koja skladiti imena i lozinke svojih korisnika (ne korisnika
MySQL-a), nemojte ih ifrovati pomou funkcije PASSWORD ().Umesto nje, preporuujemo funkciju MDS () ili ENCRYPT ().Te funkcije su detaljnije objanjene u poglavlju 8",Upotreba MySQL-ovih ugraenih funkcija u komandi SELECT".
Drugi savet l
Drugi saveti
Pre nego to MySQL-u prosledite bilo koji podatak k?ji je kor~snik une.o: treb.al.o b1
dn klijentska aplikacija izvri odreene provere. Kako cete to tacno obav1t1, zav1s1 od .
razvojne platforme s kojom radite, ali pogledajmo primer koji objanjava zbog ega b1
ttd)nlo da proveravate ulazne podatke.
v
.
v
.
Problem se moe pojaviti ak i pri neemu tako jednostavnom kao sto je unosenje
1w(Ijcg imena i prezimena- npr. Patrick O'Leary- u vau aplikaciju. ~o te po?atke
pmslcdite direktno MySQL-u, problem e nastati zbog apostrofa u prez1menu O Leary.
u zlonamernijem kontekstu, mogu se pojaviti korisnici koji pokuavaju da unesu
MySQL-ove komande putem korisnikog interfejsa vae aplikacije ili Web obrazaca.
Postupak kojim ete proveriti prihvatljivost ulaznih podataka zavisi od programskog
.JL':nb na kojem radite, a u MySQL-ovoj dokumentaciji ete nai nekoliko optih
pn:poruka za veliki broj programskih jezika.
Razmotrili smo sistem prava pristupa, obradili korisnike naloge, opisali datoteke u
sistemu datoteka i ukratko pomenuli filtriranje ulaznih podataka. Ako vas brine zatita
vae mree (to bi verovatno trebalo da vas brine im imate bilo kakvu vezu sa spoljnim svetom), MySQL omoguava da se prenoenje podataka zatiti pomou protokola
SSL. Trebalo bi da razmotrite i fiziku zatitu ureaja.
zatita instalacije
Opta preporuka glasi: ako ste se ve potrudili da paljivo podesite korisnike naloge u
MySQL-u i u operativnom sistemu, pa ak i zahtevate da se korisnici prijavljuju
putem SSL veza, najbolje je i da fiziki zatitite instalaciju. Ako postoji mogunost da
neko obori server zato to se sapleo o njegov kabi za napajanje, ili ako neko moe da
ukrade podatke tako to odnese ceo raunar, imate ozbiljan problem. Fizika zatita se
esto zaboravlja, naroito u malim i srednjim kompanijama.
Moda manje iznenauje kada je u pitanju Windows, ali ak i inae bezbedni Unix/
Linux sistemi postaju ranjivi kada se zanemari fizika zatita. Na primer, na Linuxu je
postupak izmene lozinke korisnikog naloga root trivijalno jednostavan kada imate
fiziki pristup raunaru. Naravno, kada neko podacima moe da pristupa kao korisnik
root, moe da menja koje god hoe podatke u MySQL-ovim bazama podataka .
:ICI
~OG
Saetak
e) db
d) tables_priv
3. Ako MySQL pronae u tabeli user vie redova koji sadre isto ime korisnika,
koji red uzima za proveru identiteta korisnika?
a) Red koji sadri
b) Red koji sadri
raunara.
ete
dodeliti prava
FILE, PROCESS
pomou
funkcija
a)
d)
li Sl' r
utvruje
da lije korisniku
lozinku.
FILE
b) PROCESS
ogranienim
pravima
d) Ni a) ni b)
Vebe
Pomou
Odgovori
Pitanja
l. d
Pitanja
tanu
d) Nijedno od prethodnog.
sledeih prava verovatno ne bi trebalo da dodeljujete korisnicima?
2. a
b) db
e) co lumns_priv
ime raunara .
najneodreenije ime raunara.
4. Koja od
WITH
GRANT OPTION.
N e zanemarujte
najodreenije
Bezbednosne preporuke
Obavezno zadajte lozinku za MySQL-ov nalog root.
Izbriite anonimne naloge; oni omoguavaju pristup neovlaenim korisnicima
i mogu da spree pristup regularnim korisnicima.
a) user
b) host
utvruje
3. a
4. d
S. a
16
U sledee m poglavlju
U poglavlju16",Replikovanje baze podataka", saznaete kako se dva servera ba~a .
podataka mogu podesiti da rade sa istim podacima. Time se rasporeuje opterecenJe,
poveava robusnost sistema i olakava izrada rezervnih kopija podataka.
MOGUNOSTI
Principi replikovanja
Replikovanje se moe odvijati u vie oblika. U MySQL se koristi usmerena veza glavni-zavisni server.Jedan od servera je glavni (engl. master).Jedan ili vie servera tretiraju sc
kao zavisni (engl. slaves) od odreenog glavnog servera. Glavni server odreuje koji sc
podaci uvaju u sistemu, dok zavisni serveri pokuavaju da preslikaju njegov sadr,j.
IV
Ako su vam zaista neophodne dve verzije MySQL-a u istom sistemu, na sJede oj
adresi nai ete dokumentaciju s matricom verzija glavnih i zavisnih servera koje
mogu raditi zajedno:
www.mysql.com/doc/en/Replication_Implementation.html
U veini sistema u kojima se primenjuje replikovanje koristi se vie raunara povezanih u jednu internu mreu. Ako imate raun are povezane putem javnog Interneta,
paljivo razmotrite bezbednosne mere. Za poetak, obavezno proverite da li je TCP
prikljuak koji ste odredili za MySQL dostupan kroz zatitni zid svim raunarima koji
treba da komuniciraju sa serverom (podrazumevani broj TCP prikljuka za MySQL
server je 3306) .
Pod pretpostavkom da na svojim raunarima imate noviju verziju MySQL-a i
jednu ili vie baza podataka koje elite da replikujete, naredni koraci su obavezni da
biste napravili sistem s jednim glavnim serverom i jednim ili vie zavisnih servera.
(U ovom primeru koristi se baza podataka logs. Izmenite komandu tako da odgovara imenu vae baze podataka i, razume se, obavezno odaberite bezbedniju lozinku .)
Poto zavrite kopiranje poetnih podataka s glavnog servera na zavisni server,
korisnikom nalogu za replikovanje vie nee biti potrebna tako velika ovlaenja. Ako
zavisne servere punite iz rezervne kopije ili nameravate da smanjite ovlaenja korisnikog naloga za replikovanje nakon zavretka poetnog kopiranja, tom nalogu je
dovoljno samo pravo replikovanja. Naredni upit pravi korisniki nalog ije je ime
replication i koji ima pravo da uspostavlja vezu s glavnim serverom sa svakog zavisnog
servera (kao i sa svakog drugog raunara):
grant replication slave on logs.* to replication"%" identifi e d by
'password' ;
' l .it
rUyli:tVIJC
l0
Na glavnom serveru mora biti ukljueno beleenje izmena u dnevnik. Ako ste proitali
uputstva za instaliranje MySQL-a iz ove knjige, verovatno st.e ve ukljuili dnevnik .
izmena jer on slui i za druge svrhe osim replikovanja. Da b1ste provenli da li Je ukljueno beleenje izmena u dnevnik, moete izdati komandu SHOW VARIABLES. Dovoljno
je da zadate
show variables;
da biste prikazali vrednosti svih serverskih promenljivih, ali za skraeni rezultat zadajte
sledee :
Taan postupak kojim ete obaviti navedene poslove moe s.e malo razli~ovati
u zavisnosti od toga da li koristite MyiSAM ili InnoDB tabele 1 od toga kohko vam
.Jl! neprijatna pomisao da ete za odreeno vreme morati da zabranite pristup bazi
podataka.
Za My ISAM tabele, kopiju tekueg stanja svakog zavisnog servera moete napraviti
nakon njegovog pokretanja. Pogledajte odeljak "Pokretanje zavisnih servera", u
nastavku ovog poglavlja. Meutim, ova metoda nije posebno efikasna, naroito kad
imate veliku koliinu podataka i veliki broj zavisnih servera. Komanda LOAD DATA FROM
MASTER izdata sa svakog zavisnog servera zakljuae podatke na glavnom serveru do
zavretka kopiranja. Baze podataka e biti zakljuane znatno krae vreme ako kopiju
tekueg stanja napravite runo pomou komandi operativnog sistema. To vam takoe
omoguava da istom kopijom tekueg stanja glavnog servera inicijalizujete koliko god
vam zavisnih servera treba, ime skrauj ete interval u kojem je server zakljuan.
Za InnoDB tabele ne moete izdati komandu LOAD DATA FROM MASTER. Kopiju
stanja morate napraviti runo pomou komandi operativnog sistema ili nabavite
softver i opremu koji omoguavaju izradu kopije podataka dok se server koristi .
Ako kopiju tekueg stanja servera pravite runo, pomou komandi operativnog
sistema, morate se uveriti da su podaci meusobno usklaeni i aurni, tako to ete
izdati sledeu komandu:
flush tables with read lock;
Time ete zakljuati tabel u i spreiti upisivanje izme na dok je ne oslobodite.
Ime tekue datoteke dnevnika i pomak od njenog poetka moete dobiti pomou
sledee komande:
show master status;
Trebalo bi da dobijete rezultate nalik na
sledee:
+-------------------+----------+---- - ---------+------------------+
l File
l Position l Binlog_do_db l Binlog_ignore_db l
+-------------------+----------+--------------+------------------+
l server-bin.000007 l
211 l
+-------------------+----------+--------------+------------------+
Zapiite podatke iz prve kolone (ime datoteke dnevnika izmena) i iz druge kolone
(pomak od poetka te datoteke). Ako nema podataka, umesto imena datoteke zadajte
prazan znakovni niz, a vrednost pomaka treba da bude 4.
Da biste napravili kopiju tekueg stanja My ISAM tabela, pomou neke alatke za
arhiviranje datoteka kopirajte sadraj direktorijuma u kojem se nalaze datoteke tabela.
Na Unixu, zadajte neto nalik na sledee da biste napravili kopiju tekueg stanja baze
podataka logs:
tar -cvf /tmp/snapshot.tar /path/mysql/data/logs
Na Windowsu, upotrebite WinZip ili neku slinu alatku da biste napravili kopiju
sadraja direktorij uma C: \mysql\data \lo gs.
Kada zavrite kopiranje, moete ponovo dozvoliti upisivanje u bazu podataka ako
izdate sledeu komandu:
unlock tables;
214
Sloenije topologlj
Tabela employee koju koristimo u celoj knjizi (kao i veina tabela koje autori koriste u svojim projektima) tipa je InnoDB.Ako imate (komercijalni) softver za kopiranje
InnoDB tabela dok se koriste, onje savren za ovu namenu. Moe se nabaviti od firme
Innobase Oy na adresi
www.innodb.com/hotbackup.html
Ako nemate takvu alatku, najbolje reenje je da ispraznite bafere baze podataka i da
ispraznite njene tabele pomou narednih komandi. Prvo zadajte komandu
flush tables with read lock;
a zatim prikaite i zapiite podatke o datoteci dnevnika izmena i pomaku u njoj (na isti
nain kao za MyiSAM tabele):
Sloenije topologije
Najea
216
Slika 16.1
Pitanja
B udunost
Imajui
replikovanja
U .datoteci opcija P?stoji nekoliko parametara koji se tiu replikovanja ali zasad
nemaJumkakvog UtiCaJa. To su opcije za podeavanje SSL veza izmeu glavnog servera
I zav1smh se~.era . Ukoliko podatke replikujete putem javne mree, postupak e tako
biti bezbed~IJI. Ako vam tre~aju zatiene veze, zasad je jedino reenje da nabavite
odgovaraJUCI proiZvod, kao sto je Stunnel.
Saetak
Repl~kovanje nije pogodno za. sve situacije, ali ako imate optereenu aplikaciju s
V~SOkJm vodnosom ,Izmeu broja operacija itanja j upisivanja podataka, to moe
b1t1 odhcna mogucnost da obezbedite skalabilnost aplikacije.
Imajte u vidu da se izmene ne izvravaju na zavisnim serverima u isto vreme.
Svaka kopija tabele mora prelaziti iz jednog usklaenog stanja u drugo, ali uita
vanJe podataka sa razliitih servera moe dati zastarele rezultate dok se zavisni
serveri ne auriraju.
Najkorisnije komande koje se odnose na replikovanje su START SLAVE LOAD
TABLE imetabele FROM MASTER,LOAD DATA FROM MASTER,SHOW
TUS, SHOW SLAVE STATUS i SHOW SLAVE HOSTS.
MAS~ER
STA-
Pitanja
l. Na MySQL serveru replikovanje se moe upotrebiti za
218
2. Datoteka dnevnika
VI
a) uvek postoji
b) korisna je za replikovanje i restauriranje podataka iz rezervnih kopija
e) zapravo je preimenovana SQL datoteka slike stanja
d) sve prethodno navedeno
3. Operacije itanja i upisivanja podataka
obino
se odvijaju
a)
itanje
b)
e)
ita~e
itanje
Optimizovanje MySQL-a
znai
Odgovori
Pitanja
l. e
2. b
3. b
4. e
da
Optimizovanje upita
17
Optimizovanje MySQL servera
RAZMOTRIEMO
MOGUNOSTI
OVOM POGLAVLJU
NEKOLIKO
ubrzavanja
MySQL servera. Podeavanje servera je opsena tema i ima izvesnih slinosti sa ezoterinom umetnou. Naa namera je da vam u ovom poglavlju predstavim o osnove
podeavanja servera. Obradiemo sledee teme:
vee
brzine rada
inilaca
Prevoenje
poveavanja
brzine rada
U poglavlju l, "Instaliranje MySQL-a", opisali smo instaliranje samo iz binarnih verzija instalacionih datoteka (pomou alatke RPM na Unixu). Ako tek uite upotrebu
MySQL-a, to je svakako najjednostavniji nain, naroito ako nemate iskustva s prevoenjem softvera koji imate na svom raunaru, kao to je sluaj s veinom korisnika
Windowsa.
Performanse svog servera moete poboljati ako preuzmete izvornu verziju koda i
sami ga prevedete. Ukoliko imate raunar s procesorom Pentium koji radi pod operativnim sistemom Linux, postii ete primetno poboljanje performansi ako izvorni
1.22
t'oaesavanJe parametar.
kod MySQL-a prevedete pomou prevodioca pgcc, koji optimizuje rezultujui kod
samo za procesor Pentium. (Tako dobijena izvrna datoteka nije kompatibilna sa
AMD-ovim procesorima, zato je binarna verzija koju preuzimate s MySQL-ove Web
lokacije prevedena pomou prevodioca gcc.) Autor MySQL-a, firma AB, tvrdi da server moete ubrzati od 10% do 30% ako sami prevedete kod pomou odgovarajueg
prevodioca i pravilno podeenih opcija- vie informacija o tome nai ete u MySQL-ovoj dokumentaciji.
Drugo poboljanje u poreenju s MySQL-ovom gotovom izvrnom datotekom
jeste da prevedete MySQL s podrkom samo za skup (ili skupove) znakova koji nameravate da koristite. U binarne datoteke koje preuzimate s Web lokacije ugraena je
podrka za sve postojee skupove znakova. (Vie informacija o skupovima znakova
nai ete u poglavlju 12",Podeavanje MySQL-a" .)
MySQL-ova dokumentacija sadri predloge o optimizovanju binarnih datoteka
koje korisnici sami prevode za razne operativne sisteme. Osim toga, u diskusionim
grupama na Internetu posveenim MySQL-u moete nai miljenja i savete u vezi
s mnogim problemima specifinim za odreene operativne sisteme i prevodioce koda.
Arhive se nalaze na adresi
http://lists.mysql.com
Ukoliko elite da se pridruite diskusijama o prevodiocima, potraite forum na adresi
www.lukelaura.com
videete pomou
sle-
dee
show status;
Druga korisna alatka koja omoguava da vidite ta se dogaa na serveru jeste Perl
skript mytop, iji je autor Jeremy Zawodny.
Ta alatka deluje kao ekvivalent Unixove komande top i prikazuje aktivne procese,
~ta nje procesa, trajanje itd. Osim toga, ta alatka omoguava da prikaete detalje
MySQL-ovog procesa i vidite koji se upit izvrava.
Skript moete preuzeti sa adrese
http://jeremy.zawodny.com/mysql/mytop
Sve navedene alatke omoguavaju da evidentirate izmene koje ste uneli i uinke
koj e one imaju na sistem.
..
~rrv
11
Datoteka opcija my.cnf sadri toliko veliki broj opcija da ete se moda pitati
odakle da ponete. Uz veinu verzija MySQL-a dobijate i prime re datoteka my. en t ,
koje se obino nalaze u direktorijumu support-files instalacije. U tom direktorijumu
nai ete sledea etiri predloga za datoteku my. cnf: my-huge. cnf, my-large. cnf,
my-medium. cnf i my- small. cnf. Izaberite jednu od njih kao poetnu datoteku op cijn
za svoj sistem.
Najvaniji parametri koje treba da podesite jesu oni koji odreuju kako MySQL
troi memoriju. Za svaki server baza podataka vai pravilo "to vie memorije, to
bolje", ali je vano i da ta memorija bude na raspolaganju serveru baze podataka i da
se pravilno raspodeljuje izmeu njegovih procesa.
MySQL odrava grupu internih bafera i ostava. Moete podesiti koliinu memorije
koja se odvaja za tu namenu. Dva najvanija parametra koja treba da podesite su
key_buffer_size i table_cache. Poto te bafere dele sve niti koje rade na serveru,
njihovo podeavanje ima veoma veliki uticaj na performanse servera.
U baferu nazvanom bafer za kljueve (engl. key buffer) uvaju se blokovi MyiSAM
indeksa. Kada aplikacija zatrai odreeni blok iz datoteke indeksa, on se uitava u taj
bafer. Kad god se izvrava neki upit, ako se odgovarajuu blok indeksa nalazi u baferu,
podaci se uitavaju iz njega. U suprotnom, blok indeksa mora da se uita iz datoteke
na disku u bafer za kljueve, to je, razume se, sporije. Za bafer kljueva vai pravilo da
to je vei, to bolje slui svojoj svrsi.
Kada razmatrate vrednost koju ete dodeliti parametru key_bu ff er_ s i ze, treba da
uzmete u obzir ukupnu koliinu memorije s kojom raspolaete, da li se raunar koristi
iskljuivo kao MySQL server ili slui i za druge poslove, a vana je i veliina datoteka
indeksa (tj. ukupna veliina .MYI datoteka).Jeremy Zawodny, poznati strunjak koji
odrava servere kompanije Yahoo!, preporuuje da na raunaru koji radi iskljuivo kao
MySQL server,parametru key_buffer_size dodelite vrednost u opsegu izmeu 20% i
50% ukupne koliine memorije na raunaru . Ako je u pitanju deljen raunar, jasno je da
vrednost tog parametra treba da bude manja. Ukoliko podaci vaih indeksa zauzimaju
samo 20 MB, bilo bi besmisleno da veliinu bafera za kljueve podesite na 128 MB.
Imajte u vidu i to da se bafer za kljueve koristi iskljuivo za MyiSAM tabele. Za
druge tipove tabela postoje drugi parametri koje treba podesiti. Nema svrhe da znatno
poveate bafer za kljueve ako, na primer, radite iskljuivo sa InnoDB tabelama. U
tom sluaju vaniji je parametar innodb_buffer_pool_size. U baferima za InnoDB
uvaju se i podaci indeksa i podaci tabela. (Vie informacija o podeavanju za rad sa
InnoDB tabelama nai ete u poglavlju 12 i u MySQL-ovoj dokumentaciji.)
Drugi zaista vaan parametar je ostava za tabele (engl. table cache) kojom se upravlja
pomou opcije table_cache.Vrednost te opcije odreuje maksimalan broj tabela koje
mogu biti otvorene u isto vreme. Kod My ISAM tabela, svaka tabela i svaki indeks su
zasebne datoteke u operativnom sistemu. Budui da je otvaranje i zatvaranje dato tc b
spora operacija, te datoteke ostaju otvorene dok ne budu izriito zatvorene, server spu
ten, ili dok ukupan broj otvorenih tabela ne premai vrednost parametra table_cache.
Podeavanje drugih
inilaca
Na kraju, jo nekoliko saveta koji vam mogu pomoi pri podeavanju fizike konfiguracije sistema.
to se operativnog sistema tie, MySQL preporuuje Solaris kada elite da izvuete
maksimum od raunara s vie procesora. Iako postoje verzije MySQL-a za razne operativne sisteme, razvoj i poetno testiranje obavljaju se na Solarisu, zahvaljujui emu
bi to po logici stvari trebalo da bude najbolje optimizovana platforma.
Ukoliko moete da nabavite vie diskova, poboljaete performanse ako baze podataka rasporedite na razliite fizike diskove. U tom sluaju moete koristiti i RAID
konfiguracije - RAID O poboljava performanse pri itanju i pisanju, a RAID l ili 5
poboljavaju performanse pri itanju. Osim toga, SCSI diskovi obezbeuju bolje perfoJillanse od IDE diskova.
Moete razmotriti i upotrebu urnalskog sistema datoteka (engl.journalingjile
1ystc'111), kao to je Reiserfs ili XFS. Tako moete jo vie poboljati performanse.
Rnume se, znaajan boljitak moe se postii povezivanjem klijenata i servera preko
bt7C mree, to takoe vai i za glavne i zavisne servere u replikovanju.
Saetak
Budui
kii_JI~ll,
illi
..
Pitanja
l. Parametar koji odreuje koliko
indeksa Inn oD B tabela je
a) key_buffer_size
b) innodb_buffer_pool_size
e) innodb_key_buffer_size
d) read_buffer_size
2. Parametar koji odreuje koliko
Inn oD B tabela je
a) key_buffer_size
b) innodb_buffer_pool_size
e) innodb_key_buffer_size
d) read buffer size
3. Parametar koji odreuje koliko
My ISAM tabela je
a) key_buffer_size
b) table cache
e) innodb_key_buffer_size
d) read_buffer_size
18
a) key_buffer_size
b) table_cache
e) innodb_key_buffer_size
d) read_buffer_size
S. Vrednost parametra read_buffer_size ne bi trebalo da bude previsoka jer
a) ako vei broj niti sekvencijalno pretrauje tabele, imaete problem
b) uvek se moe dodati nov indeks, pa zato MySQL nee nikad morati da
sekvencijalno pretrauje tabele
e) time se rasipa prostor na disku
d) nijedno od prethodnog
Vebe
Eksperimentiite pomou programa za merenje performansi dok parametre navedene
u ovom poglavlju podeavate na razliite vrednosti. Moete li pronai optimalnu
vrednost svakog od tih parametara za svoj sistem?
Odgovori
Pitanja
l. b
2. b
3. d
4. a
S. a
U sledeem poglavlju
U sled eem poglavlju," Optimizovanje baze podataka", razmotriemo optirnizovanje
l' ll1 C baze podataka, indeksa i pojedinih tabela.
..
Nemam dovoljno indeksa. Uzrok broj jedan loih performansi jeste upotreba tabela
kojima nije pridruen nijedan indeks ili nema indeksa za kolone koje pretraujete.To ne znai da treba imati to vei broj indeksa jer preterivanje u suprotnom
smeru moe biti uzrok sledeeg problema na listi.
Imam previe indeksa. Da bi se aurirao veliki broj indeksa, svaki put se u t:~ belu
upie nov red ili aurira postojei, a to potraje. Kada uitavate podatke, indeksi '> ll
veoma korisni. Kada upisujete nove redove, odnosno aurirate ili brit:lc pm111
jee redove, indeksi postaju problem. Kad god aurira te neki podatak, 11101 .q11 ~ ~
aurirati i indeksi, to produava obradu i poveava opteree nj e si slCill;l
ll
lnd~ksiranje
Dodeljujem prava pojedinano za tabele i kolone tabela. Ako prava dodeljujete pojedinano za tabele ili kolone bilo kog resursa, kad god korisnik poalje upit na izvravanje, MySQL mora da utvruje koja su sve prava za tabele i kolone tabela zadata.
Uk~hko .ste
Koristite zapise fiksne duine gde god je mogue. Ako su svi redovi tabele jednake duine, MySQL bre pristupa redovima u sredini tabele. Da bi tabela imala
redove fiksne duine, tipovi podataka u svim kolonama moraju biti fiksne duine.
To znai da ne sme biti kolona tipa VARCHAR, TEXT, niti BLOB.
Ako vam je neophodan tip TEXT i BLOB, moda biste mogli da denormalizujete
emu tabele tako da polja tipa TEXT ili BLOB izdvojite u zasebnu tabelu.
Ukoliko imate iskljuivo kolone tipa VARCHAR, razmislite o tome da ih zamenite
kolonama tipa CHAR. To je kompromis,jer podaci tipa CHAR zauzimaju vie mesta
na disku, to je u suprotnosti s prvom preporukom na ovoj listi.
Gde god je mogue, deklariite kolone kao NOT NULL. Ako je priroda vaih
podataka takva da su vrednosti NULL sasvim logine i prihvatljive, slobodno ih
koristite. Meutim, imajte u vidu da zbog toga gubite malo brzine i prostora,
pa zato zadajte odredbu NOT NULL gde god je mogue.
Birajte tip tabela za svaku tabel u pojedinano. Tabele koje ne podravaju transakcije (na primer, My ISAM) manje optereuju sistem i zato su bre od tabela koje
podravaju transakcije (InnoDB i BDB). MySQL podrava meanje vie tipova
tabela u istoj bazi podataka. Izaberite najbri tip koji je pogodan za odreeni
posao. (Vie informacija o pojedinim tipovima tabela nai ete u poglavlju 9,
pratili gr:divo i vebe iz ove knjige, trebalo bi da imate bazu pod.lt.lka kn 1,1
pnmarne kljuceve. To znai da imate barem po jedan indeks za svaku tnbdll
~~r MySQL automatski pravi indekse za kolone koje deklariete kao PRIMARY KEY
1h UNIQUE.
,
~o pokuavat.e da optimizujete postojeu bazu podataka, korisno je ispitati da Ji ll'
u nJ. OJ vdefimsan bilo kakav mdeks. Izostavljanje indeksa je esta greka pri projekta
vanJU. seme baze podataka. SQL-ova komanda DESCRIBE prikazuje koji sve indeksi
postoje za odreenu tabelu.
Dakle, ta je indeks i emu slui?
Indeks je slian referentnoj tabeli po tome to omoguava da se brzo pronae odrce.m red ~ tabel1. Ako napravite indeks za kolonu X, pronalaenje traene vrednosti u
tOj ..kolo~l zna.tno je bre pomou indeksa. Indeks pokazuje gde se u tabeli nalazi red
kOJI sadrz1 tr~ze~u vredn~st, to omoguava da se direktno pree na taj red.
. Ako tabeh mJe pndruzen nijedan indeks, MySQL mora da pretrauje jedan po
Jedan red tabele dok ne pronae redove koje ste zahtevali. Zamislite da morate da
pronae:e odree~u ten~u. u ovoj knjizi tako to ete poeti od prve stranice i itati
svaku ree na sv~kOJ stran1e1. ~na tn o je bre da u indeksu knjige potraite temu koja vas
zamma 1 da zat1m preete direktno na stranicu koja vam treba.
U MySQL-u se po.daci indeksa uvaju u obliku b-stabala (binarna stabla); to su
strukture podataka koje se vrlo brzo pretrauju.
. I~dek~i mogu o?~hvatati je~nu kolonu ili vie njih (isto kao kljuevi tabela). Pri
IzvrsavanJU up1ta, b1ce upotrebljen mdeks ukoliko se pretrauje jedno od sledeih:
~adrz1
Struktura baze podataka nije optimalna. Postoje naini da se struktura baze podataka
projektuje tako da se upiti bre izvravaju.
U naredna dva odeljka razmotriemo strukture baze podataka i indekse koji omoguavaju ubrzavanje rada s bazom podataka.
Uvek upotrebite najmanji tip podataka koji je dovoljan za podatke s kojima ete
raditi. Na primer, ako u koloni tabele uvate samo brojeve od 1 do 10, nemojte
zadati tip INT, ve tip TINYINT. to su krai redovi i manje tabele, to e se one
bre pretraivati. to su podaci manji, vie se redova moe keirati u memoriju.
..
kolon~
emplo~ee.ass1gnment
date)
Ko.lon~ ili grupa kolo.na koja je deo viekolonskog indeksa, pod uslovom da je to
levz kr~J grupe. mdeks1ramh kolona - na primer, ako za pomenutu tabelu assignment Imamo mdeks za kolone (clientiD, employeeiD, workdate) on e biti
'
upotrebljen u upitima sledee vrste:
SELECT ... WHERE clientiD=x
SELECT ... WHERE clientiD=x AND employeeiD=y
u cilju optimizovanja
sledei:
Sutina cele .~rie je u sledeem: ako predviate da e se izvravati veliki broj upita
kolonama 1h grupama kolona koje ne ispunjavaju navedene uslove, trebalo bi da
Izdate komandu CREATE INDEX da biste napravili odgovarajui indeks. Imajte u vidu
~ad
- r .. - - - .J- ----
---~-H-
Pitanja
da MySQL moe da koristi samo po jedan indeks po tabeli u upitu. Nije mogue
automatsko kombinovanje vie indeksa.
Ovo pitanje emo detaljnije razmotriti u poglavlju 19",0ptimizovanje upita",
kada budemo doli do komande EXPLAIN.
OPTIMIZE TABLE .
Pitanja
Saetak
Strukturu baze podataka moete optimizovati tako to ete odabrati tipove podataka manje veliine i fiksne duine, definisati odgovarajue indekse i koristiti
odgovarajue tipove tabela.
Indeksi omoguavaju brzo pronalaenje zapisa traenih na osnovu vrednosti u
indeksiranim kolonama.
Indeks e biti upotrebljen u upitu kada se u njemu referencira indeksirana kolona
ili kolone, ili levi kraj grupe indeksiranih kolona.
Komanda OPTIMIZE TABLE imetabele obavlja za tabele operaciju slinu defragmentiranju vrstog diska.
DELETE
nad tabelom
- .~
...
~~ ---,J -----
1"" __ _ ...........
Vebe
U kojem e od sledeih upita u bazi podataka employee biti upotrebljeni indeksi?
(Potraite u poglavlju 4, "Pravljenje baza podataka, tabela i indeksa", tanu strukturu
baze podataka. Ili, ako ste je instalirali na svoj raunar, pogledajte pomou komande
describe koje su sve kolone indeksirane.)
a)
select *
19
..
Optimizovanje upita
from employee
where departmentiD=128;
b)
select employeeiD
from assignment
where clientiD=l;
e)
select skill, count(skill)
from employeeSkills
group by skill;
esto
Odgovori
Pitanja
OMOGUAVA
YSQL
DA ANALIZIRATE upit da biste saznali za koje se vreme
izvri i kako se tano izvrava nad sadrajem baze podataka. Na osnovu tih podataka
i poznavanja naina na koji MySQL pokuava da optimizuje upite, ponekad moete
da poboljate performanse upita. U ovom poglavlju razmotriemo sledee teme:
l. b
MySQL-ov
2. e
naina
3. e
4. b
S. d
Da biste optimizovali odreenu aplikaciju, morate najpre utvrditi koji njeni delovi imaju
najvei udeo u ukupnom vremenu izvravanja. To moete obaviti na nekoliko naina:
Vebe
U sledeem poglavlju
U s ledeem (i poslednjem) poglavlju, "Optimizovanje upita", razmotriemo kako
moete utvrditi da li se odreeni upit izvrava brzo ili sporo, i zbog ega, kao i to kako
reiti problem.
Poto identifikujete spori upit, pomou komande EXPLAIN moete saznati kako ga
MySQL tano izvrava da biste zatim pokuali da ga optimizujete.
Najee nije potrebno da ubrzate ba sve upite koji se koriste u aplikaciji . Obino
samo manji deo koda oduzima najvei deo ukupnog vremena izvravanja. Ukoliko
va sistem nije izuzetno optereen, besmisleno je da gubite vreme pokuavajui da
ubrzate delove aplikacije iji je udeo u ukupnom vremenu relativno mali.
sledee:
+-------------------------+
l benchmark (1000000, 6*9) l
+-------- -----------------+
o l
+-------------------------+
1
row in set
(0.25
sec)
Funkcija prihvata dva parametra: koliko puta treba izraunati vrednost izraza
(u ovom primeru, milion puta) i izraz koji se izraunava (u ovom primeru, est puta
deve0.
naina
Komanda EXPLAIN nalae MySQL-u da "objasni" kako namerava da izvri upit. Kao
jednostavan primer, moete zadati sledee:
..
Budui da nas pri merenju performansi ne zanima rezultat upita SELECT, funkclJa
uvek vraa rezultat nula. Pri merenju nas zaista zanima za koje vreme se
upit izvrio. Iz navedenog primera rezultata vidi se daje izraunavanje proizvoda 6 x 9
milion puta na mom raunaru trajalo etvrtinu sekunde.
Funkciji BENCHMARK () moete proslediti i tekst upita, na primer:
BENCHMARK ()
selec t benchmark(lOOOOOOO,
'select employee.name, department.name
from employee, department
where employee.departmentiD=department.departmentiD');
Beleenje sporih upita u dnevnik moete ukljuiti pomou opcije --log- slow
-queries=imedatoteke, koju zadate kada pokreete MySQL, ili u datoteci opcija.
Ako ukljuite i opciju --log-long-format, bie evidentirani i svi upiti pri ijem sc
izvravanju ne koristi nijedan indeks. To vam moe pomoi da lake utvrdite emu
treba da f>osvetite najvie panje pri optimizovanju.
Zadavanjem vrednosti promenljivoj long_query_time odreujete ta je za vas
spor upit. Moete je zadati u konfiguracionoj datoteci ili pomou komande SET.
Vrednost te promenljive izraava se u sekundama.
Dnevnik sporih upita moete itati neposredno jer je to obina tekstualna datoteka.
Moda ete smatrati korisnijim saet spisak upita koji se sporo izvravaju. Takav spisak
moete prikazati pomou skripta mysqldumpslow (u direktorijumu scripts instalacije
MySQL-a). Poto je to skript napisan na jeziku Perl, ako koristite Windows, morate
prethodno instalirati Perl ukoliko gaj o nemate. (Preuzmite ga sa adrese www. activestate. com.)
Jedno od tekuih ogranienja MySQL-ajeste to da ne belei spore upite ije
izvravanje traje manje od sekunde. Na sistemima koji obrauju relativno veliki broj
jednostavnih upita, jedna sekunda "traje" veoma, veoma dugo. Administrator e
moda eleti da zna kojim je upitima potrebno vie od desetinke ili nekog drugog dela
sekunde. To e biti obezbeeno u jednoj od buduih verzija MySQL-a.
select benchmark(lOOOOOO,
naina
explain
select e.name, d.name
from employee e, department d
where e.departmentiD = d .departmentiD;
Kao to vidite, ispred jednog sasvim obinog upita samo smo dodali re EXPLAIN.
Zbog toga se upit nee izvriti,jedino e se prikazati podaci o tome kako MySQL planira da izvri upit. Trebalo bi da se prikau rezultati nalik na sledee:
... --- +------------ +-- ---- -+------- -+--------------- +-------- -+-------- -+--------------- -+------ +------ -+
1 id 1 select_type 1 table l type
l possible_keys l key
l key_len l ref
l rows l Extra l
+---- +------------- +------- +------- -+-------------- -+--- ----- -+- -------- +--------------- -+------ +------ -+
l l l SIMPLE
l e
l ALL
l NULL
l NULL
l
NULL l NULL
l
5 l
l
l d
l eq_ref l PRI MARY
l PRIMARY l
4 l e. department ID l
l l
l
l 1 l SIMPLE
+--- -+------ ------ ------- -+--- ---- -+-------------- -+-------- -+--------- +--------------- -+----- -+------ -+
Pomou dnevnika sporih upita moete utvrditi koji se upiti presporo IzvrsavaJU. S~nu
ddiniete ta je "sporo", ali taj parametar morate izraziti u sekundama, kao celobroJnU
vrednost.
ta sve ovo tano znai? Uoljivo je da se u skupu rezultata pojavljuje po jedan red
za svaku tabel u u upitu. Redosled redova je jednak redosledu kojim e tabele biti spo
jene u upitu.
y-'u'--uv
id Redni broj. Ako jedan upit sadri vie komand1 !.J EI .EC" I' - 11,1 JliiiiH:I, bd.1
je u upit ugraen podupit- svaka komanda SELECT dobtj.l SV<~J rLdni broj .
select type Vrsta komande SELECT koja se izvrava. U ve ini s lu ajeva, ova
kolona ~adrae re SIMPLE, kao u prethodnom primeru, to zna i daje u pitanju
sasvim obian upit SELECT. Ako imate podupite, spoljni upit e biti oznaen
reju PRIMARY a unutranji upiti bie oznaeni reima SUBSELECT ili DEPENDENT
SUBSELECT u sluaju koreliranih upita.
table Ime tabele na koju se red odnosi.
type Ovo je najvanija kolona pri optimizovanju i prikazuje na koji e nain
tabela biti spojena s drugim tabelama u upitu.
possible_keys Ova kolona pokazuje koji bi se indeksi mogli upotrebiti u
upitu. Ako nema nijednog upotrebljivog indeksa, u ovoj koloni prikazuje se re
ref Iz tabele e biti uitani svi redovi koji sadre vrednosti jednake vrednostima u indeksu. To je prva slabija opcija od eq_ref i predstavlja situaciju u kojoj
radite s kljuevima ije vrednosti nisu jedinstvene .
NULL.
key Ova kolona pokazuje koji je indeks izabran za upit. Ako nije izabran nijedan, u koloni se prikazuje re NULL.
key len Duina indeksa koji je MySQL odluio da upotrebi.
ref Vrednost s kojom se poredi sadraj kolone kljua pri odluivanju koji se
redovi izdvajaju u skup rezultata upita.
rows Pro cena broja redova koje e MySQL morati da proita iz jedne tabele da
bi se dobio rezultat upita. Mnoenjem vrednosti broja redova moete utvrditi
koliko e redova biti uitano. Time dobijate red veliine brzine izvravanja upita.
Extra Ova kolona moe sadrati dodatne podatke. Na primer, komentar
using index zai da MySQL moe u potpunosti uitati rezultate upita iz jednog
od indeksa i nema potrebe da uitava podatke iz tabele.
Dakle, ta nam rezultati govore u ovom primeru?
Tip spoja ALL za tabelu employee znai da e biti pretraeni svi redovi te tabele.
Razume se, to e biti spora operacija ako tabela sadri veliku koliinu podataka. U
stvari, spoj tipa ALL je najgori mogui rezultat. Njega ete dobiti kad god tabela nema
nijedan indeks koji bi se mogao upotrebiti u upitu. Oigledna optimizac4ija u tom sluaju jeste da dodate odgovarajui indeks. To je objanjeno u nastavku ovog poglavlja.
U redu koji se odnosi na tabelu department stoji daje spoj tipa eq_ref, to znai da
e se iz tabele department uitati po jedan red za svaki red iz tabele employee. To je
jedan od najboljih tipova spojeva. Jedine bolje vrednosti u koloni type _su system i
cons t, to znai da u tabeli postoji samo jedan red koji odgovara uslov1ma up1ta l da
sc zato ta tabela moe tretirati u upitu kao konstanta. Tekui tip spoja u upitu prilino
nam odgovara.
a k
i od ref, a znai da
iz
index Ovo je bolje od tipa ALL, ali slabije od svih dosad navedenih tipova spojeva. Kada se prikae tip index, to znai da e biti pretraen ceo indeks. To je
bolje od pretraivanja cele tabele, ali daleko je od savrenog.
Pogledajmo vrednosti u kolonama possible_keys i key. Za tabelu department
prikazana je opcija PRI MARY i ime kolone primarnog kljua, to je kolona kljua koja
e biti upotrebljena. Red tabele employee sadri vrednost NULL u obe navedene
kolone, to znai da nema kljua koji se moe upotrebiti i zato nee biti upotrebljen
nijedan. To je jo jedna prilino jasna naznaka da tabeli treba dodati nov indeks!
Na osnovu tih podataka i pod pretpostavkom da e taj upit biti relativno esto
izvravan, pa bismo zbog toga eleli da bude bri, napraviemo sledei indeks:
create index ename_did on employee(name, departmentiD);
Ako ponovo izdamo komandu EXPLAIN, rezultati izgledaju ovako:
+--- -+--- --------- -+------ -+---- ---- +-------------- -+---------- -+- ------- -+--- ------------ -+----- --------- ---- -
l id l select_type l table l t ype
l possible_keys 1 key
l key_len l ref
1 rows 1 Extra
1
+--- ---- ---------- +----- --+-- -- --- ------ --------- -+-- -------- -+-------- - +------- ------- --+----- -+----- ------- -+
l
l
l
l
l
l
SIMPLE
SIMPLE
l
l
e
d
l
l
index
eq_ref
l
l
NULL
PRIMARY
l
l
ename_did
PRIMARY
l
l
85
4
1 NULL
1
l e.departmentiD l
S
l
l
l
Using index
l
l
+---- +---- -------- -+--- --- -+--- ---- -+---- ------- -- --+- ----- ---- -+------ -- -+--------------- -+- ---- -+----- ------- -+
2 rows in set (0. OO sec)
Promene su oigledne. U redu tabele employee sada stoji daje tip spoja index jer
postoji indeks koji se moe upotrebiti. Novi indeks je naveden kao mogu klju , ali
nee biti upotrebljen. U koloni Extra stoji da e za tu tabelu biti upotrebljen indeks
umesto same tabele, zahvaljujui emu bi trebalo da upit bude neto bri.
Najea upotreba komande EXPLAIN jeste za utvrivanje da li biste pomou bolje
osmiljenih indeksa mogli da ubrzate upite, ali otkriete da se to moe postii i na
druge naine.
MySOL-ov
ugraeni
18
Izrazi u odredbama WHERE optimizuju se na nain slian onome na koji mnogi prevodioci programskih jezika optimizuju izraze. Na primer, iz izraza se uklanjaju suvine
zagrade. To je jedan od razloga zbog kojih moete slobodno dodavati zagrade u tekst
upita da bi postao lake razumljiv.
Ako se potpun rezultat upita moe dobiti iz podataka sadranih u indeksima, iz
tabela se nee u itati nijedan red. Rezultat funkcije COUNT ( *} takoe se dobija bez
itanja i prebrojavanja redova tabele jer su podaci potrebni za tu namenu smeteni
odvojeno od tabele (u indeksu).
Budui da se u MySQL-ovoj dokumentaciji nalazi detaljan spisak svih optimizacija
koje MySQL obavlja, ovde ga nismo ponovili. Ali ak i taj spisak nije potpun. Ako vas
zanima kako radi optirnizator upita, moete itati njegov izvorni kod.
111
1 1 d orl
pomou
funkcije
BENCHMARK (}
Saetak
Otkrijte spore upite
Pitanja
TABLE
za obe tabele
STRAIGHT JOIN
240
Spisak termina
Vebe
Pogledajte
sledei
upit:
select department.name
from client, assignment, employee, department
where client.name='Telco Inc'
and client.clientiD = assignment.clientiD
and assignment.employeeiD = employee.employeeiD
and employee.departmentiD = department.departmentiD;
Pomou funkcije BENCHMARK vie puta izmerite vreme izvravanja ovog upita
korienih
alijas
atribut, obeleje
b-stablo
bafer za itanje
bafer za kljueve
bafer za sortiranje
bafer za zapise
blokiranje sledeeg
Pitanja
1. e
2. d
3. a
4. e
5. e
alias
attribrtle
b-tree
read bt!!Jer
key br"!!fer
sort br!ffer
record br!lfer
next key /ocking
kljua
itanje
Odgovori
u knjizi
sadraja tabele
sekvencijalnim
redosledom
datoteka slike sta~a
Dekartov proizvod
dnevnik greaka
dnevnik izmena
dnevnik sporih upita
dnevnik upita
fantomski podaci
funkcionalna
zavisnost
glavni server
jednakovredni spoj
jezik za definisanje
podataka
jezik za rad
s podacima
kandidati za kljueve
klju
table scan
dumpfile
Cartesian product
error log
binary log
slow query log
query log
phantom reads
functional
dependency
master
equijoin
Data Diftnition
Language, DDL
Data Manipulation
Language, DML
candidate keys
key
relevance value
nedelji vost
niti izvravanja
obeleje, atribut
ostava za tabele
otpornost sistema
na greke
podu pit
polje
ponititi
potvrditi
preklapanje izmeu
dva servera
"na vrue"
prenosni dnevnik
pretraiva~e
re/ay log
stemming
optereenja
red
sistem za upravljanje
relacionim bazama
podataka
slog, zapis
spoJ
spoljni klju
superklju
SVEUCIIlNA l<Nl\N\0\
Rl J
subquery
field
roll back
commit
fa ilo ver
od korena
full join
pun spoj,
unakrsni spoj
multimastering
rad sa vie glavnih
servera istovremeno
rasporeivanje
load balancing
column
correlated
storage engine
benchmarking
tup/es
stop words
atomicity
thread s
attribute
table cache
fau/t tolerance
KA
row
Relational Database
Management
System, RDBMS
record
join
foreign key
superkey
database schema
table
nested query
full join
record
slave
Indeks
Simboli
l (deljenje), operator, 110
Brojevi
1NF (prva normalna forma),
34-36
2NF (druga normalna forma),
36-37
3NF (trea normalna forma),
37-38
A
abs(), funkcija, 118
ACID
usklaenost,
transakcije,
149-150
activestate.com, Web lokacija, 235
adddate(),funkcija, 119
administriranje baze podataka
datoteke dnevnika, 183
MySQL server, pokretanje
i sputanje, 177-178
pranjenje ostava, 182-183
prikazivanje podataka o bazi,
178-180
prikazivanje podataka
o dodeljenim pravima, 181
prikazivanje podataka
o procesima, 181
prikazivanje podataka o tabelama,
181-182
prikazivanje statusa servera
i vrednosti serverskih
promenljivih, 180
skript mysqladmin,lista opcija,
184
unitavanje niti, 182
alijasi, komanda SELECT, 82-83
ALL, pravo, 160
ALL, rezervisana re, 102
ALTER TABLE, komanda, 56-57
ANALYZE TABLE, komanda, 230,
238
AND, operator, 112
anomalije
pri auriranju podataka, 34
pri brisanju podataka, 34
pri dodavanju podataka, 33
202-203
ansi, opcija, podeavanje
MySQL-a, 172
ANY, rezervisana re , 102
transakcija, 147
AVG ROW LENGTH, opcija,
optirnizovanje tabela, 51
avg(), funkcija, 122
auriranje redova tabela, 72-73
B
BACKUP TABLE, komanda, 194
bafer za itanje, 224
bafer za kljueve, definicija, 223
bafer za sortiranje, 224
baferi, 223
basedir, opcija, podeavanje
MySQL-a, 172
baze podataka
adtninistriranje
datoteke duevuika, 183
MySQL server, pokretmlje
i spuftmlje, 177-17 8
pra:bljetlje ostava, 182-183
prikazivmlje podataka o bazi,
178-180
prikazivmlje podataka o
dodeljeuim pravima, 181
prikazivmlje podataka o procesima
181
'
prikazivanje podataka o tabelama,
181-182
prikazivatlje statusa servera
i vreduosti serverskih
promeuljivih, 180
servers ke promeuljive, pode!avatlje,
182
skript mysqladmiu, lista opcija,
184
utli!tavarlje uiti, 182
biranje, 43
brisanje, 56
entiteti, definicija, 29
identifikatori
dozvoljeu broj zuakova, 43
rwvoduici, 43
rezervismJe reli, 43
indeksi
brismlje, 56
izrada, 55-56
194
komauda RESTORE TABLI'
194
.
mogubwsti, 187-188
pomo{u duevuika iz meua,
194-195
mi1o, 19 3-194
skript mysqldump, 188-192
skript mysqlhotcopy, 192- 193
tabele, proveravmlje i popravljmljc,
195-198
testirmlje rezervtle kopije, 195
zaklju{avatlje tabela, 18 8
izrada, komanda CREATE
DATABASE, 43
komanda ANALYZE TABLE
230
optimizovanje
iudeksi, 229-230
izbori pri projektovarlju, 228
komat~da OPTIMIZETABLE
230
preporuke, 227-228
principi projektovanja
auomalije, 33-34
twrmalizovatlje, 3 4-3 8
NULL vreduosti, 34
reduudmlttwst i gubljetlje
podataka, 33
vaua pitmya, 32
relacije
d~f/uiciia, 29
tipa ,Jeda tl prema jedau", 2 9
tipa .,jeda tl prema viJe", 2 9
tipa" vie prema vi!e 11, 2 9
rep likovanje
beziJedtlostle mere, 211
budt.tbwst, 216
d11evuik izmwa, 21 O
dodeljivatlje prava za, 211
kopije teku{eg stmya, pravljerye,
212-214
otpomost Ila gre!ke, 209
preklapatlje servera 11a vm{e, 217
pri11cipi, 209-21 O
provera glavtwg servera, 2 12
rasporeivatlje opterdetlja, 2 15
upotrebljive verz;;e MySQLtt,
210
vifestn1ki glav11i serveri, 2 17
zavistti serveri, pode!mm1~je
i pokretmlje, 2 14
sistem za upravUanjc rci.Ki<lllllll
bazama podat.1k.1
(RDBMS),11
ema, dcfinkJ-, l~
Indeks
tabele
ALTER TABLE, 56
atribwi, 31
BerkeleyDB (BDB), 50, 135
brisanje, 5 6
fimkcioualne zavisnosti, 32
gmptw r111ofenje podataka, 73-75
HEAP, 50, 138
indeksi, 229-230
lmwDB, 50, 134-135
ISAM, 50, 128-129
kljuevi, 31
ko/otre, 31, 52-55, 80
komanda CREATETABLE,
48-52
MERCE, 136-137
merge, 50
MylSAM, 50, 129-134
uovi redovi, umeta11je, 65-69
n-torke, 31
podrfka za tramakcije, 127-128
pod11piti iji Je rezultat Jedna
vrednost, tao-t 01
podupiti za izraze logitkog tipa,
101-103
podupiti za izvedme tabele, 1OO
pra"", 161-164
prav!ietife, 44-52
preimeiiOIJ(Itife, 57
redovi, 31
redovi, azurirmife, 72-73
redovi, brismife, 7Q-72
redovi, brismife pomou koma11de
TRUNCATE, 72
redovi, drtpliralli, 84-86
redovi, uita""tife, 83-84
redovi, zameua, 70
86-87
spa)m!je, 95-99
stnrktura, metifmife, 56-57
zada""ife imena u kommrdi
SELECT, 81-82
zapisi, 31
zadavanje apsolutnih in1ena.,
81-82
BCNF (Boyce-Coddova normalna
forma), 38
DDB (Berkeley), tip tabela, 50, 135
benchmark(), funkcija, 121, 234
llcrkeleyDB (BDB), tip tabela, 50,
135
IIIGINT, celobrojni tip podataka,
53
hin, dlrektorijum, 20
IIINARY, rezervisana re, 111
hir<~ nje
b.t7C podataka, komanda use, 43
u itavanje podataka iz redova
tn bela, 83-84
DLOB, tip podataka, 54
Doyce-Coddova normalna forma
(DCNF),38
hrh<~njc
indeksa, 56
redova iz tabela, 7Q-72
tabele, 56
brisanje redova, komanda
TRUNCATE, 72
brojevi s pokretnim zarezom, 48
b-stabla, 135
e
CASE, funkcija, 113
cast, funkcija, 120
ceiling(), funkcija, 118
celo brojni tipovi podataka, 52
CHAR, tip podataka, 53
CHECK TABLE, komanda, 196
CHECKSUM, opcija,
optimizovanje tabela, 51
ciklina
promena datoteka
dnevnika, 183
column_priv, kolona
pristupa, 164
COMMENT, komanda
optimizovanje tabela, 51
conv(), funkcija, 114
convert(), funkcija, 120
count(), funkcija, 122
CREATE, pravo, 159
CREATE DATABASE, SQL-ova
komanda, 43
CREATE TABLE, SQL-ova
komanda, 44, 48-52
CREATE TEMPORARY TABLES,
pravo, 159
CSV format, 75
curdate(), funkcija, 119
curtime() funkcija, 119
D
data, direktorij um, 20
Data Definition Language (DDL),
42
DATA DIRECTORY, opcija,
optimizovanje tabela, 51
Data Manipulation Language
(DML), 42, 65
datadir, opcija, podeavanje
MySQL-a, 172
DATETIME, tip podataka, 55
datoteke
dnevnika, 183
slike stanja, 188
datoteke opcija, podeavanje
MySQL-a, 169-171
internacionalizovanje, 174
konfiguracione opcije za vie
inst.:llacija na istom raunaru,
173-174
mysqld, podeavanje opcija za,
171-172
opcije za InnoDB, 172-173
opis, 183
rep! ikovanje, 21 O
restauriranje baze podataka,
194-195
does, direktorij um, 20
dodeljivanje prava, 157
globalna prava, 160
prava za administratore, 159
prava za obine korisnike, 159
tabele prava, 161
za pojedinane baze podataka, 160
za pojedinane kolone, 161
za replikovanje, 211
dolar($), znak, 116
DOUBLE, tip podataka, 53
drop database, komanda, 45, 56
DROP INDEX, komanda, 56
DROP TABLE, komanda, 56, 191,
194
DROP, pravo, 160
druga normalna forma (2NF),
36-37
dupli rani redovi, 84-86
E
Ernie Application Cluster, alatka,
217
encrypt(), funkcija, 121
entiteti,definicija,29
ENUM, tip podataka, 54
EXECUTE, pravo, 159
EXISTS, rezervisana
re,
102
EXPLAIN, 236
extract(), funkcija, 119
F
fantomski podaci, nivo
izolovanosti transakcija, 151
lower(), 114
MATCH,115
max(),122
md5(),121
min(), 122
mod(),118
now(),119
numerike, 117-118
operatori
aritmetitki, 11 O
logitki, 112
za poredetife vred11osti, 11 Q-112
password(), 121
power(), 118
quote(), 114
rand(), 118
replace(), 114
RLIKE,115-117
round(),118
soundex(), 114
sqrt(), 118
std(), 122
STRCMP,115,117
subdate(), 119
substring(), 114
sum(), 122
timestamp, 119
trim(),114
ugraene, 109
upper(), 114
z.'l rad s datumima i vremen itna,
119-120
za rad sa znakovnim vrednostima
i terminologija, 32
G
glavni serveri, replikovanje,
podeavanje, 209-212, 215
globalna prava
dodeljivanje, 160
zatita servera, 202
Google, Web lokacija, 135
GRANT, komanda
odredba IDENTIFIED BY, 158
odredba ON,158
odredba REQUIRE, 159
odredba TO, 158
odredba WITH, 159
odredba WITH GRANT
OPTION,159
grantor, kolona, tabela tables_priv,
164
GROUP BY, odredba, komanda
SELECT, 86-87
grupisanje redova rezultata upita,
86-87
grupnt luni. t
grupno
ll, l J l l
ttOHINtlt pn1l11ltt~n,
gubljenjo (llHiucul.,, l
redunduutuwt.sunJ
baza pothohol.u, l l
ktn
~~~J
H
Hafmanovo kodirnnjt,
komprimovanjt. litlwl1t, l' l
I
id, opcija, komanda EXPLAIN,
236
IDENTIFIED BY, odredba,
komanda GRANT, 158
identifikatori
maksimalan broj znakova, 43
navodnici, 42
razlikovanje malih i velikih slov:1,
42
rezervisane rei, 43
IF, funkcija, 113
IF NOT EXISTS, odredba, 49
IGNORE, odredba
komanda INSERT, 69
komanda LOAD DATA IN FILE,
74
komanda UPDATE, 72
IN, rezervisana
re,
101
indeksi
brisanje, 56
izrada, 55-56
jednokolonski, 229
levi kraj grupe, 229
optimizovanje baze podataka, 227,
229-230
optimizovanje upita, 238
viekolonski, 229
INDEX, rezervisana re, 50
INDEX, pravo, 159
index, vrednost, komanda
EXPLAIN, 237
INDEX DIRECTORY, opcija,
optimizovanje tabela, 51
InnoDB, konfiguracione opcije,
podeavanje MySQL-a,
172-173
lnnoDB, tip tabela, 50
dosledno uitavanje bez
zakljuavanja pod1caka, 134
transakcije, 143-146
rcd.t, 13-1
11,1
IIIVnll
Indeks
INSERT, komanda
listing, 6S-66
odredbe, 68-69
opti oblik, 68
primer rezultata, 67
INSERT, pravo, 1S9
INSERT METHOD, opcija,
optirnizovanje tabela, S1
instaliranje MySQL-a
anonimni nalozi, brisanje, 17
lozinka korisnika root, zadavanje,
17
na Linux, 12
naOSX,14
naWindows,12-14
nalozi, pravljenje za uobi~ene
poslove, 17-18
podeavanje sistema, 14-16
provera da li sistem radi, 16-17
instalirane datoteke, zatita
MySQL-a,174
ISAM tabele, SO
ogranienja, 129
pregled, 128
izbori pri projektovanju,
optimizovanje baze
podataka, 228
izolovanost, nivoi (transakcije),
1SO
fantomski podaci, 1S1
prljavi podaci, 1S2
read committed, 1S1
read uncommitted, 1S2
repeatable read, 1 SO
serializable, 1SO
izrada
komanda BACKUPTABLE,194
komanda FL USH TABLES, 193
komanda LOCKTABLES,193
komanda R.ESTOR.ETABLE,
194
mogu nosti, 187-188
hill
pomou
dnevnika izmena,
194-19S
razlozi, 1 87
runo, 193-194
skript mysqldump
nedostaci, 192
opcija --add-drop-table, 191
opcija --add-locks, 191
opcija --all-databases, 192
opcija --allow-keywords, 192
opcija --d, 192
opcija --databases, 192
opcija --extmded-imert, 191
opcija --lock-tables, 192
opcija --no-data, 192
opcija --opt, 18 8
opcija --quick, 191
predtwsti, 192
primer rezultata, 188-191
skript mysqlhotcopy, 192-193
tabele, proveravanje i popravljanje
komanda CHECKTABLE, 196
kommzda REPAIR TABLE, 196
mogunosti, 195
program myisamchk, 196-198
program mysqlcheck, 197
zakljuavanje tabela, 188
testiranje kopije, 19S
izvrive datoteke, MySQL-ove,
20-21
J
jednako (=), operator, 111
jednakovredni spojevi, 97
jednokolonski indeksi, 229
K
kandidati za kljueve, 31
karet (A), znak, 116
key, vrednost, komanda
EXPLAIN, 236
key_len, vrednost, komanda
EXPLAIN, 236
kljuevi, kandidati za kljueve
i superkljuevi, 31
kolone tabela
datumski i vremenski tipovi
podataka, S4
kljuevi, superkljuevi, 31
numeriki tipovi podataka, S2-S3
opcija unique, SO
tabela baze podataka, 31
tabela columns_priv, 164
tabela db, 163
tabela host
kolone za opseg vidlj"ivosti, 163
kolone za prava, 163
tabela tables_priv, 164
tabela user
kolone za ograni{avonje upotrebe
resursa, 162
kolone za opse.(! vidlj"ivosti, 162
ALTER TABLE, S7
ANALYZE TABLE, 230,238
CHECKTABLE,196
COMMIT, transakcije, 147
drop database, 4S, S6
DROP INDEX, S6
DROPTABLE,S6,194
EXPLAIN, 23S-237
FLUSHTABLES,137, 193
FLUSH, pranjenje ostava,
182-183
LOCKTABLES,148-149,193
OPTIMIZE TABLE, 130, 230,
238
REPAIR TABLE, 130,196
R.ESET, pranjenje ostava,
182-183
SET
aktiviranje datoteka dnev11ika,
183
reim autocommit, isklj'u{ivmije,
147
SHOW,23,180
START TRANSACTION, 147
UNLOCKTABLES, 148-149
komprimovanje
concatQ, funkcija, 114
MyiSAM tabele, 131
kopije tekueg stanja, pravljenje,
212-214
korisniki interfejsi
MySQL Control Center, 21
MySQL monitor, 21-23
phpMyAdmin, 21
korisniki nalozi. Videti i prava
anonin1ni nalozi, brisanje,
202-203
anonimni, brisanje, 17
bezbednost
auouinwi Halozi, brismije, 17
pravljenje za uobi~ene poslove,
instaliranje MySQL-a,
17-18
zatita
attmzinwi ualozi, brisanje,
202-203
lozi11kd z a tzalo_q root, 202
opmm1 JlhH.~tr, 20.1
.(i(toiW/JI' lo i11kl, ?OJ
L
last insert id(), funkcija, 121
length(), funkcija, 114
levi spoj, 98-99
LIKE, funkcija, 11S
LIKE, odredba, 49
LIMIT, odredba
komanda DELETE, 72
komanda SELECT, 88-89
komanda UPDATE, 72
LINES, odredba, komanda LOAD
DATA INFILE, 74
Linux, instaliranje MySQL-a na, 12
listinzi
M
maksimalan broj znakova,
identifikatori, 43
manje od (<),111
MATCH, funkcija, 11S
max(), funkcija, 122
mdS(), funkcija, 121
MEDlUMINT, celobrojni tip
podataka, S3
mcrenje performansi, upiti, 234
N
naredbe. Videti i komande
ALTER TABLE, S6
DROP TABLE, 191
FL USH PRIVILEGES, 202 20.1
GRANT,1S8-1S9
LOAD DATA INF! LE, 73-7S
LOCK TABLES, 191
ON, komanda GRANT, 1S8
R.EVOK.E, ukidanje prava
pristupa, 161
SELECT, izraela tabela, S2
SET, podeavanje promenljivih,
182
show processlist, niti, 181
show variables, 180
SQL-ove
CREATE DATABASE, 43
CREATETABLE, 44, 48-52
DELETE, 7{}-72
INSERT, 68-69
REPLACE, 70
SELECT, 8{}-89
TRUNCATE, 72
UPDATE, 72-73
UNLOCK,191
use, biranje baze podataka, 43
navodnici, identifikatori, 43
nebitne rei, tekstualno
pretraivanje, 132
niti, unitavanje, 182
normalizovanje
server
server, optimizovanje
31
NULL, vrednost
izrada tabela, 49
operatori za porcdcnjc vttdlln,t<.
110--111
projektovanjc """' pod.u.tk.t, H
numerike funkclJ, 117 liH
nutncri~ki
tipovi putlut1'""' 1\
'\ \
Indeks
o
obrnute kose crte (\), 67
odredbe
DEFAULT, komanda INSERT
69
11 O
112
ugraeni, 109
za poredenje vrednosti, 110-112
OPTIMIZE TABLE, komanda,
130, 230, 238
optirnizovanje
baze podataka
i11deksi, 229-230
izbod pn" projektova11ju, 22 8
korna11da OPT/M/ZE TABLE,
230
prepon1ke, 227-228
izrada tabela, Sl
MySQL servera
parametri servera, 222-224
RAID diskovi, prepomka, 2 2 4
Solaris, 224
r;brzavanje, prevodet!ie i
povezivatife, 221-222
upiti
d11ev11ik sporih upila, 234--235
dodmxuife i11deksa, 238
koma11da ANALYZE TABLE,
238
koma11da EXPLAIN, 235-237
koma11da OPTIMJZETABLE,
238
meretife peiformaiiSi, 234
spori upiti, otkrivatife, 233
ugrae11 meha11izam
optimizovatifa upita, 237-238
OR, operator, 112
OS X, instaliranje MySQL-a na, 14
ostave, pranjenje, 182-183
logiki,
209
ovlaenja,
za replikovanje, 211
p
PACK KEYS, opcija,
optirnizovanje tabela, 51
parametri servera, tehnike
optirnizovanja, 222-224
password(), funkcija, 121
PASSWORD, opcija,
optirnizovanje tabela, 51
phpMyAdrnin, korisniki interfejs,
21
pid-file, opcija, podeavanje
MySQL-a, 173
podaci, grupno unoenje, 73-75
podeavanje MySQL-a
instaliranje, 14-16
internacionalizovanje, 174
konfiguracione opcije za vie
instalacija na iston1 raunaru,
173-174
mysqld, podeavanje opcija za,
171-172
opcije za lnnoDB, 172-173
reenje s datotekom opctja,
169 171
pod upiti
iji je rezultat jedna vrednost,
100-101
vrste, 99
za izraze logikog tipa,101-103
za izvedene tabele, l OO
pokretanje
MySQL servera, 177-178
zavisnih servera, 214
EXPLAIN, 236
power(), funkcija, 118
prava
doddjivanje, IS7
global11a prava, 160
prava za admi11istmtore, 159
prava za obil'11e korist~ike, 159
za pojedi11a1'11e baze podataka,
160
za pojedit1111'11e kolo11e, 161
za pojedi11abte tabele, 161
FILE, 203
prikazivanje podataka o, 181
PRO CESS, 203
tabele, 160,161
tabela colunms_priv, 164
tabela db, 163
tabela host, 163
tabela tables_priv, 164
tabela user, 162
ukidanje, 161
~ITH GRANT OPTION, 203
zasuta
MyiSAM tabele,131-134
tekstualno pretraivanje, 131-134
PRIMARY KEY, rezervisana re, 49
principi projektovanja, baze
podataka
anomalije
NULL vred11osti, 34
pri auriraty'u podataka, 34
pri hrisanju podataka, J 4
fiti dm/m;wju p<>rlataka, JJ
normalizovanje
transakcija, 150
replace(), funkcija, 114
REPLACE, komanda, 70
REPLICATION CLIENT, pravo,
160
REPLICATION SLAVE, pravo,
160
replikovanje baze podataka
bezbednosne mere, 211
budunost, 216
dnevnik izme na, 21 O
dodeljivanje prava za, 211
hijerarhijski organizovani glavni
serveri, 21S
kopije tekueg stanja, pravljenje,
212-214
otpornost na greke, 209
podeavanje zavisnih servera, 214
preklapat~e servera na vrue, 21 7
principi, 209-210
provera glavnog servera, 212
sloenije topologije, 21S
upotrebljive verzije MySQL-a,
210
viestruki glavni serveri, 217
zavisni serveri, pokretanje, 214
REQUIRE, odredba, komanda
GRANT,159
RESET, komanda, pranjenje
ostava, 182-183
RESTORE TABLE, komanda, 194
REVOKE, komanda, 161
rasporeivanje optereenja,
rezervisane
Q
QUICK, odredba, komanda
DELETE, 72
quote(), funkcija, 114
R
RAID diskovi, preporuka, MySQL
server, tehnike
optimizovanja, 224
RAID TYPE, opcija,
optimizovanje tabela, 51
rand(), funkcija, 118
replikovanje, 215
razlikovanje malih i velikih slova,
identifikatori, 43
RDBMS (relational database
management system), 31
read uncommitted, nivo
izolovanosti transakcija, 152
redovi
auriranje, 72-73
brisanje, 70-72
brisanje, komanda TRUN CATE
72
duplikati, 84-86
grupisanje, 86-87
rei
ALL,102
ANY,I02
AUTO INCREMENT, 49
BINARY,III
EXISTS, 102
FOREIGN KEY, SO
FULLTEXT, SO
IN,IOI
!NDEX,50
PRI MARY KEY, 49
ROLLBACK, 146
SOME, 102
TEMPORARY, 49
UNIQUE, SO
UNSIGNED, 52
EXPLAIN, 236
RPM datoteke, instaliranje
MySQL-a iz, 12
runa izrada rezervnih kopija
i obnavljanje podataka,
193-194
s
sabiranje(+), operator, 110
sarnospojevi, 96
scripts, direktorijum, 20
Secure Sockets Layer (SSL), 205
SELECT, komanda
alija.1i, 82-83
kolone, 80
izrada tabela, S2
odredba DISTINCT, 84-86
odredba GROUP BY, 86-87
odredba HAVING, 87
odredba LIMIT, 88-89
odredba ORDER BY 87
odredba WHERE, 83..:_84
opti oblik, 80
primer jednostavnog upita, 80
tabele, 81-82
zadavanje baze podataka, 81-82
SELECT, pravo, 159
select_type, opcija, komanda
EXPLAIN, 236
serializable, nivo izolovanosti
transakcija, 150
serveri
1\1
IIIUI:II.)
MySQL-a, 173
Solaris, preporuka, MySQL server,
tehnike optirnizovanja, 224
SOME, rezervisana re, 102
soundex(), funkcija, 114
spojevi tabela
CREATE DATABASE 43
CREATE TABLE, 44,48-52
DELETE, 70-72
INSERT, 65---<i9
REPLACE, 70
SELECT, 80-89
TRUNCATE, 72
UPDATE, 72-73
sqrt(), funkcija, 118
SSL (Secure Sockets Layer), 205
START TRANSACTION,
komanda, 147
statike MyiSAM tabele, 129-130
std(), funkcija, 122
STRCMP, funkcija, 115,117
struktura direktorijuma,
MySQL-ova, 19-20
subdate(), funkcija, 119
substring(), funkcija, 114
tum (), funkcija, 122
SUPER, pravo, 160
upcrkljuevi, 31
lemn, definicija, 32
T
tabele
100-101
zakljuavanje,
188
BLOB,54
CHAR,53
ENUM,S4
SET,S4
TEXT,54
VARCIIAJ1..,54
tekstualno pretraivanje
logiko,
133-134
MylSAM tabele, 131-134
TEMPORARY, rezervisana re 49
TEXT, tip podataka, 54
threads_connected, serverska
promenljiva, 180
~m estamp(), funkcija, 119
ttmestamp, kolona, tabela
columns_priv, 164
TIMESTAMP, tip podataka, 55
TINYINT, celo brojni tip
podataka, 52
tipovi podataka, float, 48
TO, odredba, komanda GRAN~
158
definicija, 143-146
START TRANSACTION
komanda, 147
'
u lnnoDB tabelama, 143-146
ACID uskladerwst, 149-150
izolova11ost tramakcija, 150-152
reim autocommit, 147-149
trea
EXPLAIN, 236
u
ubrzavanje MySQL servera,
221-222
ugraen
podupiti
iji je rezultat jed t ta vredttost,
100-101
vrste, 99
za izraze logikog tipa, 101-103
za izvedeue tabele, 1OO
spojevi tabela
deSili spojevi, 98-99
jedtwkovredr~i, 97
levi spojevi, 98-99
ptmi spojevi, 97
samospojevi, 96
spajanje vife tabela, 95-96
unakrSIIi spojevi, 97
uppercase(), funkcija, 114
uptime, serverska promenljiva, 180
USAGE, pravo, 159
use, komanda, biranje baze
podataka, 43
user, opcija, podeavanje
MySQL-a, 172
user, tabela, prava pristupa
podataka, transakcije,
150
uslovi licence, InnoDB tabele, 135
uspostavljanje veze s bazom
podataka
mehanizam
unakrsni spojevi, 97
UNION, opcija, optirnizovanje
tabela, 51
UNIQUE, rezervisana re, SO
UNLOCK TABLES komanda,
148-149
UNLOCK TABLES, komanda, 191
UNSIGNED, rezervisana re, 52
UPDATE, komanda, 72-73
UPDATE, pravo, 159
upiti
dnevnik, 183
komanda SELECT, 80
optimizovanje
v
V~CHAR, tip podataka, 54
vece od(>), 111
viekolonski indeksi, 229
viestruki glavni serveri,
replikovanje, 217
vremena, funkcije za rad s
datumima i vremenima
119-120
w
Web lokacije
activestate.com, 235
Google,135
lnnoDB,135
OpenSSL, 205
Slashdot, 135
Sleepycat, 135
Yahoo!, 135
WHERE, odredba
Windows 1\<loululoltll 1
prozor St~rvlt, l IM
Windows, lm! olhoonf 1\h 1
na,12-14
WITH, odredbu, kmmu11lt
GRANT, 159
WITH GRANT 1''1'11 IN,
odredba, komandu l .ll i\ N 1
159
l
WITH GRANT OP1'10N, l"" .,,
160,203
X
XOR, operator, 112
y
Yahoo!, Web lokacija, 135
YEAR, tip podataka, 55
z
zakljuavanje
podataka na nivou
reda, lnnoDB tabele, 134
zakljuavanje podataka na nivou
stranice, BerkeleyDB (BDB)
tabele, 135
zakljuavanje tabela, 188
zamena redova, 70
zavisni serveri
pokretanje, 214
u replikovanju, 209-210,214
zlonamerni korisnici, zatita, 205