Professional Documents
Culture Documents
PriručnikZaMySQL PDF
PriručnikZaMySQL PDF
Luke Well ing i Laura Thomson, autori popu larne knjige PHP i MySOL:
razvoj aplikacija za Web (Mikro knj iga, 2004), predaju programiranje
Web aplikacija, softverske inženjerstvo i elektronsko trgovanje, na RMIT
univerzitetu u Melburnu, Australija. Oni su i poslovni partneri u kompaniji
Tangl ed Web Design, koja je osvojila više nagrada za svoje projekte dina-
mički h Web lokacija na kojima se koriste PHP i MySQL. Često učestvuju
i predaju na konferencijama o softveru otvorenog koda, kao što su MySQL
U er Conference, PHPCon, LinuxTag i O'Reilly Open Source Convention.
<{
Priručnik
(.)
z
>N
....,
z
za MySQ
~<
Izdanja Mikro knjige
donose informacije,
<{~
z-, Pregledan uvod u korišćenje MySQL a
S~ -sistema za rad sa bazama podata ko
prenose proverena iskustva
i pružaju potrebna znanja.
My
Press w
Obl.t\ 1: l\o11r pndoliolkol ~
Priručnik ~a MySQL®
O autorima
Rc.·ccn1enL Dragan Tanaskoski
Urednik Olga Milanka l ul Vl•ling (Luke Wclling) predaje u Školi za računarske nauke i informacione tehno-
ltrd.lktori Aleksandra Stojanović i Stela Spa.ić
Tehnički urednik Sanja Tasić
lPl'- 'll' ttniwr;ritct:-t RMIT u Melburnu, Australija. Kad god smatra da je izvodljivo, opre-
Korektor Vesna Đukić tl• IJIIJt' Sl' "a softver otvorenog koda i nastoji da objasni prednosti takvog rešenja što
Realizacija korica Vladimir Končarević "' 111 ~ lllp;u korisnika. Na predavanjima u Australiji, Severnoj Americi i Evropi, obja-
l'rclom tc Ima i obrada slika Sanja Tasić
Milica Dečanski IIJIV.lll .Jl' MySQL, PHP i druge teme iz oblasti softvera otvorenog koda. Studentima
1 11111 llJ .lCIIlla držao je predavanja iz raznih oblasti, ali uža specijalnost mu je Internet.
Izdava č Mikro knjiga, Beograd
Direktor Dragan Tanaskoski
l '"''Tomson (Laura Thomson) predaje u Školi za računarske nauke i informacione
Štampa YG{)~O "J. ( ~u~kum, Beograd r, llllnlop;Uc univerziteta RMIT u Melburnu,Australija. Predavala je više predmeta iz
Ako imate pitanja ili komentare, ili ako želite da dobijete besplatan katalog, pišite nam ili se javite: ,,,,J.,~tt Weba i Jnterneta, a priprema doktorat na temu pretraživanja Weba. Učestvuje na
Mikro knjiga Mikro knjiga Mikro knjiga
, 'w 1111 konferencijama širom sveta. Bila je instruktor na kursevima u organizacijama
l~ t:th 20-87 Jevrejska bb Maksimirska 13 1 d '' t ,!\dičiti m kao što su Ericsson i Lonely Planet, a pre toga je radila za firme Telstra
11030 Beograd 78000 Banja Luka 10000 Zagreb
1 l\11\lllll Consulting Group. Diplomirala je inženjering računarskih sistema i računar
o
tel: t l /3540-544 tel: 051/220-960 tel: 01/2344-023
pisma®mikroknjiga . co.yu pisma®mikroknjiga.ba pisma®mikroknjiga . hr l, lt.lltkc. U slobodno vreme bavi se jahanjem, hrani svoju menažeriju kućnih ljubi-
Autorizovan prevod sa engleskog jezika knjige MySQL®Turorial. ilt.ll 1, .1 ponekad priča s Lukom i o stvarima sasvim izvan sveta tehnike.
Copyright© 2005 Mikro knjiga. Sva prava zadržana. Nije dozvoljeno da nijedan deo ove knjige bude reprodukovan
di rm i tovan na bilo koji način, elektronski ili mehanički, uključujući fotokopiranje, snimanje ili bilo koji drugi sistem
~.l bdcžcnje, bez prethodne pismene dozvole izdavača.
Authorized translation from the English language edition, entitled MYSQL Thtorial, lst Edition byWELLING, Od istih autora
LUKE; THOMSON, LAURA, published by Pearson Education, Inc., publishing as MySQL Press, Copyright© 2004.
Među knjigama o izradi Web aplikacija korišćenjem P HP-a
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 1'111 1 i MySQL i MySQL-a, ova knjiga ima najbolje ocene na lokacijama
l'r.mon Education, Inc. l lltvo~J •l'lrk.tcija zn Web Amazon. com i bn.com. Posebno je dobra druga polovina
knjige, u kojoj su praktčini projekti. U udžbenicima pro-
CIP- KaTanorH33l(ltja y ny6nHK3l(ltjH
IlapoAita 6116mwTeKa Cp6Hje, 6eorpa11
l gramiranja za Web, primeri su obično previše jednostavni
za praktičnu primenu - ova knjiga sadrži i jednostavne pri-
004.655.3(035)
004.652.4(035) mere na kojima se objašnjavaju svojstva jezika, ali i nekoliko
BEJ111Hr, nyK gotovih kompletnih aplikacija koje prikazuju kako se prave
Priručnik za MySQL l Luke Welling, Laura
Thomson ; preveo Andon Kartalovski. -
veliki projekti.
Beograd : Mikro knjiga, 2005 (Beograd :
Publikum). - XI, 251 str. : ilustr. ; 24
cm
Uvod . . . . . . . . . . 1
Osnove MYSQL-a . 9
Instaliranje MySQL-a 11
lnSLaliranje na Linux .... ..... ......... .... ...... .. ...... .. . . ... 12
Instaliranje na Windows .................... . .. .... ............. 12
l11staliranje na OS X ........................................... 14
Podešavanje sistema .. ......... ... ........... .... .. . ... ..... ... 14
l'rovera da li sistem radi ........................................ 16
Zadavanje lozinke za nalog root ................. . .. .......... .... 17
ll1 isanje anonimnih naloga .................... .... ............. . 17
l'ravljenje naloga za uobičajene poslove ............................. 17
Sažetak ............................................ .. .. .. .. 18
l Kratak obilazak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Struktura MySQL-ovih direktorijuma ............................ .. 19
Pregled izvršnih datoteka ....................................... 20
Pregled korisničkih interfejsa .................................... 21
Kratak uvod u MySQL monitor .................................. 22
Sažetak .................................................... 23
H t' Ill' . l'ri tome je upotrebljena alfa verzija MySQL-a 4.0, a MySQL 4.1 je još brži.
M ySQL je na raspolaganju i kao besplatan i kao komercijalni softver. Ce o MySQL
1111 tZt' st: nabaviti pod uslovima GNU opšte javne licence (General Pu blic License,
l .1'1.), .di ukoliko vam je potrebna komercijalna licenca, možete je kupiti.
MySQL pruža veliku većinu mogućnosti koje se smatraju važnim u oblasti baza
('•ul.ti.lka, a to su transakcije, zaključavanje na nivou pojedinačnih redova, spoljni klju-
' l 1, podupiti i tekstualno pretraživanje.Verzija 5.0 će na ovaj spisak dodati i uskladi-
l Ill' procedure.
MySQL omogućava dobru skalabilnost i koriste ga veoma zahtcvni klijenti kao što
11 Y.dlOo! Finance, Slashdot i US. Census Bureau.
MySQL je odlična opšta alatka za učenje baza podataka jer se lako instalira i koristi,
1 Z.lutima malo prostora na disku i troši skromnu količinu memorije.
rezultati dokazuju šta god naručilac programa zahteva, ili da se različiti proizvodi Istovremenih korisnika koji će uspostavljati veze s bazom podataka. Troškovi za Ora-
pokazuju kao savršeni u različitim uslovima upotrebe. t leov server, Microsoftov SQL Server, IBM-ov DB2 i Sybaseov server, mogu dostići
Na MySQL-ovj zvaničnoj Web lokaciji možete pogledati rezultate poređenja per- desetine hiljada dolara u okruženju sa umerenim opterećenjem, pa čak i stotine hiljada
formansi MySQL-a i drugih baza podataka. Ti podaci pokazuju da MySQL uglavnom dolara za server s više procesora na koji se povezuje veći broj klijenata.
primctno nadmašuje svoje takmace. Iako u načelu rezultate bilo kojeg testiranja treba MySQL se ponekad poredi s drugim bazama podataka otvorenog koda, kao Što su
prihvata ti "sa zrnom soli", što naročito važi za rezultate testova koje je izvršio proizvo- l'ostgreSQL i Firebird. Od svih pomenutih baza podataka otvorenog koda, jedino je
đač baze podataka, svi dokazi na raspolaganju, uključujući i nezavisne testove, poka- MySQL proizvod iza kojeg stoji jedna kompanija, koja je vlasnik svih prava intelektu.-
zuju da je MySQL jedan od najbržih proizvoda na raspolaganju. ,tlne svojine i koja nudi celovite komercijalne licence, koje obuhvataju i odgovornost 1
Rezultate testiranja možete videti na Web lokaciji: odštetu u slučaju neispravnosti, kao što zahtevaju velike organizacije.
www.mysql.com/information/benchmarks.html Još jedna kategorija softvera s kojom se MySQL ponekad poredi jesu jeftine baze
podataka koje nisu namenjene radu u klijent/server okruženju, a ciljna tržišna grupa
a ti podaci su priloženi i uz datoteke izvornog koda koje preuzim.ate, što vam omogu-
su im kućni korisnici ili male firme. U tu kategoriju spadaju Access i Filemaker Pro.
ćava da ih uporedite s rezultatima koje dobijete u svom radnom okruženju.
Mada se grafički korisnički interfejs programa iz ove kategorije Često jednostavno
Rezultati testiranja koje je izveo časopis eWeek 2002. godine pokazali su da je
upotrebljava, njima uglavnom nedostaje važna funkcionalnost i nisu dovoljno stabilni,
MySQL uporediv sa Oracleom kada se koristi kao pozadinska baza podataka za Web
skalabilni i brzi da bi bili upotrebljivi za aplikacije od ključne važnosti za firmu.
aplikacije napisane na jeziku Java koje rade na Windows računaru s četiri procesora.
Navedena dva proizvoda su nadmašila IBM-ov DB2, Microsoftov SQL Server i Syba-
Stabil nost
seov ASE. U nastavku ovog teksta biće više reči o ce nama, ali vredi napomenuti da je
Projektanti MySQL-a oduvek su smatrali da je stabilnost od prvorazrednog značaja .
od svih proizvoda obuhvaćenih tim testovima, jedan od najboljih bio besplatan, dok su
Sve verzije MySQL-a izdate u binarnom obliku - čak i alfa izdanja - moraju proći
cene drugih bile reda veličine 160.000 dolara (40.000 dolara po procesoru).Više detalja
MySQL-ov skup testova stabilnosti. Postupak obuhvata testiranje funkcija i drugih
o tome naći Ćete na Web adresi www. eweek. com/article2/0, 3959,293, oo. a sp.
osobina, kao i ispitivanje rezultata operacija pri kojima su u prošlosti otkrivene i ispra-
Brzina je oduvek bila ključna odlika o kojoj projektanti MySQL-a vode računa.
vljene greške, čime se obezbeđuje da se nikad ponovo ne uvede već ispravljena greška.
U MySQL se ugrađuju nove mogućnosti samo ako nisu na štetu performansi. Zbog
Ispravljanju grešaka projektanti moraju da daju viši prioritet od drugih poslova.
toga se ponekad nove mogućnosti dodaju sporije nego što to korisnici žele, ali se time
U suštini, projektant prekida tekući posao sve dok se ne otkloni greška koja spada
obezbeđuje da MySQL uvek bude veoma brz. S tom tvrdnjom verovatno ćete se i u njegovu oblast stručnosti. Pravilo nalaže da svako izdanje MySQL-a mora biti oči
sami složiti na osnovu svog iskustva ili testova koje sami izvedete.
šćeno od dotad poznatih grešaka koje se mogu reprodukovati u poznatim uslovima.
Cena R.azume se, određeni problemi ne mogu se rešiti a da pri tom ne pro uzrokuju druge
probleme na drugom mestu. To naročito važi za produkcione verzije u koje ne bi tre-
Cena je stavka koja se možda najlakše poredi. Za mnoge uslove upotrebe, MySQL je
balo ugrađivati suštinske izmene koje bi mogle da utiču na stabilnost verzije. U takvim
besplatna aplikacija. Uslovi licence tipa GPL omogućavaju da neograničeno koristite
slučajevima, problem se dokumentuje i otklanja u jednoj od narednih verzija.
softver, da menjate njegov izvorni kod i da MySQL distribuirate drugim ljudima
I najzad, kvalitet softvera obezbeđuju MySQL-ovi klijenti i zajednica korisnika.
takođe pod GPL uslovima. U određenim situacijama, npr. kada želite da distribuirate Preko četiri miliona korisnika širom sveta rade u veoma različitim okruženjima, što
MySQL kao sastavni deo komercijalnog proizvoda, moraćete da kupite komercijalnu
pruža jedinstvenu priliku za otkrivanje grešaka već u početnim fazama razvoja. Budući
li cenc u. Cena licence za jedan server je od 220 do 440 dolara (u vren~e pisanja ove
da je MySQL-ov sistem za otkrivanje i dokumentovanje grešaka javan, svaki korisnik
ima uvid u sve što su drugi korisnici otkrili i može da dodaje svoje napomene.
Lakoća upotrebe Šta je drugačije u My -u 4.0 i 4.1
Druga ključna odlika MySQL-a jeste lakoća upotrebe. Nije potreban sime.: n post upak MyS )L 3.23 je dugo hio J111HIIIkt 11111.1 V« lii:ij ,l , M.11t.1 2003. godine izdat je MySQL
podešavanja da biste počeli da radite. MySQL server radi kako treba čim ga "rasp~ku
1 O, 13, kao produkcion.1 Vl'11ij.1 l () All.1 Vl'lli,J.I 11.1 11.data je aprila iste godine.
jete". Standardne vrednosti parametara su takve da minimizuju utrošak prostora na
Ako ste koristili veri. lJ ll \ ~> \, 11 Vl' lilJI tl .O uočićete sledeće značajnije izmene:
disku i memorije. Razume se, da bi se postigle optimalne performanse određenih
funkcija koje su važne u produkcionom okruže~ u. kao što je npr. prijavljiva~e kori- • U standardnu binarnu verziju ugrad ena je mašina baze podataka Inn oD B, koja je
već bila ugrađena u neke kasnije verzije 3.23. Mašina baze podataka InnoDB
snika za rad u bazu podataka, potrebno je finije doterivanje tih standardnih vrednosti
radnih parametara MySQL-a. Pri tome vam mogu pomoći primeri konfiguracionih podržava pravila ACID, što znači da podržava transakcije, spoljne ključeve i
datoteka koje dobijate uz MySQL. zaključavanje na nivou redova tabele.
• MySQL sada koristi ostavu (keš) za upite, u koju smešta rezultate upita za kasniju
Mogućnosti ponovnu upotrebu, čime znatno poboljšava performanse uobičajenih upita.
Poređe~e mogućnosti softvera umnogome zavisi od toga koje mogućnosti smatrate • Tekstualno pretraživanje i indeksiranje, koji su dodati u verziji 3.23.23, pobolj-
važnim. MySQL pruža određene mogućnosti, kao što su tekstualno pretraživanje, šani su dodava~em opcije Boolean.
replikovanje i podrška za veoma obimne tabele, kojih u drugim jeftinim proizvodima • Tabele tipa MERGE sada podržavaju komande INSERT i polja AUTO_INCREMENT.
uopšte nema ili ne rade najbolje. Međutim, MySQL-u nedostaju neke mogućnosti • Skupovi rezultata dobijeni pomoću upita SELECT sada se mogu spajati pomoću
kao što su uskladištene procedure i pogledi, koje su standardne u najskupljim proizvo- opcije UNION .
dima, a postoje čak i u nekim jeftinim proizvodima. Neke od tih nedostajućih moguć
• Sada možete da br iš ete redove iz više tabela istovremeno pomoću jedne komande
nosti (kao što su uskladištene procedure), planirane su za naredne verzije, dok će za
DELETE.
druge (kao što su pogledi) biti potrebno više vremena. Neke MySQL-ove mogućnosti
(na primer, zaključavanje na nivou reda) ne postoje čak ni u najskupljim sistemima. • Poboljšano je upravlja~ e pravima korisnika. Doda to je više novih vrsta prava, što
omogućava finije podešavanje, a odsad možete da ograničite i resurse kojima
Na Web lokaciji posvećenoj MySQL-u nalazi se stranica, h t tp: l /www. mysql. com/
information/features. html, na kojoj ćete naći uporedni pregled mogućnosti
korisnik ima pristup.
MySQL-a i dvadesetak konkurenata, da biste videli šta se sve nudi. U nastavku dajemo • Odsad možete da menj ate konfiguraciju servera bez ponovnog pokretanja servera.
kratak spisak mogućnosti koje ne podržavaju svi MySQL-ovi konkurenti i spisak • Na raspolaganju je nova biblioteka,libmysqld, napisana na jeziku C, koja omo-
mogućnosti kojih nema u MySQL-u a postoje u drugim proizvodima. gućava da ugrađujete MySQL u svoje programe.
MySQL 4.1 nudi sledeće: • Replikovanje, koje postoji još od verzije 3.23.15, poboljšano je na više načina,
• transakcije u skladu s grupom pravila ACID uglavnom otklanjanjem grešaka. Na primer, sada možete da podesite bazu ka~
• podršku za različite platforme prijemnik podataka pomoću opcije LOAD DATA FROM MASTER, umesto pomocu
• replikovanje komande mysqldump ili alatke mysqlsnapshot.
• podršku za obimne tabele i baze podataka Napravljeno je i puno drugih manjih izmena i poboljšanja. . .
Verzija 4.1 donosi još neka dodatna poboljšanja. Najvažnija izmena Je dodavanJe
• tekstualno pretraživanje
pod upita i izvedenih tabela. Odsad imate i podršku za Unicode, po~.~šku za fo_:m~t
• podupite
OpenGIS za skladištenje geografskih podataka i mnogo drugih sitmJih poboljsanJa.
• podršku za većinu sintakse po standardu SQL 92.
MySQL zasad još ne nudi sledeće:
Koje nove mogućnosti tek treba da se pojave
• poglede
• uskladištene procedure
u budućim verzijama
Verzija 5.0 je zasad u predalfa fazi, ali možete preuzeti izvorni kod da biste s njim
• okidače
ckspcrimentisali. Najznačajnija izmena koju donosi verzija 5.0 jeste do.datak u~kla
dištenih procedura, što je već ugrađeno u predalfa verziju. Planirane su 1 druge 1zm~ne
medu kojima su podrška za kursore, RTREE indeksi, pravi tip podataka VARCHAR 1
druga manja značajna poboljšanja.
Trebalo bi da verzija 5.1 omogući definisanje spoljnih ključeva Ll sv lill Vl st.llll.l N,1 kraju svakog poglavlja, nalazi se niz pitanja i praktičnih vežbi u vezi s gradivom
tabela (među mnogobrojnim drugim novim mogućnostima). Pogledi će biti podrža ni poglavlja, da biste mogli da provežbate ono što ste naučili u poglavlju.
u jednoj od budućih verzija S.x.
MySQL-u na zvaničnoj Web lokaciji. Zaista nema potrebe da ponovo pronalazimo , 11vorni kod.
rupu na saksiji. Cco tekst uslova GNU GPL licence za distribuiranje MySQL-a možete pročitati
Usredsredićemo se na sledećih pet ključnih oblasti: instalisanje i konfigurisanje 11 l·kktronskom obliku u MySQL-ovom referentnom priručniku, ili na Web lokaciji
MySQL-a, upotreba MySQL-a, administriranje MySQL-a i optimizovanje MySQL-a. l ondacij e za besplatan softver (Free Software Foundation):
Opisaćemo sva suštinska zarU a koja su neophodna za profesionalnu upotrebu MySQL-a. hl Lp://www.gnu.org/licenses/
Ovu knjigu možete koristiti kad god vam zatreba da uradite određeni posao koji
Više detalja o GNU uslovima naći ćete na:
se ti če upotrebe MySQL-a u novom projektu, ili ste prešli na nov posao, ili nemate
http://www .gnu.org/licenses/gpl-faq.html
dovoljno vremena da "kopate" po drugoj krUizi od hiljadu stranica. Ova knjiga je
napisana tako da vam pomaže da uradite određeni posao. Ako to ne odgovara vašim namerama- na primer, ako želite da izmenite MySQL
1d:1 zatim prodajete binarnu verziju napravljenu na osnovu izmenjenog koda, ali bez
pristupa izvornom kodu- onda morate kupiti komercijalnu licencu od firme MySQL
Kako treba koristiti ovu knjigu AB. Komercijalnu licencu možete kupiti i ako želite da pomognete razvoj MySQL-a.
Ova knjiga je podeljena na pet delova: Važno je napomenuti da MySQL-ova dokumentacija nije na raspolaganju pod GPL
U prvom delu", Osnove MySQL-a", naučićete kako da instalirate i podesite MySQL uslovima, ali se može slobodno štampati za ličnu upotrebu.
na svom sistemu, i upoznaćete MySQL na osnovu kratkog opisa.
Drugi deo, "Projektovanje i izrada baza podataka u MySQL-u", vodi vas kroz
postupak projektovanja i izrade baze podataka. Čitaocima koji imaju iskustva u pro-
jektovanju baza podataka biće dovoljno da samo površno pogledaju ovaj deo, ali ako
ste početnik u oblasti baza podataka, savetujemo da ga detaljno proučite .
U trećem delu",Upotreba MySQL-a", naučićete kako da koristite podatke iz
MySQL-a u svakodnevnim poslovima.
Četvrti deo", Tipovi tabela i transakcije u MySQL-u" opisuje kako se u MySQL-u
koriste pojedine vrste mašina baza podataka, sa posebnim osvrtom na mašinu InnoDB
i njenu upotrebu za transakcionu obradu podataka.
Peti deo, "Administriranje MySQL-a", opisuje osnovne poslove koje mora da oba-
vlja administrator MySQL-ove baze podataka, kao što su upravljarUe korisnicima,
podešavanje, održavarUe baze podataka, izrada rezervnih kopija i restauriranje baze
podataka, zaštita baze podataka od neovlašćenog pristupa i replikovanje podataka.
Šesti deo",Optimizovanje MySQL-a", pomoći će vam da dobijete maksimum od
MySQL-ove baze podataka tako što optimizujete podešavarUa servera, baze podataka
i upite u svojim uslovima.
I
Osnove MYSQL-a
l Instaliranje MySQL-a
2 Kratak obilazak
1
Instaliranje MySQL-a
lli IIIOgućnosti, kao što su InnoDB tabele koje omogućavaju upotrebu transakcija,
Ovde je samo ukratko opisano kako se prav1 nov konsmckt ,n~log. Vtse deta.lja
mysqld --standalone tome kako se upravlja korisničkim nalozima u MySQL-u naCl cete u poglavlju 11,
0
na komandnoj liniji. (To ćete najlakše uraditi u jednom prozoru, a zatim otvorite "Upravljanje pravima korisnika" .
drugi prozor iz kojeg ćete se prijaviti na server.)
Pomoću sledeće komande napravite nov nalog koji ćete koristiti za svakodnevne
poslove:
grant create, create temporary tables, delete, execute, index,
insert,
lock tables, select, show databases, update
on*.*
2
to imekorisnika identified by 'lozinka ' ;
Razume se, umesto reči imekorisnika i lozinka, u tekst komande treba da upišete
svoje korisničko ime i odgovarajuću lozinku.
Kratak obilazak
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 završnih poglavlja ove knjige mora-
ćete da koristite nalog root da biste obavili određene poslove, ali pošto korisnički
u
nalog koji ste upravo napravili ima manja prava od naloga root, bezbedniji je za sva-
kodnevne poslove.
OVOM POGLAVLJU UVODI SE STRUKTURA MySQL-a i alatke koje su mu _Pri-
d1užene. Povešćemo vas u kratak obilazak da biste saznali koje sve al~tke postoje u
Sažetak MySQL-u i koji su najčešći klijentski interfejsi. Razmotrićemo sledece teme:
U ovoj f.ni trebalo bi da vaša instalacija MySQL-a bude upotrebljiva a vi spremni da
• Strukturu MySQL-ovih direktorijuma
sledi te gradivo iz preostalog dela knjige. Trebalo bi da ste dosad obavili sledeće:
• Pregled izvršnih datoteka
• Preuzeli najnoviju binarnu verziju MySQL-a za vaš operativni sistem s Web loka-
• Pregled korisničkih interfejsa
cije mysql.com.
• Kratak uvod u MySQL monitor.
• Instalirali je- pomoću instalacionog programa (na Windowsu ili OS X-u) ili
pomoću alatke RPM.
• Podesili server tako da se automatski pokreće pri podizanju sistema, ako je to u truktu ra MySQL- ovih direktorijuma ..
vašem slučaju prihvatljivo. l J ovom poglavlju pretpostavićemo da ste instalirali MySQL na standardnu lokaciJU na
• Napravili datoteku opcija. vom operativnom sistemu. Ako ste ga instalirali na drugo mesto, osnovna struktura
• Prvi put se prijavili na server i odjavili s njega. dlll'ktorijuma biće ista, ali će kerenski direktorijum biti drugačiji.
• Zadali lozinku za nalog root. Ukoliko vam je proizvođač isporučio sistem sa već instaliranim MySQL~om:.
11uktura direktorij uma će se možda razlikovati. Na primer, ako Imate dJstn~uCIJU v .
• Izbrisali anonimne naloge.
l~l'd Hat 9, otkrićete daje organizacija datoteka izmenjena tako da se uklop~ u op.s:1
• Napravili nov nalog i lozinku za svoje svakodnevne programerske poslove. ,1,tcm skladištenja 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
Vežbe tt ovoj knjizi. .. .. v v.. v ••
lill ajte u vidu i to da će struktura direktonJuma b1t1 nes~o dru gaCIJa sto zavisi od tog~
Instalirajte MySQL na lokalni sistem prema postupku opisanom u ovom poglavlju,
ukoliko još niste to uradili. ~ 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 preporučeno u poglavlju 1, u odeljku "InstaliranJe
U sledećem poglavlju MySQL-a". . . . ..
U poglavlju 2",Kratak obilazak", pogledaćemo komponente vaše instalacije MySQL-a, Ako imate operativni sistem srodan Unixu, standardm kerenski dJrektonJUm za .
ponovo ćemo pogledati korisničke interfejse i osnovni način upotrebe MySQL-a. MySQL-ove datoteke je /usr/locallmysql. Ako imate Windows, standardm kerenski
ducktorijumje C:\mysql.
/U rUylctVIJt: L 1'\.ldldl\. UVIIOLO" Pregled korisničkih interfejsa 21
U tom direktorijumu naći ćete, između ostalog, sledeće poddirektorijume (pod Kroz celu ovu knjigu koristićemo programe mysqld i mysql, a na druge pomenute
pretpostavkom da ste instalirali MySQL iz binarne distribucije): programe vrati ćemo se u petom delu, "Administriranje MySQL-a".
• bin: U ovom direktorijumu nalaze se MySQL server, klijentski programi i više Pogledajte sadržaj direktorijuma scripts. Programi koji se u njemu nalaze su skrip-
drugih korisnih programa u prevedenom obliku. Sadržaj tog direktorijuma opi- tovi koji se interpretiraju, a ne programi u prevedenom obliku, kao u direktorijumu
h111. Upotrebu nekih među njima opisaćemo kada vam budu zatrebali u ovoj knjizi.
san je u narednom odeljku ovog poglavlja.
• scripts: Ovaj direktorij um sadrži grupu skri p tova napisanih na jeziku Perl koji Najvažniji od onih koje ćemo koristiti u ovoj knjizi jeste mysqlhotcopy, koji služi za
obavljaju korisne poslove. Objasnićemo ih detaljnije u narednom odeljku ovog 111 adu rezervnih kopija baze podataka. (Tu temu razmatramo u poglavlju 14, "Izrada
11'zervnih kopija i obnavljanje podataka".)
poglavlja .
• data: Ovo je direktorij um u kojem će se čuvati vaši podaci.
• does (Linux) ili Does (Windows): U ovom direktorijumu naći ćete dokumenta- Pregled korisničkih interfejsa
ciju o MySQL-u, u HTML formatu. MySQL-u možete pristupati pomoću više korisničkih interfejsa, ili klijentskih pro-
• sql-bench (Linux) ili bench (Windows): U ovom direktorijumu nalaze se pro- gl.l!na.Tri najpopularnija korisnička interfejsa su: mysql (u obliku komandne linije),
poznat i kao MySQL monitor, MySQL Control Center (ili, skraćeno, MySQLCC)
grami za testiranje MySQL-a.
1 phpMyAdmin.
Postoji još nekoliko drugih direktorij uma u koje će prosečan korisnik retko zala-
MySQL monitor je uključen u osnovnu instalaciju MySQL-a, a komande se
ziti. To su: include (sadrži datoteke zaglavlja), lib (biblioteke funkcija koje MySQL
:.ulaju preko komandne linije. On uvek postoji u svim instalacijama, jednostavno se
koristi), share (sadrži tekst poruka o greškama koje MySQL šalje) i example (postoji
l o listi i radi na svim platformama.
samo na Windowsu, sadrži primere upotrebe datoteke libmysql.DLL). Ako instalirate
MySQL Control Center (MySQLCC) jeste grafički korisnički interfejs. Napisan je
drugi softver (kao što je PHP) koji se povezuje s MySQL-om, može vam zatrebati da
pomoću skupa alatki za izradu prozora Qt, koji omogućava izradu verzija za različite
znate gde se ti direktorijumi nalaze ali malo je verovatno da ćete nešto direktno
pl.1tforme. U vreme pisanja ove knjige, MySQLCC je na raspolaganju za Unix i Win-
menjati u njima. dows, a planirana je i verzija za OS X.
phpMyAdrninje Web korisnički interfejs za upotrebu MySQL-a. Veoma je popu-
Pregled izvršnih datoteka 111 an među dobavljačima Internet usluga koji svojim korisnicima stavljaju na raspola-
MySQL-ove izvršne datoteke nalaze se u direktorijumima bin i scripts. Pogledajmo go~~~jc MySQL radi razvijanja Web aplikacija.
najpre direktorijum bin. Ako imate instaliran MySQL, imate i MySQL monitor. MySQLCC je zvanični
U njemu ćete naći izvršnu datoteku mysqld ili datoteku s nekim drugim imenom, pwizvod za rad s MySQL-om, ali u zavisnosti od verzije MySQL-a koju imate,
što zavisi od operativnog sistema koji imate. To je program MySQL servera koji ste u 111nžda ćete morati da ga posebno preuzmete sa adrese:
poglavlju 1 podesili tako da se automatski pokreće zajedno sa operativnim sistemom. www.mysql.com/downloads/mysqlcc.html
Tu ćete naći i mysql, MySQL monitor. To je osnovni klijentski program sa mter- MySQLCC se izuzetno lako instalira, a uputstva o tome naći ćete na adresi:
fejsom u obliku komandne linije. . www.mysql.com/products/mysqlcc/install.html
Osim ova dva najvažnija programa, naći ćete i više drugih. Upotrebu mnogih od
njih opisaćemo u pojedinim poglavljima ove knjige. Ovde ćemo navesti samo neke phpMyAdmin možete preuzeti sa adrese:
među najkorisnijim: www.phpmyadmin.net/
• mysqladmin: Služi za obavljanje administrativnih funkcija. Ako želite da sami instalirate phpMyAdmin, morate imati funkcionalan Web ser-
• myisamchk: Služi za proveru i popravljanje oštećenih MyiSAM tabela. n·l 1 instaliran PHP.
Za potrebe ove knjige, nevažno je koji ćete korisnički interfejs odabrati. Svi nude
• mysqldump: Omogućava izradu rezervnih kopija baze podataka.
Jl'dnaku osnovnu funkcionalnost. Upite unosite u obliku teksta, a rezultati se prika-
• mysqlbinlog: Omogućava čitanje dnevnika izmena, što je ključno za opora-
:tiJll takođe u obliku teksta, bez obzira na korisnički interfejs koji upotrebite.
vljanje baze u slučaju katastrofalne greške. i>rimeri koje dajemo u ovoj knjizi testirani su pomoću MySQL monitora, ali vi
• mysqlshow: Služi za prikazivanje podataka o bazama podataka i njihovim 1110Žete koristiti šta god vam odgovara- mysql, MySQLCC, phpMy Admin ili koji god
tabelama. 111u~i klijentski program nađete na Internetu. Za neke poslove biće potrebno da izađete
it kn ns n ičkog interfejsa i upotrebite koma n dno okruženje operativnog sistema.
22 Poglavlje 2 Kratak obilazak
Sažetak
Kratak uvod u MySQL monitor tHiređenoj bazi podataka. Ako dobijete poruku o tome, izaberite drugu bazu podataka
Sada ćemo ukratko opisati osnovni način upotrebe MySQL monitora. Prijavljivanje za p.1 pokušajte ponovo.)
rad u mysql opisali smo u prvom poglavlju. Samo da vas podsetimo, u MySQL moni- Pošto izaberete bazu podataka, možete videti koje se sve tabele nalaze u njoj, ako
tor prijavljujete se pomoću sledeće komande: 111 kll Cate komand ll:
mysql -u username -p 11 1iow tables;
Ovaj klijentski program ima nekoliko opcija koje mogu biti korisne. Ako usposta- Podatke o određenoj tabeli možete dobiti pomoću komande:
vljate vezu s MySQL-ovom bazom podataka koja se nalazi na drugom računaru, til ncri be tablename;
možete upotrebiti opciju -h da biste zadali ime tog računara; na primer: Iz MySQL monitora možete se odjaviti tako što otkucate:
mysql -h imeračunara -u imekorisnika -p \q
U MySQL-uje zaista korisna opcija --i-am-a-dummy. Isti rezultat postižete i
bratite pažnju na to da se ova komanda ne završava znakom tačka i zarez. Postoji
pomoću opcije --safe -update s. Na primer:
l', illpa komandi koje počinju znakom\ (obrnuta kosa crta). Nijedna od njih ne zavr-
mysql --i-am-a-dummy -u root -p ,, va se znakom tačka i zarez. Spisak tih komandi možete dobiti ako otkucate:
Ova opcija ograničava štetu koju biste mogli da načinite pomoću zadate komande. \h
To je naročito korisna opcija (na raspolaganju samo u alatki u kojoj se komande (Slovo h potiče od reči help.)
zadaju na komandnoj liniji) kada se kao početnik malo pribojavate rada u MySQL-u.
MySQL-ove i SQL-ove komande možete upisivati direktno ll MySQL monitor.
Možda bi bilo dobro daje koristite dok čitate ovu knjigu. (Konkretno, ova opcija vas
Ml'tlutim, te komande možete takođe uneti u datoteku koju zatim izvršite jednom
sprečava da ažurirate ili izbrišete redove u tabelama ako ne zadate vrednost primarnog
~ o111andom, kao skript. To ćete raditi u nastavku ove knjige, npr. kada u poglavlju 4,
ključa tih redova. Ako još ne znate šta to tačno znači, nemojte brinuti. Sve će postati
,. l 'r avljenje baza podataka, tabela i indeksa", budete pravili baze podataka.
jasno u trećem delu knjige, "Upotreba MySQL-a".)
Ako ste prijavljeni u MySQL monitor, datoteku koja sadrži komande možete izvr-
Pošto se prijavite u MySQL, možete videti koje sve baze podataka postoje, ako dir kad otkucate:
zadate komandu SHOW:
""ree imedatoteke
show databases;
Ukoliko niste prijavljeni u MySQL monitor, datoteku s komandama možete
Kod većine čitalaca, u ovoj fazi rezultat ove komande biće kratak spisak baza poda- rr.vršiti preusmeravanjem rezultata te datoteke; na primer:
taka. Trebalo bi da se na vašem spisku pojavi baza podataka mysql. To je sistemska
my oql -u imekorisnika -p e imedatoteke
baza podataka u kojoj se čuvaju podaci o korisničkim nalozima i njihovim pravima.
Više reči o tome biće u nastavku ove knjige. Ovim ste stekli osnove o načinu upotrebe klijentskog programa mysql.
Obratite pažnju na to da se komanda završava znakom tačka i zarez. Većinu
komandi koje otkucate u MySQL monitoru morate završiti tim znakom inač e ih ažetak
MySQL neće izvršiti. Otkucajte:
• Najvažniji direktorijumi u instalaciji MySQL-ajesu bin (izvršni programi), data
show databases
(podaci iz baze podataka) i does (dokumentacija).
i zatim pritisnite Enter. MySQL će samo mirno čekati. Ako potom otkucate znak tačka
• Dva programa koja ćete n;Učešće koristiti jesu mysqld (MySQL server) i mysql,
i zarez i pritisnete taster Enter, komanda će biti izvršena. To omogućava da složene klijentski program u kojem se komande zadaju preko komandne linije.
komande raspodelite u više redova da bi bile čitljivije. Umesto znaka tačka i zarez,
• Možete birati između više korisničkih interfejsa, odnosno klijentskih programa.
možete upisati \g (obrnuta kosa crta i slovo g), ali većina koristi tačku i zarez.
Pomenuli smo mysql (interfejs u obliku komandne linije) , MySQLCC (grafički
Možete izabrati neku bazu podataka sa liste i otkucati sledeću komandu:
interfejs) i phpMyAdmin (Web interfejs).
use imebaze; • Program mysql ima više korisnih opcija koje možete zadati na njegovoj komand-
(Upišite tačno ime baze kojoj želite da pristupite.) noj liniji. Pomenuli smo -u (kojom se zadaje ime korisnika), -p (prijavljivanje
Time navodite MySQL-u da želite da radite sa određenom baz<?m podataka. Izabe- s lozinkom), -h (kojom se zad;Ue ime udaljenog računara) i --i-am-a-dummy
rite jednu sa spiska i otkucaj te ovu komandu. (Možda nećete imati prava da pristupite (za ogranič:lvanjc moguće štete).
24 Poglavlje 2 Kratak obilazak
U sledećem poglavlju
• Pošto se prijavite na server, možete izdati komande SHOW DATABASES ili SHOW Vežbe
TABLES da biste dobili spisak objekata u sistemu, ili komandu DESCRIBE imeta-
l'r t·uznute i instaliraj te neki grafički ili Web korisnički interfejs, kao što je MySQLCC.
bele da biste dobili podatke o određenoj tabeli.
Vt·zbajte prijavljivanje i prikazivanje spiska postojećih baza podataka pomoću klijent-
• Iz MySQL servera možete se odjaviti pomoću komande \q. lo~ programa koji ste izabrali .
• Komande možete završavati znakom ; ili znakovima \g da biste ih poslali servem
na izvršenje .
• Datoteku koja sadrži komande možete izvršiti iz klijentskog programa pomoću
Odgovori
komande source imedatoteke, ili izvan klijentskog programa- preusmerava-
njem rezultata datoteke.
fl1lanja
l. d
) a
Pitanja \. e
l. Program MySQL server nalazi se u l. e
a) direktorijumu does ili Does 'l . b
b) direktorijumu lib
e) direktorijumu scripts
d) direktorijumu bin
U sledećem poglavlju
l J poglavlju 3, "Ubrzani kurs projektovanja baza podataka", razmotri ćemo opšte kon-
2. Dokumentacija o MySQL-u nalazi se u
' qllt:u vezi s bazama podataka, terminologiju i principe projektovanja, uključujući i
a) direktorijumu does ili Does
rrnrrnalizaciju.Ako niste početnik u oblasti baza podataka, ali ste početnik u MySQL-u,
b) direktorijumu lib '" rrtorate detaljno pročitati to poglavlje.
e) direktorijumu scripts
d) direktorijumu bin
3. Program mysqlhotcopy nalazi se u
a) direktorijumu does ili Does
b) direktorijumu lib
e) direktorijumu scripts
d) direktorijumu bin
4. U MySQL monitoru
a) komande treba da se završavaju znakom tačka i zarez
b) komande treba da se završavaju znacima \g
e) može a) ili b)
d) ništa od prethodnog nije tačno
5. Opcija --i-am-a-dummy zadata u programu mysql
a) znači tačno to što piše
b) sprečava me da napravim previše štete dok učim SQL
e) sprečava me da uradim bilo šta osim prijavljivanja i odjavljivanja
d) ništa od prethodnog nije tačno
II
Projektovanje i izrada
baza podataka u MySQL-u
l ntiteti i relacij e
l hnovni elementi koje ćemo pokušati 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, možemo se opredeliti da evidentiramo podatke o zaposle-
111111.1 i službama u kojima rade. U tom slučaju bi zaposleni bio jedan entitet, a služba
11 ~nJoj radi- drugi. Relacije su veze koje postoje između entiteta. Na primer, zaposleni
t,tdi ll službi. "Radi u" je relacija (veza) između entiteta zaposleni i služba.
ltdacije mogu biti različitih vrsta. Postoje relacije tipa "jedan prema jedan", ,jedan
ptt'tlla više" (ili "više prema jedan", u zavisnosti od toga s koje strane relacije posma-
lt,tlt') 1., više prema više". Relacija tipa ,jedan prema jedan" povezuje samo dva entiteta.
JU ruyraVIJI:: J VUILdfll ~ur~ fHUJI::~lUVdiiJd UdLd JJUUdld~d Koncepti 1 termrnologiJa oaza podataka
Ako bi svaki zaposleni u ovoj organizaciji imao svoju pregradu s pisaćim stolom, to bi l.tbele
bila relacija tipa ,jedan prema jedan". U primerima kao što je navedeni, ta veza "radi u" ~ tySQL je sistem za upravljanje relacionim bazama podataka (engl. Relational Database
češće je tipa "više prema jedan", tj. više zaposlenih radi u datoj službi .Tc dve vrste rela- \ ltiiWgement System, RDBMS), što znači da podržava baze u kojima postoje relacije
cija prikazane su na slici 3.1. 1 111\!du podataka koji se čuvaju u tabelama (engl. tables). Ako ste ikada koristili neki
i'ln~ram za tabelarne proračune, svaki njegov radni list ima oblik tabele s podacima.
11111llCr tabele je prikazan na slici 3.2.
emolovee
em loveeiD name ob departmentiD
~g
Noro edwards Programmer
1
Ben Smith
1
OBA l~
6651 Ajay Palal Programmer 128
!016 Candy Burnett Systems Administrator 128
Slika 3.2 U tabeli employee (zaposleni) čuvaju se šifre zaposlenih (employee ID),
Istraživanje i razvoj imena (name), poslovi kojima se bave Gob) i službe u kojima rade (departmentiD).
Kao što vidite, ova tabela sadrži podatke o zaposlenima u jednoj kompaniji. (Nisu
pr1bzani podaci o svim zaposlenima, već samo nekoliko primera.)
~~'
Nora
/111/r) koriste se kao sinonimi, ali tačnije je reći 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.
~-------'----"'
:ru.~.
B dovi, zapisi i n-torke
l'o~ledaj te ponovo tabel u employee. Svaki red te tabele predstavlja zapis o jednom
t.tposlenom. Možda ćete čuti izraze redovi (engl. rows), slogovi ili zapisi (engl. records)
Ajay 11i n- torke (engl. tup/es). Svaki red u ovoj tabeli sadrži podatke iz svih kolona tabele.
Slika 3.1 Relacija "nalazi se u" jeste tipa ,jedan prema jedan". Ključevi
Relacija "radi u" jeste tipa "više prema jedan". ..,. IIJII'rkijuč (engl. superkey) je kolona (ili grupa kolona) koja jednoznačno identifikuje red
t.tbele. Ključ (engl. key) je minimalni superključ. Pogledajte tabel u employee. Da bismo
)l'dnoznačno identifikovali svakog zaposlenog, možemo upotrebiti kombinaciju kolona
Imajte u vidu da entiteti, relacije i vrste relacija među njima zavise od okruženja i
t'ntployeeiD i name, ili koristiti kombinaciju svih kolona (employeeiD, name, job,
poslovnih pravila koje pokušavate da modelujete. Na primer, u nekim firmama jedan
tkpartmentiD). Obe kombinacije su superključevi.
zaposleni može raditi u više službi. U tom slučaju bi relacija "radi u" bila tipa "više
Međutim, da bismo jednoznačno identifikovali svaki red tabele, nisu nam potrebne
prema više". Ako više ljudi deli istu pregradu ili kancelariju, onda relacija "nalazi se u"
sve te kolone, već je dovoljna samo jedna (na primer) employeeiD, odnosno mini-
nije tipa "jedan prema jedan".
Illa ina grupa kolona pomoću koje nedvosmisleno identifikujemo svaki red. Prema
Kada projektujete bazu podataka, morate uzeti u obzir pravila koja važe u sistemu
tome, ključ je kolona employeeiD.
koji modelujete. Ne postoje dva potpuno jednaka sistema.
Pogledajte ponovo tabelu employee. Jednog zaposlenog možemo identifikovati po
1111enu (name) ili po šifri zaposlenog (employeeiD). Obc kolone su ključevi. Tc klju
(·l'vc nazivan~ o kandidati za k(j11fc1Jl' (engl. candidate kcys) jer su to mogući bndid~ti
1.( t'UYičlVIJC:: J UUfLčlnl KUf~ prUJC::KlUVčlnJčl UčlLčl pUUčllčlKčl nmc1p1 prUJC::KlUVčlnJčl UčlLčl pUUtlliiKil
među kojima ćemo izabrati primarni (engl. pri mary) ključ. Primarni ključ je kolona ili H dundantnost i gubljenje podataka
grupa kolona pomoću koje ćemo jednoznačno identifikovati pojedine redove tabele. l Hla projektujemo šemu baze podataka, to moramo uraditi tako da redundantnost
U ovom slučaju, za tu namenu koristićemo kolonu employee ID. To je bolji ključ od Jlndataka bude minimalna, ali da pri tome ne izgubimo nijedan podatak koji namje
kolone name jer se često događa da dve osobe imaju isto ime i prezime. 111 llphodan. Redundantni podatak u ovom kontekstu znači da se isti podatak ponavlja
Spoijni ključevi (engi.Joreign keys) predstavljaju veze između tabela. Na slici 3.2 vidite 11 1azličitim redovima iste tabele ili u različitim tabelama baze podataka.
da kolona departmentiD sadrži brojeve koji predstavljaju šifre službi u kojima rade Zamislite da umesto dve tabele, employee (zaposleni) i department (službe), imamo
zaposleni. To je spoljni ključ; skup svih podataka o određenoj službi čuva se u drugoj 11110 jednu tabelu koja se zove employeeDepartment. To možemo izvesti ako tabeli
tabeli, u kojoj je primarni ključ kolona departmentiD. • IIIJlloyee dodamo kolonu departmentName tako da šema tabele postaje sledeća:
cmployeeDepartment(employeeiD. name, job, departmentiD, departmentName)
Funkcionalne zavisnosti Za svakog zaposlenog koji radi u službi čiji je šifra 128, Research and Development
Izrazjunkcionalna zavisnost (engi.Junctional dependency) koristi se ređe nego drugi koje (htt.1Živanje i razvoj), moramo da ponovimo podatak "Research and Development"
smo naveli, ali treba da shvatite njegovo značenje da biste razumeli postupak normali- ( Irb 3.3). Isto važi i za sve ostale službe kompanije.
zavanja o kojem će biti reči u nastavku ovog poglavlja.
Ako u datoj tabeli postoji funkcionalna zavisnost između kolone A i kolone B, koja
employeeDepartment
se može napisati kao A -7 B, vrednost u koloni A određuje vrednost u koloni B. Na employeeiD name ob de artmentiD de artmentName
ora_t:a_war s rogrammar ~.esearcn ana Ue\le opment
~~~ ·~
1
primer, u tabeli employee, kolona employeeiD funkcionalno određuje ime zaposlenog 6651
Ben Smith
~ayPatet
OBA
Programmer 128
Fmance
Research and Development
Research and Development
(a u ovom primeru i sve druge atribute). 9006 Candy Burn eU Systems Administrator 128
Principi projektovanja baza podataka Jlodntaka, moramo uvek imati u vidu oba cilja, tj. manju redundantnost podataka ali
Kada projektujemo bazu podataka, moramo razmotriti dva važna pitanja: lll'z gubljenja informacija.
• Koje sve podatke treba čuvati, odnosno o kojim sve stvarima ili entitetima Anomalije
moramo da čuvamo podatke? /\11omalije su nešto složeniji koncept. To su problemi koji se pojavljuju među poda-
• Koju ćemo vrstu pitanja postavljati bazi podataka? (Pitanja bazi podataka zovu se ' 1111.1 zbog loše osmišljene strukture baze podataka. Mogu se pojaviti tri vrste anoma-
upiti.) lq.t, koje ćemo opisati na primeru loše osmišljene Šeme sa slike 3.3.
Kada tražimo odgovore na ova pitanja, moramo uzeti u obzir poslovna pravila
organizacije koju pokušavamo da modelujemo, o čemu sve moramo da čuvamo Anomalije pri dodavanju podataka
Allt111lalije pri dodavanju podataka nastaju kada u tabelu s loše osmišljenom struktu-
podatke i koje su veze između tih podataka.
llllll pokušate da unesete nove podatke. Zamislite da imamo novog zaposlenog koji
Na osnovu odgovora na ova pitanja moramo da napravimo bazu podataka čija će
poti nje da radi u kompaniji. Kada njegove podatke unosimo u tabelu, moramo da
struktura biti takva da isključuje strukturne probleme kao što su redundantnost (dupli-
1111csemo i šifi-u i naziv službe u kojoj radi. Šta se događa ako unesemo podatke koji se
ranje) podataka i anomalije podataka.
1,wlrkujr1 od postojećih u tabeli, npr. ako upišemo da novi zaposleni radi u službi čija
Jl' sili .1 42, J evl'lopment? Nakon toga više neće biti jasno koji redovi tn bele sadrže
1\jli.IVIIl' pod.1tkt• 'J(> .k Jll ii1H'I ,\IIOill:llijl' J11 i \IIIOŠl'IIJll pod;~(;1k;l.
ll t'll91ilVIJe J uorzant Kurs proJeKwvanJa oaza pooaraKa NormattzovanJe
nom strukturom. Zamislite da svi zaposleni iz službe čija je šifra 128 daju otkaz (možda 6651
9006
,AJay Palal
Candy Burnett
Programmer
Systems Administrator
128
128
VB, Java
NT, Linu)(
zato što im je sve dojadilo). Pošto izbrišemo sve zapise o tim zaposlenima, više nemamo
nijedan zapis u kojem se pominje služba sa šifrom 128, niti njeno ime. To je primer Slika 3.4 Ova Šema nije u prvoj normalnoj formi zato što kolona
skills sadrži grupu vrednosti.
anomalije pri brisanju.
Anomalije pri ažuriranju podataka Svaka vrednost u toj koloni sastoji se od kombinacije drugih vrednosti, tj. umesto
Anomalije pri ažuriranju podataka nastaju kada se ažuriraju podaci u tabeli s loše osmi- d.1sadrži prostu vrednost kao što je Java, kolona sadrži listu vrednosti, kao što je e,
šljenom strukturom. Zamislite da je rukovodstvo donelo odluku da služba čija je šifra l ' t l , Java. Time je prekršena pravilo prve normalne forme.
128 promeni ime u EmergingTechnologies. U tom slučaju moramo izmeniti podatke Da bismo ovu šemu doveli u prvu normalnu formu, moramo razdvojiti vrednosti
pojedinačno za svakog zaposlenog koji radi u toj službi. Lako se može dogoditi da nekog 11 koloni skills na proste elemente. To se može obaviti na više načina. Prvi i možda naj-
izostavimo.Ako se to desi, imaćemo anomaliju pri ažuriranju. ' n tglcdniji način prikazan je na slici 3.5.
koje dozvoljavaju veći broj nepopunjenih atributa. Ako želimo da evidentiramo da na 7513
Nora Edwards
Nora Edwards
Pro grammar
Pro grammar 12e Java
9642 Ben Smith OBA 42 082
svakih sto ili više zaposlenih jedan od njih ima posebne kvalifikacije, u tabelu employee 6651 Ajay Patel Programmer 12e VB
6651 Ajay Patel Pro grammar 128 Java
ne bismo dodali novu kolonu za tu vrstu podataka jer bi za 99 drugih zaposlenih ta 9006 Candy Burnett Systems Administrator 12e NT
9006 Candy Bumett Systems Administrator 12e Linux
kolona sadržala vrednost NULL. Umesto toga napravili bismo novu tabelu u kojoj bi se
čuvale šifre i kvalifikacije samo zaposlenih koji ih imaju. Slika 3.5 Sve vrednosti sada su proste.
U ovom slučaju napravili smo jedan red po stručnoj kvalifikaciji. Ova šema je sada
Normalizovanje 11 prvoj normalnoj formi.
Normalizovanje je postupak koji omogućava ispravljanje loše osmišljene strukture Razume se, ova organizacija podataka je daleko od savršene jer imamo veliku
baze podataka. U ovom odeljku o normalizovanju opisujemo normalne forme, što su ~t • dundantnost- za svaku kombinaciju stručna kvalifikacija/zaposleni u tabeli čuvamo
grupe pravila o tome šta treba i šta ne treba da bude u strukturama tabela. Tokom ~ VL' podatke o zaposlenom.
postupka normalizovanja, tabele se razbijaju na manje tabele koje čine bolju strukturu. Bolje rešenje i pravilan način organizovanja ovih podataka u prvu normalnu formu
Da biste pratili postupak normalizovanja, na strukturu baze podataka primenićemo prikazano je na slici 3.6.
redom sve tri normalne forme. U svakoj nomalnoj formi obično se polazi od pretpo-
stavke daje šema baze podataka već u prethodnoj normalnoj formi. Da bi baza poda- employee
taka bila u drugoj normalnoj formi, mora prethodno biti dovedena u prvu normalnu employeeiD name ob departmentiD
1 Nora Edwards ':'rogrammer
~:~ l~
1
formu a da bi bila u trećoj normalnoj formi, mora prethodno biti dovedena u drugu 6651
Ben Smith
Ajay Patel
OBA
Pro grammar 12e
9006 Candy Burnett Systems Administrator 12e
normalnu formu itd. U svakoj fazi normalizovanja dodajemo nova pravila koja Šema
mora da ispuni. employeeSkills
employeeiD skill
U ovom primeru, preneli smo stručne kvalifikacije u zasebnu ta belu koja služi '!''::!belu moramo razdvojiti na više tabela u kojima su svi atributi koji nisu deo pri -
samo da poveže šifre zaposlenih s pojedinim kvalifikacijam.a. Time smo rešili problem liLl rnog ključa funkcionalno potpuno zavisni od primarnog ključa. U ovom slučaju je
redundantnosti. ''' 1glcdno da to možemo postići ako tabelu razdvojimo na dve tabele:
Možda se pitate kako smo došli do drugog rešenja. Postoje dva odgovora.Jedan je: employee(employeeiD, name, job, departmentiD)
na osnovu iskustva. Do drugog odgovora dolazimo ako nastavimo primenu postupka <.'mployeeSkills( employeeiD, skill)
-----------------
normalizovanja na šemu sa slike 3.5; u tom slučaju, na kraju dobijamo Šemu sa slike 'lb je Šema prikazana na slici 3.6.
3.6. Prednost iskustva je to što omogućava predviđanje i direktan prelazak na prav1lnu
Kao što je već opisano, ova šema je u prvoj normalnoj formi zato što su sve vred-
strukturu, ali sasvim je prihvatljiva i bukvalna prime na postupka.
ll osti proste. Ona je takođe u drugoj normalnoj formi zato što svaki atribut koji nije
dl' o primarnog ključa sada je potpuno zavisan od svih delova primarnog ključa.
Druga normalna forma
Pošto postavimo šemu u drugu normalnu formu, možemo je preneti u naredne nor- Ir ·ća normalna forma
malne forme višeg stepena, koje se nešto teže razumeju. I'1111Ckad ćete čuti nekoga da kaže: "Normalizovanje se tiče ključa, celog ključa i ničeg
Kaže se daje šema u drugoj normalnoj formi (koja se takođe zove 2NF), ako su svi
t11t1gog osim ključa". Druga normalna forma nalaže da atributi moraju zavisiti od
atributi koji nisu deo primarnog ključa funkcionalno potpuno zavisni od primarnog 1 1 log ključa. Treća normalna forma propisuje da atributi zavise samo od ključa.
ključa i šemaje već u prvoj normalnoj formi. Šta to tačno znači? To znači da svaki atri-
1:ormalno, da bi Šema bila u trećoj normalnoj formi (3NF), moramo ukloniti sve
but koji nije deo primarnog ključa mora biti funkcionalno zavisan od svih delova pri- li.lllzitivne zavisnosti i šema mora već biti u drugoj normalnoj formi. U redu, ali šta je
marnog ključa, tj. ako primarni ključ čini više kolona, svi ostali atributi tabele moraju lidll:titivna zavisnost?
biti zavisni od kombinacije svih tih kolona. Pogledajte ponovo sliku 3.3. Prikazana je sledeća šema:
Pogledajmo primer da bi postalo jasnije. l'mployeeDepartment( employeeiD, name, job, departmentlD, departmentName)
Pogledajte sliku 3.5. U toj šemi, tabela sadrži jedan red po zaposlenom i po stručnoj
kvalifikaciji. Ta tabela je u prvoj normalnoj formi, ali nije u drugoj. Zbog čega? Ova Šema sadrži sledeće funkcionalne zavisnosti:
Šta je primarni ključ te tabele? Znamo da primarni ključ mora jednoznačno identifi- l'mployeeiD -7 name, job, departmentlD, departmentName
kovati svaki red tabele. U ovom slučaju, to je moguće samo pomoću kombinacije kolona dcpartmentiD -7 departmentName
employeeiD i skills. Ako je sadržaj kolone skills kao na slici, kolona employeeiD nije Primarni ključ je employeeiD i svi atributi funkcionalno su potpuno zavisni od
dovoljna za jednoznačno identifikovanje redova jer, na primer, vrednost em.ployeeiD "l''ga, što je lako razumljivo jer se primarni ključ sastoji od samo jednog atributa.
7513 postoji u tri reda. Međutim, pošto kombinacija vrednosti u kolonama employeeiD Međutim, vidljivo je i to da imamo:
i skills jednoznačno identifikuje svaki red, upotrebićemo je kao primarni ključ. Tako l'mployeeiD -7 departmentName
dolazimo do sledeće šeme:
l'tnployeeiD -7 departmentiD
employee(employeeiD, name, job, <J.e_p_'!l_'m"!~Đ~_I_.Q, skill)
Potom se moramo zapitati: "Koje sve funkcionalne zavisnosti postoje?" U ovom
dcpartmentiD -7 departmentName
slučajuimamo:
employeeiD, skill -7 name, job, departmentiD Obratite pažnju i na to da atribut departmentiD nije ključ.
ali i Ovaj odnos znači da je funkcionalna zavisnost employee ID -7 departmentName
employeeiD -7 name, job, departmentiD li,lllzitivna zato što postoji "međukorak" (zavisnost departmentiD -7 departmentName) .
Da bismo došli do treće normalne forme, moramo ukloniti ovu tranzitivnu zavisnost.
Drugim rečima, dovoljna nam je samo vrednost atributa em.ployeeiD da bismo Kao i u prethodnim formama, da bismo došli do treće normalne forme, tabel u raz-
odredili vrednosti ostalih atributa, tj. name,job i departmentiD.To znači da su ti atri- dv.l_J.lmo na više drugih tabela. U ovom slučaju takođe, prilično je očigledno šta bi trc-
buti funkcionalno samo delimično zavisni od izabranog primarnog ključa, odnosno lo.do da uradimo. Šemu d elimo na dve tabele, employee i department, na sledeći način:
vrednosti tih atributa mogu se odrediti samo na osnovu dela tog primarnog ključa a
l'mployee(employeeiD, name, job, ~_<:p_~:~~~~-~-t_I_J?.)
njegova cela vrednost nije neophodna. Prema tome, ova šema nije u drugoj normalnoj
d cpa rtmcnt( d epa rtmen t ID, departmentN ame)
formi.
Sledeće pitanje je: "Kako bismo je doveli u drugu normalnu formu?"
'18 Poglavlje 3 Ubrzani kurs projektovanja baza podataka
Pitanja 3
To nas vraća na šemu tabele employee prikazanu na slici 3.2. Ona je u trećoj nor- l'rmcipi projektovanja baza podataka
malnoj formi.
• Redundantnost se mora minimizovati, ali bez gublje~a podataka.
Drugi način da opišemo treću normalnu formu jeste da kažemo sledeće: fo~maln~,
ako je šema u trećoj normalnoj formi, za svaku funkcionalnu zavisnost u svakoj tabeh, • Anomalije pri dodavanju, brisanju i ažuriranju jesu problemi koji se pojavljuju
ispunjen je jedan od sledeća dva uslova: kada se u tabelu s loše osmišljenom strukturom podaci dodaju, brišu iz nje ili
ažuriraju .
• Leva strana funkcionalne zavisnosti je super ključ (tj. ključ koji nije obavezno
• lzbegavajte strukture koje dovode do velikog broja null vrednosti.
minimalan).
ili Normalizovanje
• Desna strana funkcionalne zavisnosti je deo svakog ključa te tabele.
• Normalizovanje je formalni postupak koji omogućava poboljšava~ e strukture
Drugi uslov se ne pojavljuje baš tako često! U većini slučajeva, sve funkcionalne baze podataka.
zavisnosti biće obuhvaćene prvim uslovom.
• Prva normalna forma (lNF) znači da kolone ili atributi sadrže isključivo proste
vrednosti.
Boyce-Coddova normalna forma
Poslednja forma koju ćemo - ukratko- razmotriti jeste Boyce-Cod~ova normalna • Druga normalna forma (2NF) znači da svi atributi izvan ključa mor;Uu zavisiti od
celog ključa.
forma, koja se ponekad naziva i BCNF. U prethodnom odeljku naveh ~mo ~~a usl.ova.
Da bi tabela bila u BCNF, mora biti u trećoj normalnoj formi i mora 1spumt1 prv1 od • Treća normalna forma (3NF) znači da ne sme biti tranzitivnih zavisnosti.
dva uslova, tj. sve funkcionalne zavisnosti moraju imati superključ na levoj strani. • IJoyce-Coddova normalna forma (BCNF) znači da svi atributi moraju biti funk-
Taj uslov je često automatski ispunjen i bez pred uzimanja posebn~hv mera, kao u cionalno određeni superključem.
ovom primeru. Ako imamo zavisnost koja krši ovo pravilo, moramo j OS jednom raz-
dvojiti tabelu da bismo je doveli u l NF, 2NF i 3NF. Pitanja
Superklj uč je
Normalne forme višeg stepena ..
Postoje i normalne forme viših stepena (četvrta, peta itd.) ali su one pogodmje za aka- a) Minimalni ključ
demske rasprave nego za praktičnu primenu na projektovanje b~za podataka. 3NF b) Spoljni ključ
(ili BCNF) sasvim. je dovoljna da reši te probleme redundantnost1 podataka na koje e) Grupa atributa koja jednoznačno identifikuje svaki red tabele
ćete naići.
d) Minimalna grupa atributa koja jednoznačno identifikuje svaki red tabele
1
Ako je tabela u drugoj normalnoj formi
Sažetak a) Takođe je u prvoj normalnoj formi
Za kraj, evo šta smo sve razmotrili u ovom poglavlju. b) Takođe je u trećoj normalnoj formi
e) Ne sadrži tranzitivne zavisnosti
Koncepti
d) Sadrži atribute koji nisu potpuno funkcionalno zavisni od primarnog ključa
• Entiteti su "stvari", a relacije su veze imeđu njih . l, Ako je tabela u trećoj normalnoj formi
• Tabele sadrže podatke koji se prikazuju u tabelarnom obliku.
a) Takođe je u Boyce-Coddovoj normalnoj formi
• Kolone tabela su atributi (obeležja) koji opisuju svaki entitet. b) Sadrži atribute koji nisu prosti
• Redovi tabela sadrže vrednosti iz svih kolona tabele .
e) Ne sadrži tranzitivne zavisnosti
• Ključevi omogućavaju jednoznačno identifikovanje pojedinih redova.
d) Sadrži atribute koji nisu potpuno funkcionalno zavisni od primarnog ključa
• Funkcionalne zavisnosti opisuju koji atributi određuju vrednosti drugih atributa. •1. Tri vrste anomalija nastaju pri
• Šeme su "nacrti" baze podataka.
a) dodavanju, učitavanju i brisanju podataka
b) dodavanju, ažurira~u i brisanju podataka
e) učitavanju, ažuriranju i brisanju podataka
40 Poglavlje 3 Ubrzani kurs projektovanja baza podataka
4
5. N-torka je
a) kolona
b) red
e) kandidat za ključ
d) vrsta narodnog kola
e) spoljni ključ
Pravljenje baza podataka,
Vežbe tabela i indeksa
1. Normalizujte sledeću šemu u treću normalnu formu:
Porudžbine(šifraKupea, imeKupea, adresaKupea, brojPorudžbine, datumPorudž-
bine, šifraRobe, nazivRobe, količinaRobe)
2. Pokušajte da osmisli te šemu koja je 3NF ali ne i u BC NF.
Trebalo bi da se najpre prijavite u MySQL monitor, na isti način na koji ste to činili l lgl.tvnom, identifikatori mogu sadržati sve znakove koji postoje, osim sledećih:
u poglavlju 1, "Instaliranje MySQL-a" i u poglavlju 2, "Kratak obilazak". • /.nakove navoda, znakove ASCII(O) i ASCII(255).
U ovom poglavlju koristi ćemo mogućnosti za definisanje podataka koje pruža jezik
• Imena baza podataka mogu sadržati sve znakove koji su dozvoljeni u imenima
SQL da bismo pravili baze podataka, tabele i indekse. Šta to tačno znači? SQL je skra-
1hrcktorijuma, ali ne i znakove koji imaju posebno značenje u imenima direkto-
ćenica od Structured Query Language (strukturirani jezik za upite), što je jezik koji
1 Uu ma (/, \ i .) , iz očiglednih razloga.
ćemo koristiti za izradu relacionih baza podataka i učitavanje podataka iz njih. Čine ga
dve semantički odvojene komponente: jezik za definisanje podataka (engl. Data Difini- • Imena tabela mogu sadržati sve znakove koji su dozvoljeni u imenima datoteka,
tion Language, DDL), koji omogućava formiranje struktura baze podataka), i jezik za rad osi m znakova . i l.
s podacima (engl. Data Manipulation Language, DML), koji omogućava pretraživanje ~vi identifikatori, osim alijasa, mogu se sastojati od najviše 64 znaka. Imena alijasa
baze podataka. (opt~ani su u poglavlju 7 ",Složeniji upiti") mogu sadržati najviše 255 znakova.
U narednim odeljcima saznaćete kako se u MySQL-u prave baze podataka, tabele jt•dno neobično pravilo u MySQL-u glasi da možete koristiti rezervisane reči kao
i indeksi. lo tlllflkatore, pod uslovom da ih pišete između navodnika. Na primer, možete imati
l ''" lu čije je ime TABLE . Razume se, ako je nešto dozvoljeno, to ne znači da to morate
'd •.t vezno i raditi, a u ovom slučaju, navedenu praksu bolje je izbegavati. Čak i ako se
Razlikovanje malih i velikih slova t 11 tome dobro snalazite dok radite s MySQL-om, to može zbuniti program mysql-
Pre nego što započnemo upotrebu jezika SQL i definišemo identifikatore MySQL-ovih d11111p, koji se često koristi za izradu rezervnih kopija baze podataka.
objekata, moramo ukratko objasniti razlikovanje malih i velikih slova u MySQL-u.
!'ostoji kratak spisak rezervisanih reči koje MySQL prihvata kao identifikatore bez
U rezervisanim rečima jezika SQL ne pravi se razlika između malih i velikih slova.
tt.tvodnika. To je suprotno ANSI standardu za jezik SQL, ali je prilično uobičajeno u
To je standardno u svim sistemima za rad s bazama podataka.
' tkodnevnim poslovima. Najčešći primeri na koje ćete nailaziti su upotreba rezervi-
Da li će MySQL praviti razliku između malih i velikih slova u imenima baza poda- litt h reči DATE i TIMESTAMP za imena kolona.
taka i tabela, zavisi od operativnog sistema pod kojim radite. Razlog je to što će
najčešće svakoj bazi podataka odgovarati određeni direktorijum, a svaka tabela biće
smeštena u odgovarajaću datoteku. Imena tih direktorijuma i datoteka slede različita Pravljenje baze podataka
pravila, koja zavise od operativnog sistema. ~~.tkon projektovanja strukture baze podataka, naredni korak je, savim logično, da
To praktično znači da ako koristite Windows, u imenima baza podataka i tabela neće "l' t semo MySQL-u da želimo da napravimo novu bazu podataka. To se radi pomoću
se praviti razlika između malih i velikih slova, ali će suprotno pravilo važiti ako koristite '><>L-ove komande CREATE DATABASE, na sledeći način:
neki operativni sistem iz porodice Unix. To može biti uzrok zbrke, naročito ako je vaš • ~~ate database employee;
operativni sistem OS X, koji možete podesiti tako da ne pravi razliku između malih i
Da li je ova komanda uspešno izvršena, možete proveriti ako izdate komandu:
velikih slova (HFS+, standardno podešavanje), ili naprotiv, da je uzima u obzir (UFS).
rhow databases;
Da biste smanjili mogućnost zbrke, korisno je da se naviknete da sve identifikatore
tretirate kao da je uključeno razlikovanje malih i velikih slova, čak i pod operativnim Trebalo bi da se ime nove baze podataka, employee, pojavi na spisku baza podataka
sistemom Windows. To će vam omogućiti da lako pređete na drugu platformu. 11,1 vašem računaru .
Namerna upotreba dva različita oblika istog identifikatora, npr. Zaposleni i zaposleni, Sada imate praznu bazu podataka koja čeka da u njoj napravite nekoliko tabela.
može zbuniti ljude koji čitaju vaš kod, pa zato izbegavajte da to radite.
U MySQL-u se u imenima kolona, indeksa i alijasa (o kojima će biti reči u
nastavku teksta) nikad ne pravi razlika između malih i velikih slova.
Biranje baze podataka
l'rc nego što u bazi podataka employee napravimo novu tabelu ili uradimo bilo šta
drugo u njoj, moramo obavestiti MySQL da želimo da radimo u našoj novoj bazi
ldentifikatori u MySOL-u podataka. To se radi pomoću komande use, na sledeći način:
Identifikator je opšta reč koja se odnosi na ime alijasa, baze podataka, tabele, kolone ili noe employee;
indeksa. To je način da se nedvosmisleno identifikuje određeni objekat. Pre nego što
Sada je izabrana (otvorena) baza podataka employee; za sve akcije koje izvršimo od
počnete da sami pravite baze podataka i tabele, moramo objasniti i koji su identifika-
s.tda pa nadalje, podrazumevaće se da se odnose na tu bazu podataka .
tori ispravni u MySQL-u.
44 Pog lavlje 4 Pravljenje baza podataka, tabela i indeksa t'raviJenJe tiltlcla
Kao što vidite, komanda počinje rečima create table, iza kojih sledi ime tabele 1 l lentiD int not null references client (clientiD),
koju bismo želeli da napravimo, a zatim dolazi grupa definicija svih kolona tabele. Na • 111ployeeiD int not null references employee (employeeiD),
WtJr·kda te date not null,
kraju komande možete po potrebi zadati tip mašine baze podataka koji biste želeli da
liours float,
se koristi. p t i ma ry key (clientiD, employeeiD, workdate)
lype= InnoDB;
Primer izrade tabele
Postupak ćemo ilustrovati primerom izrade tabele. U listingu 4.1 prikazana je grupa Pogledajmo jednu po jednu SQL-ove komande u ovoj datoteci.
SQL-ovih komandi koja formira bazu podataka employee. Unesite ih ručno, ili preuz- l'očc ćemo od:
mite datoteku (zajedno s nešto pro bnih podataka za bazu) sa Web lokacije posvećene ol t op database if exists employee;
ovoj knjizi.
()va komanda ispituje da li već postoji baza podataka čije je ime employee; ako
Listing 4.1 SQL-ove komande koje formiraju bazu podataka employee l'" ' toji, ona se briše, što vam "priprema teren", ako se tako može reći. To nije baš
111oph odno i može biti čak i opasno, ali ovde smo to uradili da bismo obezbedili da
drop database if exists employee;
111"·'1 skript za izradu baze podataka uvek bude delotvoran, čak i ako ste ranije nešto
create database employee;
l ' pcrim.entisali s bazom podataka employee.
use employee; Ukoliko MySQL koristite u okruženju čiji niste vlasnik, može se dogoditi da kom-
l'.llliJJ koja iznajmljuje prostor na svojim serverima zabrani upotrebu komande drop
create table department 1.11 , ba se. U tom slučaju uklonite taj red iz skripta (ali proverite da ne postoji baza
(
pnd.ltaka čije je ime employee) .
departmentiD int not null auto increment primary key,
name varchar(30) Z atim fonniramo bazu podataka i otvaramo je (biramo da je koristimo), kao što ste
type=InnoDB; 1 1111j c radili:
11 c1te database employee;
create table employee 11w employee;
employeeiD int not null auto increment primary key, Sada počinjemo izradu tabela unutar te baze podataka. Najpre pravimo tabelu
name varchar(BO), 'it'partment, na sledeći način:
job varchar (30), 1" 1 .a te table department
departmentiD int not null references department(departmentiD) (
type=InnoDB; departmentiD int not null auto increment primary key,
name varchar(20)
create table employeeSkills Lype =InnoDB;
employeeiD int not null references employee(employeeiD), Ova tabela ima dve kolone, departmentiD (šifra službe), koja je primarni ključ,
skill varchar(l5) not null, 1 tl.lmc (naziv službe). Kolone tabele deklarišemo tako što zadamo listu deklaracija
primary key (employeeiD, skill) kolona razdvojenih zarezima, a lista je uokvirena zagradama. Atribute kolone ne
type=InnoDB;
111nratc razdvojiti zarezima- oni su obavezni samo za deklaracije kolona.
create table client Ovo je naša prva SQL komanda koja se rasprostire u više redova. Budući da su
ll.il'ziku SQL razmaci nebitni, komande možemo pisati u obliku koji nam najbolje
client ID int not null auto increment pri mary key', od govara. Uobičajeno je da se stavke komande CREATE pišu svaka u svom redu, da bi
name varchar(40), l l'l,l komanda bila č itUivija . Interpretator jezika QL ne ć e pokušati da rastuma č i vaŠlt
address varchar(lOO),
46 !'oglavlJe 4 l'raviJCnJe oaza podataKa, tabela 1 mdeKsa l'raviJenje tabela
komandu dok ne otkucate završni znak tačka i zarez (;) i pritisnete taster Enter. Šta to tačno znači? MySQL podržava razne mašine baze podataka, koje ćemo detalj
(Možete se opredeliti i da komande završavate znacima \g, ali se znak tačka i zarez nije razmotriti u poglavlju 9, "Tipovi tabela u MySQL-u". Standardni tip je My ISAM.
znatno češće koristi.) Ako želite da koristite My ISAM tabele, nije neophodno da na kraj komande create
U ovoj tabeli deklarišemo dve kolone. Svaka deklaracija kolone počinje imenom database dodate odredbu type.
kolone, za čime slede podaci koji opisuju tip te kolone. Pogledajte najpre drugu U ovom slučaju potrebne su nam InnoDB tabele zato što ćemo u nekoliko primera
kolonu ovog primera jer se nešto lakše razume. Deklaracija koristiti spoljne ključeve. Mašina baze podataka InnoDB podržava spoljne ključeve i
name varchar(20) lra nsakcije, što nije na raspolaganju u tabelanu tipa MyiSAM. MyiSAM tabele često
H l brže od InnoDB tabela. Za svaku tabelu morate razmotriti koji je tip najprikladniji .
opisuje da je ime kolone name a njen tip je varchar (2 o) .Tip podataka varchar znači
Mogli smo da zadamo tabele različitih tipova i da imamo, na primer, nekoliko
daje u pitanju znakovna vrednost promenljive dužine, koja u ovom slučaju može
lnnoDB tabela i nekoliko MyiSAM tabela (pa čak i tabele još nekih drugih tipova,
sadržati najviše 20 znakova. Mogli smo da zadamo i tip char, što je znakovna vrednost
ukoliko je potrebno), ali jednostavnosti radi, u ovom primeru koristi ćemo isključivo
fiksne dužine. Bez obzira na to da li zadate varchar ili char, način rada s tim poda-
lnnoDB tabele.
cima se neće razlikovati, jedina razlika je u obliku u kojem se ti podaci smeštaju u
Pogledajmo drugu komandu create table:
memoriju. Podatak tipa varchar (2 o) zauzima onoliko prostora koliko je potrebno za
skladištenje stvarnog broja znakova, dok podatak tipa ch ar ( 2 o) uvek zauzima 20 zna- crea te table employee
kova, bez obzira na to da lije u njega smeštena bilo kakva vrednost.Više o relativnim
employeeiD int not null auto_increment primary key,
prednostima i nedostacima ovih tipova podataka biće reči odeljku "Tipovi podataka u name varchar(BO),
kolonama", u nastavku ovog poglavlja. job varchar (15) ,
Pogledajmo sada definiciju prve kolone, koja izgleda ovako: departmentiD int not null references department(departmentiD)
t ype=InnoDB;
departmentiD int not null auto_increment primary key,
U ovoj komandi samo je jedan deo sintakse nov. Posle dnja kolona tabele employee
Ime ove kolone je department ID, a njen tip je int (integer). To je jedinstven broj
JL' šifra službe (departmentiD) u kojoj zaposleni radi. To je spoljni ključ. U definiciji
(ne ponavlja se) koji ćemo koristiti za identifikovanje pojedinih službi i odeljaka
t.1bele to se deklariše pomoću odredbe references, na sledeći način:
kompanije.
Deklaraciji tipa podataka kolone slede dodatni podaci o koloni. departmentiD int not null references department(departmentiD)
Prvo smo zadali da je ta kolona tipa not null - drugim rečima , u svakom redu Ovom odredbom smo zadali da kolona departmentiD tabele employee referencira
tabele, ta kolona mora sadržati neku vrednost. kolonu (povezana je s kolonom) department ID tabele department.
Drugo, zadali smo daje ta kolona takođe tipa auto_increment. To je veoma Imajte u vidu da sintaksu za spoljni ključ možemo koristiti zato što je tabela
korisna mogućnost MySQL-a. Kada unesemo nov red u tu tabel u, ako ne zadamo employee tipa InnoDB. Kada koristite My ISAM tabele, upotreba spoljnih ključeva
šifru službe, MySQL će sam do deli ti jedinstven broj koji će biti sledeći po redosledu nij e moguća. Prema planu razvoja, trebalo bi da spoljni ključevi u MyiSAM tabelama
auto_increment sekvence (niza). To će vam prilično olakšati život. hudu podržani i jednoj od budućih verzija MySQL-a, verovatno u verziji 5.1.
Na kraju, odredba primary key znači da će ta kolona biti primarni ključ tabele. Pogledajte sada treću komandu create table:
Ako se primarni ključ sastoji od samo jedne kolone, može se zadati u ovom obliku. Za create table employeeSkills
primarne ključeve sastavljene od više kolona mora se upotrebiti drugi oblik komande,
koji ćemo razmotriti u nastavku ovog poglavlja. employeeiD int not null references employee(employeeiD),
Time se završava definicija tabele department. A sada, pogledajte sam kraj SQL-ove s kill varchar(15) not null,
p rimary key (employeeiD, skill)
komande. Iza završne zagrade nalazi se sledeći red:
type=InnoDB;
type=InnoDB
U ovoj tabeli takođe imamo spoljni ključ; to je kolona employee ID. Zanimljivo u
Time se zadaje da tabela treba da koristi mašinu baze podataka InnoDB.Ako pažlji- vezi s definicijom ove tabele jeste to da ona ima primarni ključ koji se sastoji od dve
vije pogledate definicije tabela, uočićete da smo sve tabele deklarisali kao InnoDB kolone . Kao što vidite, deklarisane su dve kolone tabele, employeeiD i skill, a zatim
tabele. JC rasebno deklarisan primarni ključ u sledećem redu:
pt l.mary key (employeeiD, skill)
"Uli ld ll Ud \..nCJ-\ lC l J-\ DLC
48 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa
definicija_kolone:
Budući da u sintaksi definicija drugih tabela nema ničeg novog, nećemo ih detaljno
ime_kolone tip_podataka [NOT NULL l NULL] [DEFAULT
objašnjavati. Obratite pažnju na to da smo u tabeli assignment upotrebili nekoliko podrazumevana_vrednost ] [AUTO_INCREMENT]
novih tipova podataka: kolona hours (broj radnih sati) je tipa float, tj. broj s pokret- [PRIMARY KEY] [definicija_reference]
nim zarezom, a kolona workdate (radni dan) je datumskog tipa, date. U nastavku ili PRIMARY KEY (ime_indeksirane_kolone, .. . )
ovog poglavlja biće više reči o tim tipovim kolona. ili KEY [ime_indeksa] (ime_indeksirane_kolone, .. . )
Pomoću sledeće komande možete proveriti da li su tabele na vašem sistemu tačno ili INDEX [ime_indeksa] (ime_indeksirane_kolone, ... )
ili UNIQUE [INDEX] [ime_ind eksirane_kolone , ... )
podešene: ili FULLTEXT [INDEX] [ime_indeksa] (ime_indeksirane_kolone, ... )
show tables; ili [CONSTRAINT simbol] FOREIGN KEY [ime_indeksa]
(ime_indeksirane_kolone , ... )
Trebalo bi da dobijete sledeće rezultate: [definicija_reference]
+-------- ------------+ ili CHECK (izraz)
l Tables_in_employee l Pogledajmo detaljnije opcije koje postoje u opštoj definiciji.
+--------------------+ Rezervisana reč TEMPORARY omogućava izradu privremene tabele koja će biti
assignment
client dosegljiva samo u tekućoj sesiji, a kada se veza s bazom podataka zatvori, tabela se
department automatski briše.
employee Odredbu IF NOT EXISTS možete upotrebiti da biste napravili novu tabelu samo
employeeSkills ako ne postoji tabela s imenom koje ste zadali.
+--------------------+ Pomoću odredbe LIKE izvorna_ tabela možete napraviti novu tabelu koja ima
Detaljnije podatke o strukturi svake tabele možete dobiti pomoću komande des- istu Šemu kao izvorna tabela.
cribe; na primer: U komandi CREATE TABLE deklarišemo unutar zagrada kolone koje nam trebaju,
describe department; njihove tipove podataka i druge informacije koje se tiču strukture tabele. Najjednostav-
Trebalo bi da na svom ekranu dobijete rezultate nalik na sledeće: nija definicija kolone sastoji se samo od imena kolone i tipa podataka u koloni. U nared-
nom odeljku ovog poglavlja objasnićemo važeće tipove podataka za kolone tabele.
+--------------+-------------+-------------------+------+-----+---------+----------------+
1 Field l Type l Collation l Null l Key l Default l Extra l Svaku deklaraciju kolone možemo, po potrebi, proširiti sledećim opcijama:
+--------------+-------------+-------------------+------+-----+---------+----------------+ • Svaku kolonu možemo deklarisati kao NOT NULL ili NULL, što znači da ne dozvo-
1 departmentiD l int (ll) l bina:ry l l PRI l NULL l auto_increment l
1 name l varchar(20) l latinl_swedish_ci l YES l l NULL l l ljavamo da kolona sadrži vrednost NULL (opcija NOT NULL) ili da prihvatamo vred-
+--------------+-------------+-------------------+------+-----+---------+----------------+ nost NULL (opcija NULL). Podrazumeva se daje vrednost NULL prihvatljiva.
U ovoj fazi korisno bi bilo da proverite i ostale tabele. • Pomoću rezervisane reči DEFAULT iza koje sledi neka vrednost možete zadati
podrazumevanu vrednost za kolonu.
Komanda CREATE TABLE • Rezervisana reč AUTO_INCREMENT omogućava generisanje rednog broja, kao što
Pošto ste videli primer, možemo preći na opis cele sintakse komande CREATE TABLE. smo to učinili u prethodnom primeru.Ta vrednost, koja se automatski generiše
U MySQL-ovoj dokumentaciji stoji da komanda ima sledeći opšti oblik: biće za jedan veća od tekuće najveće vrednosti iz tabele. Prvi red podataka koji
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ime tabele un este u tabel u imaće redni broj l. Tabela može sadržati samo jednu kolonu tipa
[ (definicija_kolone, ... ) l AUTO_INCREMENT, koja mora biti indeksirana. Obratite pažnju na to da u prethod-
[ope i j e_ za_ tabel u] [komanda_ se l e ct l
nim primerima nismo ručno napravili nijedan indeks; međutim, neki su ipak bili
automatski napravljeni. Indeksi se automatski prave za kolone koje deklarišete kao
ili
primarne ključeve (PRIMARY KEY), a u ovom primeru to su sve kolone koje smo
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ime tabele LIKE deklarisali kao AUTO INCREMENT.
izvorna_ tabela; • Pojedine kolone možemo deklarisati kao primarne ključeve (odredba PRIMARY
KEY).
• Pojedine kolone možemo deklarisati kao spoljne ključeve, pomoću opcije REFE-
RENCES, kao u ovom primeru.
rU~IdVIJC .. rldVIJCIIJC UdLd fJUUdldl\d 0 ldUCid l IIIUCI\)d 1\.UIIIdllUd \..nC/"\1 C IMOLI:.
Osim imena kolona i tipova podataka u njima, u ovom delu komande CREATE Možemo zadati još nekoliko drugih opcija za tabel u, koje nisu obavezne ali dopri-
TABLE možemo zadati i dodatne podatke: ''"w pre svega optimizaciji. Neke među njima objasnićemo u poglavlju 18",0ptimi-
• Možemo zadati primarni ključ koji se sastoji od više kolona, kao u ovom pri- "v.tnje baze podataka" . To su sledeće opcij e:
meru, tako što iza opcije PRIMARY KEY navedemo imena kolona koje čine pri- • AUTO_INCREMENT = # Omogućava da u koloni tipa auto_increment zadate
marni ključ. Na taj način može se zadati i primarni ključ koji se sastoji od samo poč etnu vrednost različitu od 1.
jedne kolone. Kolona deklarisana kao PRI MARY KEY može sadržati samo jedin- • AVG_ROW_LENGTH = # Omoguć ava da zadate prosečnu dužinu reda da biste
stvene (neduplirane) vrednosti, za nju se automatski formira indeks i ne može "pomogli" mašini baze podataka.
sadržati vrednost null. • CHECKSUM = l Omogućava da uključite izračunavanje kontrolnog zbira u redo-
• Opcije INDEX i KEY su sinonimi i znače da će zadata kolona (ili kolone) biti vima tabele, što može biti korisno kada rešavate problem oštećenog sadržaja
indeksirana. Imajte vidu da u MySQL-u takve kolone ne moraju da sadrže tabele. Zadajte vrednost 1 da biste uključili izračunavanje. Ova opcija je stan-
jedinstvene vrednosti. dardno isključena a upotrebljiva je samo za My ISAM tabele.
• Pomoću opcije UNIQUE zadaje se da određena kolona može sadržati samo jedinst- • COMMENT = "tekst" Omogućava da tabeli pridružite neku napomenu.
vene vrednosti. Kolone deklarisane kao UNIQUE takođe se automatski indeksiraju. • MAX ROWS = # Ovom opcijom se zadaje maksimalan broj redova koji se može
• Pomoću opcije FULLTEXT zadajete da se formiraju indeksi za tekstualno pre- uneti u tabelu.
traživanje kolona tipa TEXT, CHAR ili VARCHAR. Indekse za tekstualno pretraživanje • MIN ROWS = # Ovom opcijom se zadaje minimalan broj redova koji tabela
možete koristiti samo s MyiSAM tabelama. Primer se nalazi u poglavlju 9. može sadržati.
• Opcija FOREIGN KEY omogućava da deklarišete spoljne ključeve na isti način kao • PACK_KEYS = {O l l l DEFAULT} MySQL standardno pakuje (komprimuje)
primarne ključeve. sadržaj indeksa znakovnog tipa- a to su CHAR, VARCHAR i TEXT. Ako zadate
Iza zatvarajuće zagrade možete zadati određene opcije koje se tiču tabele. Dosad vrednost 1, svi indeksi će se pakovati; ako zadate vrednost o, nijedan indeks se
smo već videli da to može biti tip tabele.Tipovi tabela detaljnije su opisani u poglavlju 9. n e će pakovati.
Ako ne zadate tip tabele, podrazumeva se MyiSAM. Ukratko, tip tabele može biti jedan • PASSWORD = "tekst• U standardnoj verziji MySQL-a ova opcija na radi baš
od sledećih: ništa.
• My ISAM, koji se podrazumeva, veoma je brz i podržava indekse za tekstualno • DELAY_KEY_WRITE = {o l l } Omogućava da odložite ažuriranje indeksa dok
pretraživanje; zamenjuje nekadašnji podrazumevani tip ISAM. ne zatvorite tabel u. Upotrebljiva je samo za My ISAM tabele.
• ISAM je stariji tip tabela. Sličan je tipu My ISAM ali pruža manje mogućnosti, • ROW_FORMAT= {default l dynamic l fixed l compressed } Omogućava
zbog čega bi trebalo da umesto njega uvek koristite MyiSAM. da zadate format u kojem se skladište podaci u redovima tabele. Upotrebljiva je
• InnoDB je mašina baze podataka usklađena s grupom pravila ACID koja samo za MyiSAM tabele.
podržava transakcije, spoljne ključeve i zaključavanje podataka na nivou pojedi- • RAID_TYPE= { l l STRIPED l RAIDO } RAID_CHUNKS=# RAID_CHUNKSIZE=#
načnog reda tabele. Omogućava da u cilju optimizovanja servera zadate tip RAID grupe diskova koji
• BDB (Berkeley DB) je mašina baze podataka koja podržava transakcije i zaklju- imate.
čavanje podataka na nivou stranice tabele. • UNION= (ime_tabele, [ime_tabele ••• ]) Ovaopcija,namenjenaisključivo
• Ceo sadržaj tabela tipa HEAP čuva se u memoriji i nikad se ne upisuje na disk; tabelama tipa MERGE, omogućava da zadate tabele koje čine grupu MERGE.
zahvaljujući tome, te tabele su veoma brze, ali veličina im je ograničena i podaci • INSERT_METHOD= {NO l FIRST l LAST } Ova opcija je upotrebljiva isključivo
iz njih se ne mogu restaurirati ukoliko se sistem pokvari. za tabele tipa MERGE i služi da se zada tabela u koju se podaci umeću.
• Tabele tipa MERGE omogućavaju kombinovanje više tabela tipa MyiSAM koje • DATA DIRECTORY="apsolutna putanja• Pomoću ove opcije možete izričito
imaju istu strukturu, tako da se podaci iz njih čitaju kao da radimo s jednom tabe- zadati direktorijum u koji želite da se smeštaju podaci tabele.
lom.To se može iskoristiti kada operativni sistem ograničava maksimalnu veličinu • INDEX DIRECTORY="apsolutna putanja" Pomoću ove opcije možete izri čito
datoteka - pa zbog toga i tabela. zadati direktorijum u koji želite da se smešta sadržaj indeksa tabele.
rU~IdVIJ'C ""t rldVIJ'CIIJ'C UdLd JJUUdldl\d, lciU'Cicl l IIIU\..1\.>cl
I najzad, ako ponovo pogledate opšti oblik komande CREATE TABLE, uočićete da
• MEDIUMINT zauzima tri bajta (2 24 mogućih vrednosti).
komandu CREATE TABLE možete završiti komandom SELECT. SELECT je SQL-ova
komanda koja omogućava učitavanje redova iz jedne ili više tabela. (Podrobnije je • BIGINT zauzima osam bajtova (2 64 mogućih vrednosti).
opisana u poglavljima 6, 7 i 8 ove knjige.) Pomoću tc opcije možete napuniti novu Aproksirnirani numerički tipovi opisani su u nastavku teksta.
tabelu podacima koje učitava zadata komanda select.
Tip FLOAT
Ovaj tip je namenjen za rad s brojevima s pokretnim zarezomjednostruke preciznosti.
Tipovi podataka u kolonama Može predstavljati pozitivan broj u opsegu od 1.18 x 10-38 do 3.40 x 10 38 i sličan opseg
U MySQL-u postoje tri osnovna tipa kolona: numerički, znakovni ili tekstualni 11egativnih brojeva.
i datumsko/vremenski. Objasnićemo ih jedan po jedan u narednim odcljcima.
Tip DOUBLE
Numerički tipovi podataka Ovaj tip je namenjen brojevima s pokretnim zarezom dvostruke preciznosti. Sinonimi
Numerički tipovi se koriste za skladištenje brojeva. U našem primeru, upotrebili smo 'la DOUBLE SU REAL i DOUBLE PRECISION. Mogu predstavljati pozitivan broj u opsegu
tipove int (celo brojne vrednosti) i float (vrednosti s pokretnim zarezom). To su dva od 2.23 x 10- do 1.80 x 10 308 i sličan opseg negativnih brojeva.
308
vrednosti. Rezervisana reč ZEROFILL znači da će se vrednosti iz kolone prikazivati d~?unF:anJem po~atka u koloni razmacima. Ti razmaci se automatski uklanjanju pri
s vodećim nulama. liCJtavanJU podatka IZ kolone tipa CHAR.
Tačni numerički tipovi opisani su u nastavku teksta. Očigledno je da podaci tipa CHAR zauzimaju više prostora na disku od ekviva-
il'J~tnih z~akovnih ~~ednosti promenljive dužine. Prednost im je to što se podaci brže
Tip NUMERIC ili DECIMAL uČ!tavaju 1z tabele CIJe su sve kolone fiksne širine (tj. CHAR, numerički ili date).
O be reči označavaju potpuno isti tip podataka, a DECIMAL se može skratiti na DEC. Ovi ll udući da je brzina učitavanja podataka često važnija od prostora koji oni zauzimaju
tipovi omogućavaju čuvanje tačnih vrednosti s pokretnim zarezom i obično se koriste na disku, možda ćete se opredeli ti da tekstualna polja u kojima se vrednosti ne razli-
za rad s novčanim vrednostima. Opseg mogućih vrednosti jednak je kao za brojeve kLUU mnogo po dužini deklarišete kao CHAR da biste (malo) optimizovali sistem.
s pokretnim zarezom dvostruke preciznosti. Ispred deklaracija oba tipa, CHAR i VARCHAR, možete dodati rezervisanu reč NATIO-
NAL, Što znači da želite da ograničite sadržaj na standardni skup znakova. Pošto se ova
Tip INTEGER i varijante opcija podrazumeva u MySQL-u, korisna je samo ako vam je potrebna kompatibil-
Ovaj tip se može skratiti na INT. To je standardni tp za celo brojne vrednosti, koje se llOSt između različitih platformi.
smcštaju u četiri bajta, što daje 232 moguće vrednosti. Tip INT ima nekoliko varijanti: Deklaracijama tipova CHAR i VARCHAR može slediti rezervisana reč BINARY što znači
d.t sc pri poređer0u znakovnih vrednosti pravi razlika između malih i velikih slova.
• TINYINT zauzima jedan bajt (28 mogućih vrednosti). Rezervisane reči BIT i BOOL
Podrazumevani način poređenja je da se ta razlika ne pravi.
su sinonimi za TINYINT.
16
• SMALLINT zauzima dva bajta (2 mogućih vrednosti).
Poglavlje 4 Pravljenje baza podataka, tabela i indeksa Pravljenje indeksa
54
fip TIME
Tip VARCHAR .. v· v·
Tip VARCHAR omogućava skladištenje znakovnih nizova promenljlVe duzme. Duzma Ovaj tip <:n;ogućava skladištenje podataka koji predstavljaju vreme, koje se prikazuje u
podataka zadaje se između zagrada iza imena tipa, na primer, VARCHAR (l ol . Opseg lormatu CC:MM:SS.
mogućih vrednosti je od O do 255.
Tip DATETIME
Tipovi TEXT, BLOB i njihove varijante Ovaj tip je kombinacija dva prethodna. Format je GGGG-MM-DD ČČ:MM:SS.
Tipovi TEXT omogućavaju skladištenje tekstualnih podataka dužih od ono.g što m?Ž.e
da stane u tipove CHAR i VARCHAR. BLOB je skraćenica za Binary Large OBject (vehki fip TIMESTAMP
binarni objekat). Ovi tipovi se međusobno ni po čemu ne razlikuju, jedino je BLOB <)vo je koristan tip podataka za kolone tabele. Ako u određenom redu ne zada te vred-
namenjen čuvanju binarnih a ne tekstualnih podataka. Pri poređenju podataka tipa IIOSt za kolonu ovog tipa, ili zada te NULL, u kolonu se upisuje vreme kada je red dodat
BLOB pravi se razlika između malih i velikih slova, dok se to ne čini pri poređenju P~.da t.tbcli ili kada je poslednji put izmenjen sadržaj reda.
taka tipa TEXT. Oba tipa su promenljive dužine i za oba postoje varijante razmh velicma: Kada učitatate podatak tipa timestamp, prikazuje se u istom formatu kao tip DATE-
8 '1'IME. To je značajna razlika između MySQL-ovih verzija 4.0 i 4.1. Ranije ste u dekla-
• Tip TINYTEXT ili TINYBLOB može sadržati najviše 255 (to je 2 -1) znakova ili
' .tciji kolone tipa TIMESTAMP mogli da zadate širinu na kojoj se prikazuju podaci iz
baj tova. ll' kolone .
• Tip TEXT ili BLOB može sadržati najviše 65,535 (i 6 -1) znakova ili bajtova (64 KB).
24
• Tip MEDIUMTEXT ili MEDIUMBLOB može sadržati najviŠe 16,777,215 (2 -1) znakova rip YEAR
ili bajtova (16 MB). ()vaj tip omogućava skladištenje podataka koji predstavljaju godine. Kada deklarišete
32
• Tip LONGTEXT ili LONGBLOB može sadržati najviše 4,294,967,295 (2 -1) znakova ~o! onu ovog tipa, možete zadati YEAR ( 2) ili YEAR ( 4) da biste zadali broj cifara. Podra-
ili bajtova (4 GB). t umeva se YEAR (4 l. YEAR (2 l predstavlja opseg godina od 1970. do 2069.
Tip ENUM . ,. . v
Pravljenje indeksa
Ovaj tip podataka omogućava da zadate hstu moguClh vrednost1. Kolona tabele ~oze
sadržati jednu vrednost iz nabroj anog skupa mogućih. Tip podataka ENUM deklanse se Sve indekse koji vam trebaju najčešće ćete praviti automatski kada pravite tabele. Za
W;tku kolonu koju deklarišete sa opcijom PRIMARY KEY, KEY, UNIQUE ili INDEX, auto-
na sledeći način:
lll.ltski se formira i indeks.
pol enum('m', 'Ž') Ponekad ćete ustanoviti da koristite veći broj upita koji obuhvataju kolonu za koju
Pošto vrednost tipa ENUM može biti i NULL, moguće vrednosti kolone pol su m, 11istc definisali indeks; u takvim slučajevima možete dodati nov indeks pomoću
ž, NULL ili error. ~oman de CREATE INDEX.
Zanimljivo je to da se, pre izvršavanja, komanda CREATE INDEX preslikava u
Tip SET · v . komandu ALTER TABLE. Komanda ALTER TABLE može se upotrebiti i za mnoge druge
Tip SET je sličan tipu ENUM s tom razlikom što kolone u redovima tabele mogu sadrzat1 11.11ncne, koje ćemo opisati u poslednjem odeljku ovog poglavlja.
i više vrednosti iz nabrojanog skupa mogućih. Na primer, tabeli employee možemo dodati nov indeks na sledeći način:
<'l' ate index name on employee (name) ;
Datumski i vremenski tipovi podataka
MySQL podržava više tipova za rad s datumima i vremenima, koji su opisani u nared- Ova komanda pravi indeks čije je ime name nad kolonom name tabele employee.
Komanda create index nema puno opcija. Ispred reči index možete dodati reč
nim odeljcima.
liN J QUE ako želite indeks s jedinstvenim vrednostima. Osim toga, ispred reči index
111ožcte navesti rezervisanu reč FULLTEXT da biste napravili indeks za tekstualno pre-
Tip DATE !I,J~ivanje MyiSAM tabele. (Više detalja o tome naći ćete u poglavlju 9.)
Tip date omogućava skladištenje datuma. MySQL očekuje da datum bude u ISO
redosledu godina-mesec-dan, čime se izbegavaju problemi usled različitih formata
datuma s o be strane Atlantika. Datumi se prikazuju u formatu GGGG-MM-DD.
56 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa tzmena struKture postoJece t110e1e
Indeksi definisani nad kolonama tipa char i varchar mogu se ograničiti na prvih ll udući da komanda ALTER TABLE pruža veliki broj mogućnosti, ima i veliki broj
nekoliko znakova u polju. To ćete uraditi tako što iza imena indeksirane kolone zada te lj H 'Ja . Opšti oblik te komande, kako je opisano u MySQL-ovoj dokumentaciji
između zagrada broj znakova koji želite da se indeksira, na primer: ' '~·. led a ovako:
create index part_name on employee(name(S)); /l.' i'I>R [IGNORE ] TABLE ime tabele vrsta_izmene [, vrsta_izmene ... ]
Pošto indeksi nad kolonama tekstualnog tipa nisu tako efikasni kao indeksi nad t a_ izmene:
numeričkim kolonama, indeksiranje samo nekoliko početnih znakova poboljšava ADD [COLUMN] definicija_kolone [FIRST l AFTER ime kolone
performanse. il l ADD [COLUMN] (definicija_kolone, definicija kolon~, ... )
lli ADD INDEX [ime_indeksa] (ime_indeksirane_kolone, .. . )
l li ADD PRIMARY KEY (ime indeksirane kolone, ... )
Brisanje baza podataka, tabela i indeksa l li ADD UNIQUE [ime_indeksa] (ime indeksirane kolone, . . . )
Pošto sada znate kako se prave baze podataka, tabele i indeksi, korisno je da naučite l li ADD FULLTEXT [ime_indeksa] (i;e indeksira;e kolone, ... )
ll i ADD [CONSTRAINT simbol] FOREIGN-KEY [ime_indeksa]
i da ih brišete. Rezervisana re č koja vam treba za tu namenu jeste DROP.
(ime_indeksirane_kolone, ... )
Celu bazu podataka, zajedno s njenim sadržajem, brišete pomoću sledeće komande [definicija_reference]
(nemojte je još zadati!): l li ALTER [COLUMN] ime_kolone {SET DEFAULT literal l DROP DEFAULT}
drop database employee; l 1i CHANGE [COLUMN] staro_ime_kolone definicija kolone
[FIRST l AFTER ime_kolone] -
Ispred imena baze podataka možete dodati neobaveznu opciju IF EXISTS. Ako se 11 i MODIFY [COLUMN] definicija_kolone [FIRST l AFTER ime_kolone]
vratite na listing 4.1, videćete da je u njemu upotrebljena baš ova verzija komande l ll DROP [COLUMN] ime_kolone
DROP DATABASE. l Ji DROP PRIMARY KEY
Tabelu možete izbrisati pomoću komande DROP TABLE, na primer: l li DROP INDEX ime_indeksa
lli DISABLE KEYS
drop table assignment; 1l i ENABLE KEYS
Opšti oblik komande DROP TABLE izgleda ovako: lli RENAME [TO] novo_ime tabele
ll i ORDER BY ime kolone
DROP [TEMPORARY] TABLE [IF EXISTS] ime_tabele [, ime tabele, ... ] ll i opcije_za_tabelu
Ako želite da izbrišete privremenu tabelu, upotrebite rezervisanu reč TEMPORARY Većina ovih opcija razumljive su same po sebi ili odgovaraju opcijama u komandi
Istom komandom možete izbrisati više tabela ako zadate listu njihovih imena razdvo- ' 'll EATE TABLE, kao što je ADD PRI MARY KEY Opisaćemo ukratko one koje možda nisu
jenih zarezima. Neobavezna opcija IF EXISTS deluje na isti način kao u komandi t1.1[j asnije.
DROP DATABASE.
pcije CHANGE i MODIFY zapravo su jedna te ista opcija i omogućavaju izmenu defi-
Indeks brišete pomoću komande DROP INDEX, na primer: lltnj e kolone ili njenog mesta u tabeli.
drop index part_name on employee; Opcija DROP COLUMN briše kolonu iz tabele, dok opcije DROP PRIMARY KEY i DROP
1NDEX brišu samo indeks pridružen koloni.
Kao što vidite, da biste izbrisali indeks, morate zadati i ime tabele kojoj je pridružen.
Opcija DISABLE KEYS nalaže MySQL-u da ne ažurira sadržaj indeksa, ali upotre-
i>lpva je samo za My ISAM tabele. Opcija ENABLE KEYS uključuje ažuriranje indeksa.
lzmena strukture postojeće tabele Opcija RENAME omogućava promenu imena tabele.
Osim izrade novih tabela i brisanja postojećih, često će vam zatrebati da izmenite Opcija ORDER BY će poređati zadatim redosledom redove tabele na koju je prime-
strukturu postojeće tabele. To se može uraditi pomoću komande ALTER TABLE- ona IIJCI1a, slično opciji ORDER BY u komandi SELECT, koju ćemo razmatrati u poglavlju 6,
ima veliki broj varijanti koje se mogu upotrebiti za menjanje struktura tabela. .. Korišćenje upita u MySQL-u". Taj red o sled neće biti očuvan kada se kasnije unesu
Na primer, indeks nad ta belom employee mogli smo da napravimo na sledeći način: Ilovi podaci u tabelu.
alter table employee Opcija opcije_za_tabelu omogućava da na kraj komande zadate iste opcije za
add index name (name) ; t.ll>elu kao u komandi CREATE TABLE- više detalja o tome naći ćete u prethodnom
dl'lu ovog poglavlja.
58 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa ;:,azetaK
• Svi identifikatori, osim alijasa, mogu sadržati najviše 64 znaka. Dužina alijasa Brisanje baza podataka, tabela i indeksa
može biti najviše 255 znakova. • Bazu podataka brišete pomoću komande
• Identifikatori mogu da sadrže većinu postojećih znakova, ali imena baze podataka drop database ime_baze;
ne mogu sadržati znakove l, \ i . a imena tabela ne mogu sadržati znakove . i l. • Tabelu brišete pomoću komande
• Rezervisane reči možete koristiti kao identifikatore, pod uslovom da ih pišete drop table ime_tabele;
između navodnika. • Indeks brišete pomoću komande
drop index ime_indeksa on ime_tabele;
Pravljenje baze podataka
• create database ime_baze; pravi novu bazu podataka.
lzmena strukture postojeće tabele
• use database ime_baze; bira (otvara) bazu podataka za upotrebu.
• Strukturu tabele menjate pomoću komande ALTER TABLE, čiji opšti oblik
izgleda ovako:
ALTER [IGNORE) TABLE ime_tabele vrsta izmene [, vrsta_izmene ... ]
Pravljenje tabela
• Tome služi komanda create table, čiji opšti oblik izgleda ovako: vrsta izmene:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ime tabele ADD [COLUMN] definicija_kolone [FIRST l AFTER ime kolone
[ (definicija_kolone, ... ) l ili ADD [COLUMN] (definicija_kolone, definicija_kolo;e, ... )
[opcije_za_tabelu] [komanda_select] ili ADD INDEX [ime_indeksa] (ime_indeksirane_kolone, .. . )
ili ADD PRIMARY KEY (ime_indeksirane_kolone, .. . )
ili ili ADD UNIQUE [ime_indeksa] (ime_indeksirane_kolone, .. . )
ili ADD FULLTEXT [ime_indeksa] (ime indeksirane kolone, ... )
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ime tabele LIKE ili ADD [CONSTRAINT simbol] FOREIGN-KEY [ime_indeksa]
ime_postojeće_tabele; (ime_indeksirane_kolone, ... )
[definicija_reference]
definicija_kolone: ili ALTER [COLUMN] ime_kolone {SET DEFAULT literal l
ime_kolone tip_podataka [NOT NULL J NULL) [DEFAULT DROP DEFAULT}
podrazumevana_vrednost] [AUTO_INCREMENT] ili CHANGE [COLUMN] tekuće_ime_kolone definicija kolone
[PRIMARY KEY] [definicija_reference] [FIRST l AFTER ime_kolone] -
ili PRIMARY KEY (ime_indeksirane_kolone, .. . ) ili MODIFY [COLUMN) definicija_kolone [FIRST l AFTER ime kolone]
ili KEY [ime_indeksa] (ime_indeksirane_kolone, .. . ) ili DROP [COLUMN] ime_kolone
ili INDEX [ime_indeksa] (ime_indeksirane_kolone, .. . ) ili DROP PRIMARY KEY
ili UNIQUE [INDEX] [ime_indeksa] (ime_indeksirane_kolone, ... ) ili DROP INDEX ime_indeksa
ili FULLTEXT [INDEX] [ime_indeksa] (ime_indeksirane_kolone, .. . ) ili DISABLE KEYS
ili [CONSTRAINT simbol] FOREIGN KEY [ime_indeksa] ili ENABLE KEYS
(ime_indeksirane_kolone, ... ) ili RENAME [TO] novo_ime tabele
[definicija_reference] ili ORDER BY ime_kolone
ili CHECK (izraz) ili opcije_za_tabelu
bU roglaVIJe 4 rraVIJenJe oaza poaataKa, taoe1a 1 maeKsa VU~UVUII
5. Da biste izbrisali bazu podataka (čije je ime dbname) i ceo njen sadržaj, zadali biste
Pitanja
a) drop all tables on dbname;
1. Šta od sledećeg nije ispravno ime tabele u MySQL-u?
b) drop database dbname;
a) employee
e) drop dbname;
b) select
d) delete database dbname;
e) employee.skill
d) employeeSkills
2. Od sledećih tvrdnji o tipovima podataka CHAR i VARCHAR, koje su tačne? Vežbe
a) Kolona tipa CHAR uvek zauzima isti prostor na disku, bez obzira na sadržaj. 1. Napišite SQL komande koje formiraju bazu podataka porudzbine čija je šema
sledeća:
b) Podatak u koloni tipa VARCHAR uvek se dopunjava razmacima pri upisi-
vanju na disk. kupac(kupaciD, kupaclme, kupacAdresa)
e) Kolona tipa CHAR, u proseku, zauzima manje prostora na disku od ekviva- porudzbina(porudzbinaiD, porudzbinaDatum, l_c_t.lP!l.cJQ)
lentne kolone tipa VARCHAR. porudzbinaStavka(B_'?:_':~~-~~~~-I_l?., r:<?.~~lP..•robaKolicina)
d) Kolona tipa VARCHAR uvek zauzima isti prostor na disku, bez obzira na roba(robaiD, robaN aziv)
sadržaj. Možete izabrati proizvoljne tipove podataka.
3. Pre nego što počnemo da pravimo tabele u bazi podataka, moramo prvo Testirajte komande u MySQL-u, a zatim pregledajte rezultujuće tabele pomoću
a) napraviti indekse tabela komandi SHOW i DESCRIBE.
b) napraviti bazu podataka 2. Svakoj porudžbini u tabeli porudzbine želimo da dodamo novo polje nazvano
e) napraviti bazu podataka i otvoriti je za upotrebu napomena, koje će biti tipa TEXT. Obavite to pomoću odgovarajuće komande
d) napraviti sve kolone tabela ALTER TABLE, a zatim proverite rezultat pomoću komande DESCRIBE.
4. Od sledećih komandi CREATE TABLE, koja je sintaksno ispravna? 3. Izbrišite bazu podataka porudzbine.
a)
create table department Odgovori
department ID int not null auto - inc remen t pri mary key,
name varchar(20}
type=InnoDB; Pitanja
b) 1. e
create table department type=InnoDB 2. a
(
3. e
department ID int not null auto inc remen t pri mary key,
name varchar ( 2 o} 4. d
}; 5. b
e)
create department Vežbe
create database porudzbine;
department ID int not null auto - increment pri mary key,
name varchar(20} use porudzbine;
type=InnoDB;
d) cre ate table kupac
create table department (
( kupaciD int not null auto increment primary key,
department ID int not null auto- inc remen t pri mary key, kupacime varchar(20},
name varchar(20} kupacAdre sa varchar(BO}
type =InnoDB; t ype I nnoDB ;
b.l roglaVIJe 4 rraVIJenJe oaza pooaiaKa, Iaoe1a 1 moeKsa
III
(
porudzbinaiD int not null auto increment primary key,
porudzbinaDatum date,
kupaciD int not null references kupac(kupaciD)
type = InnoDB;
U sledećem poglavlju
U poglavlju S",Umetanje, brisanje i ažuriranje podataka", unećemo određene podatke
u bazu podataka employee.
5
Umetanje, brisanje
i ažuriranje podataka
u OVOM POGLAVLJU
1 UPDATE umeću
OBJASNIĆEMO
kako se komande
i ažuriraju podaci u MySQL-ovoj bazi podataka .
pomoću INSERT, DELETE
• Komanda INSERT
• Komanda DELETE
• Komanda UPDATE
• Učitavanje podataka pomoću komande LOAD DATA INFILE
Koman da INSERT
"iQL-ova komanda INSERT služi za umetanje novih redova u tabele. Pogledaćemo
najpre jedan primer. U ovom slučaju takođe, komande možete zadavati direktno u
MySQL monitoru ili pisati u datoteku, ili možete preuzeti datoteku s Web lokacije
posvećene ovoj knjizi.
U listingu 5.1 prikazano je nekoliko primera komande insert.
delete from employee; U prva dva reda izričito smo zadali vrednosti za kolonu departmentiD. Pogle-
insert into employee values dajmo ponovo definiciju kolone departmentiD. Verovatno se sećate iz prethodnog
(7513, 'Nora Edwards', 'Programmer',l28), poglavlja da deklaracija te kolone izgleda ovako:
(9842, 'Ben Smith', 'OBA', 42),
(6651, 'Ajay Patel', 'Programmer', 128), departmentiD int not null auto_increment primary key
(9006, •candy Burnett•, •systems Administrator', 128); Budući daje u pitanju kolona tipa auto_increment, možemo izričito zadati
from employeeSkills; vrednost za nju, ili prepustiti MySQL-u da sam generiše neku vrednost. (Pri upotrebi
delete
insert into employeeSkills values kolona tog tipa obično se prepušta MySQL-u da sam izračuna vrednost, ali postoje
(7513, •e•)' i slučajevi, kao što je ovaj, gde ćete imati postojeću vrednost koju ćete želeti da
(7513, • Perl'), upotrebite.)
(7513, 'Java'), U redovima s podacima o službama Human Resources i Marketing, u koloni
(9842, 'DB2'),
department ID zadato je NULL. To aktivira "magiju" mehanizma auto_increment
(6651, 'VB'),
(6651, 'Java'), koji izračunava novu vrednost. Pogledajmo Šta ćemo dobiti s tom komandom
(9006, 'NT'), lNSERT.
(9006, 'Linux'); Ako pažljivije pogledate pojedine komande INSERT, uočićete da su podaci koji se
umeću u kolone tipa string ili date uokvireni polunavodnicima, na primer, 'Rese-
delete from client; arch and Development'. Polunavodnici se ne koriste za numeričke tipove.
insert into client values
(NULL, 'Telco Inc', 'l Collins St Melbourne', 'Fred Smith', Ukoliko se podaci uokviruju polunavodnicima, šta treba uraditi kada podatak
l 95551234 l) ' sadrži polunavodnike? Odgovor je da se polunavodnici moraju preslikati (engl. escape).
(NULL, 'The Bank', '100 Bourke St Melbourne', 'Jan Tristan', Jednostavnije rečeno, ispred svakog polunavodnika treba dodati obrnutu kosu crtu
l 95559876 l) ; (\), na primer, 'o\'Leary'.
Šta treba uraditi ako želimo da obrnuta kosa crta bude baš obrnuta kosa crta, bez
delete from assignment;
insert into assignment values ikakvog posebnog značenja? U tom slučaju, morate na isti način preslikati i obrnutu
(l, 7513, '2003-01-20'' 8.5); kosu- zamenite je s dve obrnute kose crte (\ \).
Podatke učitavamo iz baze pomoću komande SELECT. Tu komandu ćemo veoma
Obratite pažnju na to da pre nego što dodamo nove podatke u tabelu, izvršavamo detaljno razmotriti u narednih nekoliko poglavlja. Zasad je dovoljno znati da će se,
komandu DELETE- ni u ovom slučaju to nije neophodno, ali tako ćete ukloniti iz ako zadate:
tabele probne podatke koje ste možda ranije uneli. U narednom odeljku vratićemo se selec t * from ime_tabele;
na komandu DELETE.
učitatisvi podaci koji se nalaze u tabeli.
Osim toga, obratite pažnju i na to da smo uneli probne podatke koji odgovaraju
Ako zadate:
primerima iz poglavlja 3, "Ubrzani kurs projektovanja baza podataka", a dodali smo i
nekoliko dopunskih redova. select * from department;
Sve navedene komande INSERT međusobno su veoma slične. Pogledajmo prvu da trebalo bi da na ekranu dobijete rezultate nalik na sledeće:
biste shvatili kako deluju: ~ ----- ---------+----------------------+
insert into department values l departmentiD l name
(42, 'Finance'), !---------------+----------------------+
(128, 'Research and Development'), 42 Finance
(NULL, 'Human Resources'), 128 Research and Develop
(NULL, 'Marketing'); 129 Human Resources
130 Marketing
U prvom redu zadali smo ime tabele u koju želimo da unesemo podatke - u ovom ----------- --+----------------------+
slučaju, to je tabela department, u koju unosimo četiri reda s podacima. Možda se ~ rows in set (0.01 sec)
sećate da tabela department ima dve kolone, departmentiD i name. (U to se možete
Trebalo bi da bude vidljivo da je rezultat upotrebe kolone tipa auto_increment
uveriti ako izdate komandu describe department.) vrt•dnost koja je za jedan veća od tekuće najveće vrednosti u koloni.
GB Poglavlje 5 Umeta nje, brisanj e i ažuri ra nje podata ka
Komanda INSERT
U MySQL-ovoj dokumentaciji stoji da komanda INSERT ima sledeći opšti oblik: opcija LOW PRIORITY blokira klijentski program koji umeće podatke, dok opcija
INSERT [LOW_PRIORITY l DELAYED] [IGNORE] DELAYED to ne čini. Ukoliko izdate komandu za umetanje podataka s opcijom
[INTO] ime_ tabele [ (ime_kolone, ... ) J LOW PRIORITY, možda ćete morati da sačekate pre nego što budete mogli da
VALUES ((izraz l DEFAULT), ... ),( .. . ), ... nastavite izvršavanje upita iz svog klijentskog progran1a. Ako upotrebite opciju
[ ON DUPLICATE KEY UPDATE ime_kolone=izraz, ... J
DELAYED, biće vam dozvoljeno da započnete izvršavanje drugog upita, ali onda
ili INSERT [LOW_PRIORITY l DELAYED] [IGNORE] morate imati u vidu da vaši podaci neće biti upisani u tabelu dok ona ne bude
[INTO] ime tabele [ (ime_kolone, ... ) J potpuno slobodna.
SELECT ... • Opcija IGNORE je korisna prvenstveno kada umećete više redova istovremeno.
ili INSERT [LOW_PRIORITY l DELAYED] [IGNORE] Standardno ponašanje je takvo da ukoliko jedan od redova koji pokušavate da
[INTO] ime_tabele umetnete izazove grešku tipa dupliran primarni ključ ili duplirana vrednost u
SET ime_kolone=(izraz l DEFAULT), ... koloni koja prihvata samo jedinstvene vrednosti, dolazi do greške a operacija
[ ON DUPLICATE KEY UPDATE ime_kolone=izraz, . . . J umetanja se poništava. Ako upotrebite opciju IGNORE, greška se zanemaruje a
U prime rima koje smo dosad videli, upotrebljen je prvi oblik komande. Obratite postupak umetanja se nastavlja s podacima iz sledećeg reda.
pažnju na to da rezervisana reč INTO nije obavezna. Mogli smo je izostaviti i započeti • Možete izričito zadati da kolona treba da preuzme svoju podrazumevanu vred-
upit s insert employee values, ali smatramo da reč INTO doprinosi razumljivosti nost ako umesto vrednosti za kolonu zadate opciju DEFAULT.
upita. • Opcija ON DUPLICATE KEY UPDATE pruža elegantno rešenje problema duplira-
Kada koristite prvi oblik komande INSERT, za svaki novi red tabele morate zadati nog primam og ključa ili duplirane jedinstvene vrednosti. Iza ove opcije sledi
listu vrednosti poredanih istim redosledom kao odgovarajuće ciljne kolone tabele. komanda update koja menja postojeću vrednost primarnog ključa ili postojeću
U ovom primeru, morali smo prvo da zadamo vrednost za kolonu department ID, jedinstvenu vrednost u koloni tako da se ona više "ne sudara" s podacima iz
a zatim i za kolonu name jer je takva struktura tabele. Iz primera se vidi da ovaj oblik novog reda.
omogućava da se jednom komandom INSERT umetne više novih redova u tabel u.
N aredni kratak primer ilustruje uobičajeni način upotrebe opcije ON DUPLICATE
Drugi oblik komande INSERT završava se komandom SELECT. Um.esto da vredno- ~ J•,YUPDATE:
sti umećete ručno, ovaj oblik omogućava da podatke učita te iz jedne ili više tabela
t' t·eate table warning
baze podataka i da ih zatim umetnete u ciljnu tabelu. (
Treći oblik komande INSERT omogućava da izričito zadate kolone u koje treba
employeeiD int primary key not null references employee(employ-
umetnuti podatke. Primer upotrebe ovog oblika komande INSERT: I D),
' t
ili
Komanda REPLACE
Komanda REPLACE deluje slično komandi INSERT, s tom razlikom što ako dođe do IlE LETE [LOW_PRIORITY] [QUICK] ime tabele [. *] [, ime tabele [. *] ... ]
dupliranja ključa, novi red koji umećete zamenjuje postojeći r~d. ,. v • •
FROM reference na tabele
U MySQL-ovoj dokumentaciji stoji da komanda REPLACE Ima sledeCI opsti obhk: [WHERE uslov]
Ova komanda je ekvivalentna komandi iz prethodnog pr imera, jedina razlika je Možete dodati neobavezno opciju WHERE da biste ažurirali samo određene redove,
1 d o je izosta vite, ažuriraćete sve redove tabele. U ovom slučaju takođe, može vam se
drugačijasintaksa.
Opšti oblik komande DELETE prihvata i druge neobavezne odredbe: ,1, ,Koditi da zaboravite opciju WHERE- sećam se kad je jedan moj površni kolega zadao
111 liO nalik na sledeće:
• Odredba LOW_PRIORITY deluje na isti naČin kao U komandi INSERT.
1 ul te user
• Odredba QUICK može ubrzati komandu DELETE jer nalaže MySQL-u da odloži l password='test';
neke od poslova održavanja indeksa dok briše podatke iz tabele.
Ovaj primer još jednom ističe korist od opcije -- i-am-a-dummy programa mysql,
• Odredba ORDER BY određuje redosled brisanja redova. Najkorisnija je u kombi-
11.11o či tokada imate posla s neznalicama.
naciji sa opcijom LIMIT - na primer, kada želite da izbrišete iz tabele samo n Druga navedena verzija komande UPDATE omogućava ažuriranje više tabela jednom
najstarijih redova. lnluandom. Postupak je sličan brisanju podataka iz više tabela istovremeno, koje smo
• Odredba LIMIT određuje maksimalan broj redova koji komanda DELETE srne da "hJ.ISnili u prethodnom odeljku. Imajte u vidu da će biti ažurirane samo kolone koje
izbriše. Korisna je u kombinaciji sa odredbom ORDER BY ili kada želite da sp re- 1 111.-ito navedete u odredbi SET.
čite brisanje prevelikog broja redova. Sve ostale odredbe komande UPDATE opisali smo ranije . Odredbe LOW_PRIORITY i
IIINORE deluju na isti naČin kao U komandi INSERT. Odredbe ORDER BY i LIMIT deluju
11.1 1sti način kao u komandi DELETE.
Komanda TRUNCATE
Komanda TRUNCATE briše sve redove iz tabele. Na primer:
TRUNCATE TABLE employee; rupno unošenje podataka pomoću komande
Ovaj upit briše sve zaposlene iz tabele employee. Brži je od komande DELETE jer LOAD DATA INFILE
radi tako što najpre fizički uklanja celu tabelu a zatim pravi istu takvu ali praznu. l omanda LOAD DATA INFILE omogućava grupno prenošenje podataka iz tekstualne
Vodite računa o tome da komanda TRUNCATE nije uključena u transakcionu obradu. d.tloteke u tabelu, bez potrebe da pišete komande INSERT. Primenjujući ovu tehniku,
1110gli smo da napunimo podacima tabelu department na način opisan u nastavku ovog
•11k·ljka. U listingu 5.2 prikazan je sadržaj datoteke s podacima o nazivima službi koje
Komanda UPDATE lll'ba uneti u tabelu department.
SQL-ova komanda UPDATE omogućava ažuriranje postojećih redova u tabelama baze
podataka. Na primer, pretpostavimo da je jedan od zaposlenih prešao na drugo radno l bli ng 5.2 department_infile.txt
mesto: l Finance
update employee 128 Research and Development
set job='DBA' IWLL Human Resources
where employeeiD='6651'; NULL Marketing
Ova komanda menja vednost u koloni j ob za zaposlenog čija je šifra 6651.
U MySQL-ovoj dokumentaciji stoji da komanda UPDATE ima sledeći oblik: Ova datoteka je u standardnom formatu za komandu LOAD DATA INFILE, što znači
d.1 sc svaki red podataka nalazi u zasebnom redu datoteke, a kolone su razdvojene zna-
UPDATE [LOW_PRIORITY) [IGNORE) ime_tabele
SET ime kolonel=izrazl [, ime kolone2=izraz2 ... ) ' una za tabulator. (To se može podesiti i drugačije, što ćemo opisati u nastavku .)
[WHERE uslov] Podatke možete uneti u tabelu department pomoću sledeće komande LOAD DATA
[ORDER BY ... ) INFILE:
[LIMIT broj_redova] lo d data local infile 'department infile.txt'
Into table department; -
ili
Ova mogućnost je naročito korisna kada treba u čitati podatke iz formata neke
UPDATE [LOW_PRIORITY) [IGNORE) ime_tabele [, ime_tabele ... ) 1li ugc baze podataka, iz tabele programa za tabelarne proračune ili iz CSV (comma-
SET ime_kolonel=izrazl [, ime_kolone2=izraz2 ... ) \l'parated values) datoteke .
[WHERE uslov]
Komanda UPDATE je po mnogo čemu slična komandi DELETE.
Pn1JI;1vlj b Umetanje, brisanje i ažuriranje podataka Sažetak
lli
Komanda LOAD DATA INFILE zahteva da korisnik ima pravo FILE- detaljnije Za prenošenje podataka iz jednog formata u drugi, često se koristi CSV format
infom1acije o tome potražite u poglavlju ll, "Upravljanje pravima korisnika", naročito (e omma-separated values- vrednosti razdvojene zarezima). Mnogi programi čitaju i
ako imate problema pri izvršavanju ove komande. Pravo izvršavanja ove komande pesu datoteke u tom formatu, a jedan od najpoznatijih je Microsoftov Excel. U listingu
često je ograničeno iz ozbiljnih bezbednosnih razloga- na primer, da biste sprečili 1. ) prikazana je kratka CSV datoteka dobijena iz Excela.
• Odredba LOW PRIORITY deluje na isti način kao u komandi INSERT, tj. čeka da Kao što vidite, za prenošenje ovih podataka naveli smo više opcija nego kada su
drugi klijentski programi završe učitavanje podataka iz tabele. Odredba CONCUR- podaci u podrazumevanom formatu za komandu LOAD DATA INFILE. Vredno je istaći
sledeće:
RENT, s druge strane, omogućava drugim klijentskim programima da učitavaju
podatke iz tabele dok je vi punite podacima pomoću komande LOAD DATA • Budućida smo putanju datoteke zadali u formatu uobičajenom u Windowsu/
INF ILE . DOS-u, ~. pu tanja sadrži obrnutu kosu crtu, morali smo da je preslikamo
• U navedenom primeru zadali smo neobaveznu rezervisanu reč LOCAL, koja znači pomoću dodatne kose crte. Zbog toga je putanja zada ta u obliku
da se datoteka s podacima nalazi na klijentskom (lokalnom) računaru. Ako ne 'e:\ \new_programmers. csv'.
zadate ovu odredbu, MySQL će tražiti datoteku na serveru. • Verovatno podrazumevate da su polja u CSV datoteci razdvojena zarezima, ali se
• Ako se pri punjenju tabele podacima ključevi dupliraju, odredbe REPLACE i to ipak mora izričito zadati u komandi .
IGNORE pružaju dve mogućnosti rešavanja tog problema. Opcija REPLACE nalaže • Nije neophodno da izričito zadate da se redovi završavaju znakom za nov red, ali
MySQL-u da postojeći red zameni novim redom, dok opcija IGNORE nalaže mi smo se opredelili da to ipak učinimo.
MySQL-u da zadrži postojeći red. • Pošto su prva dva reda u datoteci zapravo zaglavlje, oni ne sadrže podatke i treba
• Odredbe FIELDS i LINES opisuju strukturu datoteke s podacima. U opštem ih izostaviti pri učitavanju podataka iz datoteke.
obliku komande LOAD DATA INFILE navedene su podrazumevane vrednosti ovih • Pošto datoteka ne sadrži šifre zaposlenih (kolona employeeiD), da bismo preneli
opcija - svaki red s podacima smešten je u zaseban red datoteke, a vrednosti tri kolone podataka u četiri kolone tabele, moraćemo da navedemo ciljne kolone
kolona razdvojene su zarezima.Vrednosti kolona možete omeđiti navodnicima, (i njihov redosled) u koje se podaci prenose. U ovom primeru, to su (name,
a pomoću obrnute kose crte možete preslikati svaki znak (kao što je polunavod- job, departmentiD).
nik) koji bi MySQL možda pogrešno protumačio .
• Odredba IGNORE broj LINES nalaže MySQL-u da zanemari (preskoči) prvih
broj redova.
Sažetak
U ovom poglavlju razmatrali smo načine umetanja, brisanja i ažuriranja podataka u
• Poslcdnjom odredbom zadajete da želite da popunite podacima samo navedene
tabelama baze podataka.
kolone tabele.
76 Poglavlje 5 Umetanje, brisanje i ažuriranje podataka
U sledećem poglavlju
U poglavlju 6, "Korišćenje upita u MySQL-u", počećemo da se bavimo SQL-ovom
"dcvojkom za sve", tj. komandom SELECT i njenim brojnim varijantama.
HU roglaVIJe b K.OnscenJe up1ta u My:>uL-u Apsolutna 1mena oaza pooataka 1 tabel;
Opšti oblik komande SELECT rcdosledom koji vam treba. Imena kolona treba da zadate u obliku liste vrednosti
r:tzdvojenih zarezima.
Komanda SELECT ima sledeći opšti oblik:
Sledeći upit učitava samo vrednosti iz polja employeeiD i name tabele employee:
SELECT kolone
FROM tabele aelec t name, employeeiD from employee;
[WHERE uslovi] Ako ovaj upit izvršite u bazi podataka employee, trebalo bi da dobijete rezultate
[GROUP BY grupe nalik na slediće:
[HAVING uslovi_za_grupe]]
[ORDER BY kolone_za_sortiranje] ·---------------+-------------+
[LIMIT broj] ; l name l employeeiD
Ovo nije potpuna sintaksa- objasnićemo je u narednom poglavlju- ali ilustruje
·---- -----------+-------------+
Ajay Patel 6651
opšti oblik komande. Odredbe koje su ovde navedene opisaćcmo u ovom poglavlju. Nora Edwards 7513
Komanda SELECT ima veliki broj neobaveznih odredaba. Ne morate ih uvek navo- Candy Burnett 9006
diti, ali ako ih upotrebite, morate ih zadati redosledom koji je prikazan u opšte m Ben Smith 9842
obliku komande. ·---- ---------+---------------+
~ rows in set (0.00 sec)
Kao što vidite, prikazane su samo vrednosti iz kolona koje smo zadali u upitu.
Jednostavni upiti Obratite pažnju na to da su kolone prikazane redosledom koji smo zadali u upitu, a ne
Primer najjednostavnijeg oblika komande SELECT izgleda ovako: rcdosledom kojim su definisane u šemi baze podataka.
select * from department;
Ako ovaj upit izvršite s podacima koji postoje u bazi podataka employee, trebalo bi Apsolutna imena baza podataka i tabela
da dobijete rezultate nalik na sledeće: Dodatan oblik notacije koji bi trebalo da imate u vidu omogućava zadavanje apsolut-
+---------------+--------------------------+ nih imena baze podataka i tabele s kojom želite da radite. Kolonu name tabele
l departmentiD l name l employee možemo navesti u upitu kao employee. name.
+---------------+--------------------------+
42 Finance l select employee.name
128 Research and Development l from employee;
129 Human Resources l Trebalo bi da rezultati ovog upita budu nalik na sledeće:
130 Marketing l
+---------------+--------------------------+ ·---------------+
4 rows in set (0.00 sec) l name
t---------------+
Ovaj upit je u čitao sve podatke iz zadate tabele - tj. sve redove i sve kolone iz Ajay Patel
tabele department. Nora Edwards
Postupak možete isprobati i na nekoj drugoj tabeli- na primer, učitajte sve redove Candy Burnett
i sve kolone iz tabele employeeSkills. Ben Smith
Razume se, suština relacione baze podataka svakako nije u tome da vam daje sve
·--------- --- ---+
4 rows in set (0.41 sec)
podatke koje ste u nju uneli, već da vam omogući da nađete određene podatke.
Slično tome, možete izričito zadati koju tabelu u kojoj bazi podataka imate na umu,
nn primer:
Učitavanje podataka iz određenih kolona selec t name
U narednom koraku ograničićemo kolone iz kojih učitavamo podatke. Znak * u irom employee.employee;
prethodnom primeru upita (select * from department) znači "sve kolone tabele" . (Trebalo bi da pomoću ovog upita dobijete isti rezultat kao pomoću prethodnog
Umesto zvezdice, možete zadati samo kolone iz kojih vam trebaju podaci. To može upita.)
biti samo jedna kolona, nekoliko kolona tabele, ili čak sve kolone tabele poređane
t"OglaVIJe O 1\0riSCenJe UflllCI U IVIY.:>UL-U upuucuct uurcuuc vvncnc Let ucnctVCifiJC ~ctrnu uurcucr1111 rt:uuvd
U ovom primeru, izričito navodimo da želimo podatke iz tabele employee koja se U poslednja dva primera rezervisana reč AS nije bila neophodna. Upit smo mogli
nalazi u bazi podataka employee. Notacija u ovom slučaju je baza_podataka . tabela. da napišemo i u sledećem obliku:
Ako je potrebno, možete zadati kojoj bazi podataka i tabeli pripada određena kolona. oe lect name employeeName
Isti primer može se napisati pomoću sintakse baza_podataka. tabela . . kolona u sle- Lrom employee;
dećem obliku: ili
select employee.employee.name se lect e.name
from employee; from employee e;
Ova sintaksa nije naročito korisna za ovakve jednostavne upite, ali kad budete Upite možete pisati u obliku koji smatrate najpogodnijim. To je isključivo pitanje
prešli na složenije upite, ona će vam omogućiti da na nedvosmislen način zadajete li čnog
stila programiranja. Kao što ćete videti u ovom poglavlju i na mnogim drugim
podatke koji su vam potrebni. mestima u knjizi, isti upit može se napisati na više različitih načina. Kao i u drugim
programskim jezicima, lični stil svakog programera na SQL-u razlikuje se od ostalih .
Alijasi
Sada bi trebalo da objasnimo koncept alijasa kolona i tabela. Upotreba odredbe WHERE za učitavanje
Kolonama i izrazima u komandi SELECT možete dodeliti drugačija imena, koja će
se prikazivati u rezultatima. Na primer, možemo upotrebiti sledeći upit:
samo određenih redova
Dosad smo razmatrali učitavanje svih podataka sadržanih u tabeli i učitavanje svih
select name as employeeName
podataka samo iz određenih kolona. Sada ćemo preći na učitavanje samo određenih
from employee;
redova. To je korisno jer često treba da iz jedne ili više tabela učita te samo zapise koji
U ovom upitu preimenovali smo kolonu name u employeeName, ali samo u kon- ispunjavaju određene uslove. Ta mogućnost postaje još važnija kada je potrebno uči
tekstu ovog upita. Rezultati izvršavanja ovog upita u bazi podataka employee izgle- tati samo nekoliko traženih redova iz veoma obinme tabele.
daju ovako: To se može obaviti pomoću odredbe WHERE komande SELECT. Jednostavan primer
+---------------+ bio bi sledeći:
l employeeName se lect employeeiD, name
+---------------+ from employee
Ajay Patel
Nora Edwards where job='Programmer';
Candy Burnett (Uzgred, imajte u vidu da se tekst upita može rasporediti u više redova. Svaki upit
Ben Smith se završava znakom tačka i zarez. (;). Upite pišemo na taj način da bi bili čitljiviji.)
+---------------+ Rezultati izvršavanja ovog upita u bazi podataka employee izgledaju ovako:
4 rows in set (0.01 sec)
Kao što vidite, sadržaj kolone name sada je prikazan ispod zaglavlja employeeName .
+- --- - --------+--------------+
l employeeiD l name
Identifikator employeeName poznat je kao a/ijas (engl. alias). Postoje određena pra- +--- ----------+--------------+
vila o tome šta se može a šta se ne može raditi sa alijasima, koja ćemo objasniti kad 6651 l Ajay Patel l
dođemo na tu temu . 7513 l Nora Edwards l
Navedeni primer alijasa nije naročito koristan. Međutim, pravu moć alijasa shva- +- ------------+--------------+
2 rows in set (0.42 sec)
ti ćete kad počnete da pišete složenije upite i upite u kojima se nešto izračunava.
Alijasi se mogu zadavati i za tabele, kao u sledećem primeru: 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.
select e.name
from employee as e; Obratite pažnju na to da smo u upitu kombinovali uslov s kolonama koje nam tre-
baju (employeeiD i name) da bismo učitali samo podatke koji su nas zanimali .
Trebalo bi da rezultati ovog upita budu isti kao da smo ga napisali bez upotrebe ali-
U ovom primeru, u odredbi WHERE zadali smo ispitivanje jednakosti. Obratite
j asa. Ovaj način notacije postaće koristan kada u narednom poglavlju počnete da
pa žnju na to da u SQL-u znak = služi za ispitivanje jednakosti. To je različito od mn -
izvršavate upite koji obuhvataju više tabela.
gi b drugih programskih jezika, u kojima se za tu namenu koristi == ili eq.
84 PoglavlJe o KonscenJe up1ta u My:;>UL-u
Uklanj anje dupli ran ih vrednosti pomoću opcije DISTINCT
Postoji veliki broj funkcija koje se mogu zadati u odredbi WHERE i koje ćemo detaljno d.IJ C ove podatke:
objasniti u poglavlju 8. Zasad ćemo navesti samo operatore koji se najčešće koriste:
--- ------------------+
• Jednakost, ili=, što smo već koristili. job
• Nejednakost (različitost), koja se piše kao ! = ili <>. --- ------------------+
Programmer
• Sve kombinacije > (veće od), < (manje od), >= Uednako ili veće od), i <= Ued- Programmer
nako ili manje od). Sys tems Administrator
OBA
• IS NULL i IS NOT NULL, pomoću kojih se ispituje da li određena vrednost jeste
ili nije NULL. To ne možete utvrđivati pomoću izraza nekavrednost=NULL. (Zbog
-- -------------------+
rows in set (0 . 01 sec)
čega to ne može, objasnićemo u poglavlju 8.)
Obratite pažnju na to da se podatak Programmer pojavljuje dvaput jer postoji
• Uobičajeni aritmetički operatori koje biste očekivali i koji se najčešće koriste
ll dva reda tabele. Upit je u čitao listu svih vrednosti iz kolone job tabele employee .
u kombinaciji s operatorima za poređenje. Na primer, možete ispitati da li je
A sada, pogledajte sledeći upit:
nekavrednost > nekadrugavrednost*lO.
• lect distinct job
• Standardni logički operatori AND, OR i NOT, koji se koriste za povezivanje više It om employee;
uslova. Budući da imaju niži prioritet od operatora za poređenje, na primer,
izraz plata > 30000 AND plata < 50000 izračunava se kako biste i očekivali. Ovaj upit daje sledeće rezultate:
-- --------+
4 l
Uklanjanje dupliranih vrednosti pomoću -- --------+
row in set (0 . 01 sec)
opcije DISTINCT Prema rezultatima ovog upita, kolona j ob sadrži četiri vrednosti . To navodi na
Pomoću rezervisane reči DISTINCT navodite da u rezultatima upita ne želite da vidite
po~rešan zaključak jer nije tačno da u toj koloni postoje četiri različite vrednosti. Ako
duplirane vrednosti. Na primer, sledeći upit:
pogledate podatke u tabeli, videćete da kolona j ob sadrži samo tri različite vrednosti.
select job Lako vam se može dogoditi da greškom zadate prethodni upit kada ste imali na
from employee; 11111u sledeći upit:
l ct count(distinct job) from employee;
Sortiranje učitanih rezultata pomoću odredbe ORDER BY
86 Poglavlje 6 Korišćenje upita u MySQL-u
Sledeća 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
l/dvajanje određenih grupa podataka pomoću
koje deluju na grupe redova. Jedina takva funkcija koju smo dosad pomenuli jeste
count (), ali u poglavlju 8 razmotrićemo više drugih. opcije HAVING
Pogledajte sledeći upit: · l c· d cća odredba komande SELECT jeste odredba HAVING. Odredba GROUP BY kojoj je
olodata odredba HAVING deluje na sličan način kao komanda SELECT kojoj je dodata
select count(*), job
ou lc cdba WHERE. Na primer:
from employee
group by job; ct count(*), job
1
Ovaj upit prebrojava zaposlene po radnom mestu- tj. utvrđuje broj zaposlenih. po l e om employee
11 oup by job
svakom radnom mestu. Ako izvršite ovaj upit u bazi podataka employee, trebalo bt da
lt.,ving count (*l =l;
dobijete rezultat nalik na sledeći:
O vaj upit učitava sva radna mesta u firmi na kojima je zaposlen samo po jedan slu-
+----------+-----------------------+ :hl'nik. Trebalo bi da rezultati budu nalik na sledeće:
l count(*) l job l
+----------+---------------- - ------+ ---- ----+-----------------------+
l l DBA l count(*) l job l
2 l Programmer l ----- -- -+-----------------------+
1 l Systems Administrator l l l DBA l
+----------+----------------- - -----+ l l Systems Administrator l
3 rows in set (0.04 sec) -- ------+---------------------- -+
' rows in set (0.05 sec)
Postoje dve razlike između načina na koji odredba GROUP BY radi u MySQL-u
i u standardnom ANSI SQL-u. Prema našem dosadašnjem iskustvu, početnici u jeziku SQL često brkaju odredbe
U ANSI SQL-u, u odredbi GROUP BY morate navesti sve kolone koje ste zadali WII ERE i HAVING. Odredbu WHERE možete upotrebiti U gotovo svakom upitu koji snu-
u odredbi SELECT. MySQL dozvoljava da u odredbi GROUP BY zadate i dodatna polja \li tc da biste zadali uslove koji se odnose na pojedinačne redove . Odredbu HAVING
~ oristite kada određeni uslov treba da važi za celu grupu.
kojih nema u odredbi SELECT. .
MySQL omogućava da izaberete redosled grupa kojim se prikazuju rezultati. Podra-
zumeva se rastući redosled. Ako želimo da ponovimo poslednji upit, ali tako da se
Sortiranje učitanih rezultata pomoću odredbe ORDER BY
rezultati prikažu opadajućim redosledom, možemo upotrebiti sledeći upit:
S k-d eć a odredba komande SELECT jeste odredba ORDER BY koja omogućava sortiranje
select count(*), job t l'rttltujućih redova po jednoj ili više kolona. Redosled sortiranja može biti rastući , što
from employee st' ozna čava sa ASC, ili opadajući, što se označava sa DESC. Na primer:
group by job dese;
' 1 ct *
l tom employee
o td r by j ob a se , n me d sc ;
Sažetak
BB Poglavlje 6 Korišćenje upita u MySQL-u
Kada u odredbi LIMIT za damo dva parametra, prvi je relativni pomak (red od
Ovaj upit učitava sve redove i kolone iz tabele emplo~e~ .. R:zul.tati. ~e bi~i sortirani
kojeg počinje učitavanje) a drugi je maksimalni broj redova koji želimo da se učita.
po abecednom redosledu sadržaja kolone job, a .ako dvoje 1h v1se ljudl 1~1a 1s.t o radno
Uporedite to s prethodnim slučajem: kada zadamo samo jedan parametar, on predsta-
mesto, oni će biti sortirani opadajućim abecedmm redosledom po unemma l prezl-
vlja maksimalni broj redova koji želimo da se učita.
menima. Rezultati upita izgledaju ovako: Kada zadajemo pomak, on počinje od O (kao što se vidi u prethodnom primeru-
+ --------------+-----------------------+--------------+ za šesti red zadali smo pomak 5). Prvi navedeni primer upotrebe odredbe LIMIT učitava
+------------ - 1 · b l departmentiD l
1 employeeiD l name JO --------------+ redove od O do 4, a drugi primer učitava redove od 5 do 7.
+------------+---------------+-----------------------i 42 l Ako kao vrednost drugog parametra zadate -1, upit će učitati redove od pomaka
l 9842 l Ben Smith DBA l 128 l do kraja tabele.
l 7513 l Nora Edwards Programmer l 128 l
1 6651 1 Ajay Patel Programmer Odreba LIMIT se najčešće koristi u kombinaciji sa odredbom ORDER BY da bi rede-
9006 1 candy Burnett Systems Administrator l 128 l sled redova u rezultatima upita imao određeni smisao. Imajte u vidu da bez odredbe
l
+------------+---------------+-----------------------+--------------+ ORDER BY, redosled redova rezultata nije predvidljiv.
4 rows in set (0.02 sec) Ova odredba je naročito korisna u We b ili GUI aplikacijama koje koriste MySQL
Ako za kolonu zadate odredbu ORDER BY bez opcije ASC ili DESC, p~~razumeva se jer omogućava jednostavan mehanizam podele rezultata na stranice.
ASC. Ukoliko ne zadate odredbu ORDER BY, ništa se ne može pretpostav1t1 o redosledu
redova u skupu rezultata.
Sažetak
Ograničavanje broja redova rezultata pomoću • Komanda SELECT ima
SELECT kolone
sledeći opšti oblik:
U sledećem poglavlju
U sledećem poglavlju, "Složeniji upiti", razmatraćemo upite koji obuhvataju više
tabela i druge detalje komande SELECT. 7
Složeniji upiti
• Izvršavanje upita koji obuhvataju više tabela primenom sledećih vrsta spojeva:
• Prirodnih, unutrašnjih i unakrsnih spojeva
• Jednakovrednih spojeva
• Levih i desnih spojeva
• Podupiti
• Upotreba opcija komande SELECT
Kao što vidite, u odredbi FROM zadali smo dve tabele umesto samo jedne. U ovom ' " podaci besmisleni! Ovaj skup rezultata, koji se sastoji od svih mogućih kombinacija
slučajuželimo da učitamo imena zaposlenih i nazive službi u kojima rade. Rezultati lt'dova iz dve tabele, zove se Dekartov proizvod (engl. Cartesian product) dveju tabela.
ovog upita izgledaju ovako: Sasvim je očigledno da je odredba WHERE ključna za dobijanje rezultata koji nam
+---------------+--------------------------+ li l!baju. Kada u upitu spajamo dve tabele, uslov ili grupa uslova pomoću kojih pove-
l name l name t ujemo tabele zove se spojni uslov. U ovom slučaju, uslov je employee. department ID
+---------------+--------------------------+ de partment. department ID, što je veza između tabela koju smo definisali preko
Ben Smith Finance \poljnih ključeva još u šemi baze podataka.
Ajay Patel Research and Development
Nora Edwards Research and Development Kada želite da istovremeno učita te podatke koji se nalaze u više tabela, morate upo-
Candy Burnett Research and Development trebiti veze između tih tabela da biste pronašli podatke koje tražite. Ponekad to znači
+---------------+--------------------------+ da morate pronaći put od podataka koje znate do podataka koje tražite. U narednom
4 rows in set (0.42 sec) odeljku opširnije ćemo objasniti tu ideju.
Kako smo dobili ove rezultate? Prvo, zadali smo kolone koje postoje u različitim U prethodnom primeru rezultata obratite pažnju i na to da u zaglavljima obe
tabelama. (Obratite pažnju na to da smo upotrebili notaciju s tačkom, kako je opisano kolone stoji natpis"name"jerje to ime svake kolone u kontekstu tabele kojoj pripada.
u poglavlju 6, da bismo razlikovali kolonu name iz tabele employee od istoimene ltezultati će biti razumljiviji ako upotrebite alijase, na primer:
kolone koja postoji i u tabeli department.) Da bi to moglo da radi, morali smo da sel ect employee.name as employeeName, department.name as department-
navedemo imena obeju tabela u odredbi FROM. Name
Najzanimljiviji deo ovog upita jeste odredba WHERE. Ako ovaj upit izvršite bez Jrom employee, department
where employee . departmentiD department.departmentiD;
odredbe WHERE, u sledećem obliku:
Ovaj upit daje sledeće rezultate:
select employee.name, department.name
from employee, department; 1---- -----------+--------------------------+
dobićete sledeće rezultate:
l employeeName l departmentName
1--- ------------+--------------------------+
+-- -- -----------+--------------------------+ Ben Smith Finance
l name l name Ajay Patel Research and Development
+---------------+--------------------------+ Nora Edwards Research and Development
Ajay Patel Finance Candy Burnett Research and Development
Nora Edwards Finance ·--- ------------+--------------------------+
Candy Burnett Finance 1 rows in set (0.55 sec)
Ben Smith Finance
Ajay Patel Research and Development Sadržaj ovog skupa rezultata je razumljiviji nego prethodni.
Nora Edwards Research and Development
Candy Burnett Research and Development Spajanje više od dve tabele
Ben Smith Research and Development Spajanje više tabela ne razlikuje se od spajanja samo dve tabele.
Ajay Patel Human Resources Recimo da treba utvrditi iz koje su službe zaposleni koji su radili za klijenta čije je
Nora Edwards Human Resources
ime Tele o Inc. Kako da dođemo do tih podataka?
Candy Burnett Human Resources
Ben Smith Human Resources Pošto znamo ime klijenta, u koloni clientiD tabele client možemo pronaći njegovu
Ajay Patel Marketing ši fru . Pomoću tog podatka potražić~mo u tabeli assignment poslove obavljene za tog
Nora Edwards Marketing klijenta i šifre zaposlenih (kolona employee ID) koji su ih obavili. S tim podacima
Candy Burnett Marketing možemo zatim pronaći u tabeli employee šifre službi u kojima rade ti zaposleni. I najzad,
Ben Smith Marketing
p o moću tih podataka pronaći ćemo u tabeli department odgovarajuće nazive službi!
+- - -------------+--------------------------+
16 rows in set (0.01 sec) Pošto smo osmislili putanju traženja kroz sve Četiri tabele, preostaje nam da tu
logiku preslikamo u odgovarajući upit, što daje sledeće:
Prvi upit, kojem je pridružena odredba WHERE, prikazuje zaposlene s tačnim poda-
cima o slu žbama u kojima rade, a drugi upit prikazuje sve kombinacije zaposlenih i select department.name
irom c l ient, assignment, employee, department
slu žbi , pri če mu nij e moguće utvrditi koji redovi rezultata sadrže ta č n e pod.11 kl· a koji wh re c li ent . name= 'Telco Inc '
I'U91č1VIJe l ::IIUZeniJI Ufllll Vrste spoJeva 1zmeau tall' 1:1
Osnovni spoj
Spajanje tabele same sa sobom - samospoj U prethodnom odeljku, pomenuli smo koncept Dekartovog proizvoda. On se ponekad
Kao što jednu tabelu spajamo s drugom, isto tako možemo je spojiti i sa samom sobom. naziva punim spojem (engl. full join) ili unakrsnim spojem (engl. cross join), ali bez obzira
Zašto bismo to uradili? Ponekad ćete tražiti veze između redova u istoj tabeli. Pretpo- na ime, sastoji se od skupa svih mogućih kombinacija redova tabela. Kada tom spoju
stavimo da želimo da saznamo imena svih zaposlenih koji rade u istoj službi kao Nora dodamo određeni uslov (kao što je employee. department ID = department. de-
Edwards. Da bismo došli do tih podataka, prvo moramo u tabeli employee pronaći šifru partmentro), dobijamo nešto što se ponekad nazivajednakovredni spoj (engl. equij"oin),
slu žbe (kolona department ID) u kojoj radi Nora, a zatim ćemo u tabeli employee koji ograničava broj redova u skupu rezultata.
potra7iti i sve ostale zaposlene koji rade u toj službi.
ruyli:IVIJt: l .:>IULt:nljl Upili
Podu piti
Dosad smo u odredbi FROM zadavali listu tabela razdvojenih operatorom zarez. Time
Levi spoj radi tako što za sve redove tabele na levoj strani spoja (u ovom primeru to
se dobija unakrsni spoj, kao što je već opisano, koji se pretvara u jednakovredni spoj kada
ll' tabela employee) traži odgovarajuće redove u tabeli na desnoj strani spoja. Pronađeni
mu dodamo odredbu WHERE. MySQL podržava više oblika sintakse za ou vrstu spoja.
1 ·dovi se postavljaju pored leve tabele. Za svaki red iz leve tabele koji nema parnjaka u
Pogledajmo izvorni upit:
desnoj tabeli, operator LEFT JOIN dodaje red vrednosti NULL . Redove iz leve tabele bez
select employee.name, department . name parnjaka u desnoj možete pronaći ako zadate uslov daje vrednost ključa u desnoj tabeli
from employee, department
NULL.
where employee.departmentiD ; department.departmentiD;
Pogledajte ponovo primer. U ovom spoju, za svakog zaposlenog koji je radio za
Umesto zareza, može se zadati neobavezna rezervisana reč JOIN: nekog spoljnog klijenta, dobićemo red s podacima o zaposlenom i o poslu koji je
select employee.name, department.name obavio. Kada za nekog zaposlenog ne postoji odgovarajući red u tabeli assignment, levi
from employee join department spoj generiše "prazan red" u kojem sve kolone sadrže vrednost NULL. Te prazne redove
where employee.departmentiD ; department.departmentiD;
možemo pronaći tako što potražimo sve zaposlene koji su nešto radili za spoljnog
Osim reči JOIN, možete zadati i CROSS JOIN ili INNER JOIN. klijenta čija šifra (kolona clientiD) sadrži vrednost NULL. (Ne bi trebalo da takav
Kada zadate ovu vrstu spoja, MySQL pretražuje sve tabele koje ste zadali i pokušava s l učaj postoji u tabeli assignment budući daje clientiD polje ključa.)
da pronađe najefikasniji način spajanja, pri čemu ne spaja tabele obavezno redosledom U verzijama MySQL-a pre 4.1, ta tehnika se često koristila jer nije bilo podu pita.
koji ste naveli. Događa se i to da upit ne bude uvek najbolje optimizovan, što ćemo Podupiti su objašnjeni u nastavku ovog poglavlja.
detaljnije razmatrati u poglavlju 19,"0ptimizovanje upita" .Ako želite da zanemarite U ovom primeru upotrebili smo operator LEFT JOIN, ali isto tako smo mogli da
rezultate optimizatora i naložite MySQL-u da spoji tabele baš redosledom koji ste upotrebimo i operator RIGHT JOIN, koji deluje na isti način, s tom razlikom što je
naveli, zamenite reč JOIN rečima STRAIGHT JOIN. desna tabela osnova, a nedostajući redovi iz tabele na levoj strani dopunjuju se vred-
nostima NULL .
Levi i desni spoj
Kada smo u prethodnom odeljku zadavali jednakovredne spojeve, navodili smo rezer-
visane reČi JOIN, CROSS JOIN, INNER JOIN ili možda STRAIGHT JOIN, i tražili pove- Pod upiti
zane redove u dve ili više tabela. Šta ako želimo da pronađemo sve redove u jednoj Podupit (engl. subquery) jeste upit unutar drugog upita, odnosno upit čiji se rezultat
tabeli za koje ne postoje odgovarajući redovi u drugoj tabeli? koristi u drugom upitu. Ponekad se nazivaju i ugnežđenim upitima (engl. nested queries).
Razmotrimo slučaj u kojem želimo da pronađemo zaposlene koji još nisu radili na Pod upiti su novina uvedena u MySQL-u 4.1. Tu mogućnost korisnici su već duže
poslovima za spoljne klijente kompanije, tj. zaposlene čije šifre (vrednosti u koloni vreme zahtevali. Podupiti ne dodaju novu funkcionalnost, ali su upiti često lakše razu-
employeeiD) ne postoje u tabeli assignment .To se može uraditi pomoću levog spoja, nlljivi kada se, umesto složenih spojeva između tabela, upotrebe podupiti.
odnosno operatora LEFT JOIN, na sledeći način: Već ste videli primer podupita a da toga niste ni bili svesni. Upiti za brisanje i ažuri-
ra nj e redova u više tabela istovremeno koje smo razmatrali u poglavlju 5, "Umetanje,
select employee . name
from employee left join assignment brisanje i ažuriranje podataka" ,jedna su vrsta specijalizovanog pod upita.
on employee.employeeiD; assignment.employeeiD U ovom poglavlju opisaćemo upotrebu podupita u komandama SELECT.
where clientiD is null; MySQL-u su dodate dve osnovne vrste podupita:
Ovaj upit daje sledeće rezultate: • Podupiti za izvedene tabele
+- - -------------+ • Podupiti za izraze.
l name l Podupiti za izraze zadaju se u odredbi WHERE komande SELECT. Oni se dele na dve
+--- ------------+
l Ajay Patel l podvrste:
l Candy Burnett l • Pod upite čiji je rezultat jedna vrednost ili red
l Ben Smith l
• Podupite za izraze logičkog tipa
+-- -------------+
3 rows in set (0.49 sec) Po gledaćemo redom po jedan primer svake pomenute vrste pod upita.
Ako pogledate sadržaj tabela, lako ćete se uveriti da su rezultati tačni, ali kako sm o
do njih došli ?
l UU ruyiCIVIJt: l .:>IULt:IIIJI UfJill
Pod upiti
Podupiti za izvedene tabele , . . . U ovom primeru tražimo zaposlenog koji bi mogao zaslužiti "titulu" najvrednijeg
Podupiti za izvedene tabele (engl. derived table subqueries) omogucavaJU zadava~Je u~lta 1.1dnika u firmi. Pita~ e je sledeće: koji je zaposleni proveo najviše radnih sati dnevno
u odredbi FROM drugog upita. Time se formira privremena tabela koja se dodaje up1tu. 11~ nekom poslu?
Pogledajte sledeći jednostavan upit: Ovo su rezultati izvršavanja upita:
select employeeiD, name from employee where job='Programmer'; 1--- ----------+---------- ----+
Jasno je da ovaj upit učitava šifre i imena zaposlenih koji su programeri. Ovaj upit l employeeiD l name
možemo upotrebiti u drugom upitu da bismo dobili drugi koristan rezultat:
l -- ----------+--------------+
l 7513 l Nora Edwards l
select programmer.name 1-- -----------+------------ --+
from (select employeeiD, name from employee where job='Programmer') l row in set (0.42 sec)
as programmer,
assignment Mogu se napisati i upiti koji umesto jedne vrednosti, vraćaju red s više vrednosti, ali
where programmer.employeeiD = assignment.employeeiD; .Jl: korist od toga često ograničena. U nastavku teksta obradićemo primer takvog upita.
U ovom primeru upotrebili smo podupit (select employeeiD, name from
Podupiti za izraze logičkog tipa
employee where j ob= • Programmer ') da bismo formirali izvedenu tabel u čiji redovi
Podupiti za izraze logičkog tipa (engl. Boolean expression subqueries) omogućavaju da se
sadrže samo kolone employee ID i name. Privremenoj tabeli dodelili smo alijas 'pro-
u glavnom upitu upotrebi jedna od nekoliko specijalnih funkcija za rad s rezultatima
grammer •. Tu tabel u možemo potom pretraživati na isti način kao bilo koju drugu
l ogičkog tipa. Te funkcije SU IN, EXISTS i (grupisano) ALL, ANY i SOME.
tabelu. U ovom primeru upotrebili smo je da bismo utvrdili koji su programeri radili
Rezervisana reč IN omogućava poređe~e s grupom vrednosti. Pogledajte sledeći
za spoljne klijente i dobili smo sledeće rezultate:
upit:
+--------------+ ne lect name
l name I r om employee
+--------------+ where employeeiD not in
l Nora Edwards l (select employeeiD
+--------------+ from assignment);
1 row in set (0.01 sec)
Ovaj upit daje jednake rezultate kao razmatrani upit u primeru za operator LEFT
Podupiti koji daju jednu vrednost JOIN (levi spoj), a to su zaposleni koji nisu obavili nijedan posao za nekog spoljnog
Kao u prethodnom odeljku, počećemo jednostavnim upitom: klijenta. Rezervisana reč IN omogućava da utvrdite da li se data vrednost nalazi u
odre đenom skupu mogućih vrednosti. U ovom slučaju dobijamo jednake rezultate
select max(hours) from assignment;
kao one koje smo dobili u primeru upita za operator LEFT JOIN:
Rezultat ovog upita je jedna vrednost, koja predstavlja najveći broj radnih sati utro-
1-- ---- ---------+
šenih na neki posao. Ovde smo upotrebili MySQL-ovu funkciju koju dosad nismo l name
pominjali: to je funkcija max () , koja pronalazi najveću vrednost u zadatoj koloni_ 1--- ------------+
tabele. Funkcijom max () bavićemo se više u poglavlju 8, "Upotreba MySQL-ov1h / Ajay Patel l
ugrađenih funkcija u komandi SELECT". U pod upitima koji vraćaju jednu vrednost l Candy Burnett l
(engl. single-value subqueries), često se ova vrsta funkcija koristi za dobijanje međurezul
l Ben Smith l
1-- ------- ------+
tata koji se potom koristi za druge proračune. 3 rows in set (0.45 sec)
Kao u prethodnim odeljcima, ovaj upit ćemo upotrebiti unutar drugog upita.
Zanimljivo je da se pomoću operatora IN podaci upita mogu porediti i s listom
Rezultat upita koji vraćaju jednu vrednost jeste određena vrednost koja se potom
navedenih vrednosti, kao u narednom primeru:
obično poredi s nekom drugom vrednošću. Pogledajte sledeći upit:
nelec t name
select e.employeeiD, e.name
Irom employee
from employee e, assignment a
where employeeiD not in (6651, 1234);
where e.employeeiD = a.employeeiD
and a.hours = (select max(hours) from assignment);
102 Poglavlje 7 Sl oženiji upiti
Opcije komande SELECT
Rezervisana reč EXISTS deluje na malo drugačiji način od rezervisane reči IN. veći od broja radnih sati nekog programera. To se radi u delu upita a. hours > ALL,
U upitima u kojima je zada to EXISTS, pod upit zapravo koristi podatke iz spoljnog gde se utvrđuje da li je broj radnih sati zaposlenog veći od broja radnih sati svakog
(glavnog) upita. To se ponekad zove kore/iran (engl. correlated) pod upit. programera pojedinačno.
Pogledajte sledeći upit: Neće vas iznenaditi informacija da ovaj upit ne vraća nijedan red podataka, čime
select e.name, e.employeeiD dokazuje da niko u toj firmi ne radi više od programera.
from employee e
where not exists
(select * Opcije komande SELECT
from assignment Kada smo prvi put razmatrali komandu SELECT, opisali smo skraćeni oblik opšte
where employeeiD = e.employeeiD);
sintakse te komande. Pogledajmo sada njenu potpunu sintaksu da bismo videli šta još
U ovom primeru takođe tražimo zaposlene koji nisu nikad radili na poslovima za ne znamo.
spoljne klijente. U MySQL-ovoj dokumentaciji stoji da komanda SELECT ima sledeći opšti oblik:
Pod upit učitava redove u kojima je ispunjen uslov da je vrednost u koloni SELECT [STRAIGHT_JOIN)
employee ID tabele assignment jednaka vrednosti u koloni employee. employee ID. [SQL_SMALL_RESULT) [SQL_BIG_RESULT) [SQL BUFFER RESULT)
Vrednost e. employee ID potiče iz glavnog upita. Evo šta MySQL zapravo radi: za [SQL_CACHE l SQL_NO_CACHE) [SQL CALC FOuND ROWSJ [HIGH_PRIORITY)
svaki red iz tabele employee ispituje rezultate podupita; ako u tom skupu ne postoji [DISTINCT l DISTINCTROW l ALL) - - -
izraz_za_učitavanje, ...
nijedan red, tj. skup je prazan (WHERE NOT EXISTS), podatke o zaposlenom prosleđuje
u konačan skup rezultata upita. [INTO {OUTFILE l DUMPFILE} 'ime_datoteke' opcije_pri_izvozu]
[FROM reference_tabela
Mada će neki korisnici lakše razumeti ovu sintaksu, rezultate jednake onima iz [WHERE uslov]
prethodnog odeljka dobijamo i pomoću upita s levim spojem (LEFT JOIN). Ovaj upit [GROUP BY {celobrojna vrednost ime kolone l formula}
daje potpuno jednake rezultate: [ASC l DESC) , . .. J -
(HAVING uslov]
+---------------+-------------+ [ORDER BY {celobrojna vrednost ime kolone l formula}
l name l employeeiD l
[ASC l DESC) , ... J -
+---------------+-------------+ [LIMIT [pomak,] rows l rows OFFSET pomak]
l Ajay Patel l 6651 l
[PROCEDURE ime_procedure(lista_argumenata)]
l Candy Burnett l 9006 l
[FOR UPDATE l LOCK IN SHARE MODE))
l Ben Smith l 9842 l
+---------------+-------------+ Većinu odredaba već poznajete. Pogledajmo ukratko one koje dosad nismo
3 rows in set (0.00 sec) pominjali:
Rezervisane reči ALL, ANY i SOME omogućavaju poređenje sa skupom vrednosti koje • Odredba STRAIGHT JOIN na samom početku komande nalaže optimizatoru
vraća podupit. upita da spoji tabele baš redosledom koji ste zadali. Učinak ove opcije jednak je
Pretpostavimo da Nora Edwards, koje se možda sećate kao programera koji najviše kao kada zadate STRAIGHT JOIN u odredbi WHERE, kao što je napomenuto u
radi, želi da dokaže da niko nema više radnih sati od programera . Da bi dokazala tu prethodnom delu ovog poglavlja. To je jedno od MySQL-ovih proširenja ANSI
činjenicu, smislila je sledeći upit: standarda za jezik SQL.
select e.name • Opcije SQL_SMALL_RESULT, SQL_BIG_RESULT i SQL_BUFFER_RESULT omoguća
from employee e, assignment a
vaju optirnizovanje upita. Pomoću opcija SQL_SMALL RESULT i SQL BIG RESULT
where e.employeeiD = a.employeeiD
and a.hours > all obeveštavate MySQL da očekujete da će se skup rezul~ata upita sastoJati od malog,
(select a.hours odnosno velikog broja redova. Opcija SQL_BUFFER_RESULT nalaže MySQL-u da
from assignment a, employee e skup rezultata smesti u privremenu tabel u. Tu opciju možete iskoristiti kada znate
where e.employeeiD = a.employeeiD da će slanje skupa rezultata klijentskom programu potrajati prilično dugo, a želite
and e.job='Programmer'); da izbegnete da on za to vreme blokira tabele iz kojih podaci treba da se učitaju.
Podu pit učitava listu radnih sati, pojedinačno po programeru i po poslu koji je Ove opcije su MySQL-ova proširenja ANSI standarda za jezik SQL.
obavio. Potom glavni upit ispituje da li postoji drugi zaposleni čiji je broj r:~dnih sati
104 Poglavlje 7 Složeniji upiti rrranJa
• SQL CACHE i SQL NOCACHE nalažu MySQL-u da rezultate smešta, odnosno ne Pod upiti
smeŠta u ostavu (i~eš). Ooš jedno proširenje ANSI standarda za jezik SQL.) • Pod upit je upit ugnežđen unutar drugog upita.
• SQL CALC FOUND ROWS se koristi u odredbi LIMIT; zahteva da MySQL izraČuna • Pod upiti mogu da vrate jednu vrednost, red podataka ili skup vrednosti. Mogu se
koliko bi ~kup no-redova upit vratio kada ne bi sadržao odredbu LIMIT. Taj broj koristiti i za ispitivanje logičkih uslova pomoću operatora SOME, ALL ili ANY
redova se zatim može učitati pomoću opcije select found_rows () ; Uoš jedno • Pomoću operatora EXISTS može se utvrditi da li u rezultatima podupita postoji
proširenje ANSI standarda za jezik SQL). Svrha ove opcije jeste da se izbegne red koji je povezan s nekim redom glavnog upita.
ponavljanje posla. U verzijama MySQL-a u kojima ova opcija nije postojala,
isti rezultat je mogao da se postigne tako što se najpre izvrši upit s funkcijom Opcije komande SELECT
COUNT (*),a zatim i drugi upit SELECT koji sadrži opciju LIMIT.
• Komandi SELECT mogu se pridružiti razne opcije koje optirnizuju izvršavanje te
• HIGH PRIORITY obaveštava MySQL da taj upit treba da ima prednost nad svim komande.
komandama UPDATE koje čekaju pristup tabelama navedenim u upitu .
• Pomoću komande SELECT INTO OUTFILE mogu se kopirati podaci iz tabele u
• Već smo opisali opciju DISTINCT, a DISTINCTROW je njen sinonim. ALL ima spoljnu datoteku, slično načinu na koji smo u poglavlju 5 učitavali podatke iz
suprotan efekat (učitava sve duplikate) a to je i podrazumevana opcija. datoteke u tabelu pomoću komande LOAD DATA INFILE.
• SELECT INTO OUTFILE deluje suprotno od komande LOAD DATA INFILE koju • Komandi se mogu dodati procedure (napisane na jeziku C++) koje obrađuju
smo razmatrali u poglavlju 5, "Umetanje, brisanje i ažuriranje podataka". podatke pre prenošenja u MySQL ili iz MySQL-a.
Ova komanda smešta rezultate komande SELECT u zadatu datoteku. Odredba
opcije_pri_izvozu ima isto značenje kao u komandi LOAD DATA INFILE (više
detalja o tome naći ćete u poglavlju 5). Pitanja
• Odredba PROCEDURE omogućava da zadate proceduru koja se poziva pre nego što 1. De kart ov proizvod je
se skup rezultata pošalje klijentskom programu. Ta procedura mora biti napisana a) skup svih mogućih kombinacija redova iz dve ili više tabela
na jeziku C++ i, kao takva, izlazi izvan okvira ove knjige, ali ako vam treba više b) skup kombinacija redova iz dve ili više tabela koji su logički povezani
informacija, potražite ih u MySQL-ovoj dokumentaciji.
e) skup redova iz jedne tabele kojima su dodati odgovarajući redovi iz druge
• Odredbe FOR UPDATE i LOCK IN SHARE MODE deluju samo ako vaŠa mašina baze tabele, a gde to nije moguće, rezultujući red je popunjen vrednostima
podataka zaključava podatke na nivou stranice ili reda. U praksi, opcija je upo- NULL na mestima gde bi bili podaci iz druge tabele
trebljiva ako koristite mašine InnoDB i BDB.Ako zadate FOR UPDATE, zaključa d) nije ništa od prethodnog
vanje podataka će biti isključivo, a ako zada te LOCK IN SHARE MODE, zaključavanje
2. Levi spoj je
će biti deljeno.Vrste zaključavanja razmotrićemo u poglavlju lO",Upotreba trans-
akcija u InnoDB tabelama". a) skup svih mogućih kombinacija redova iz dve ili više tabela
b) skup kombinacija redova iz dve ili više tabela koji su logički povezani
e) skup redova iz jedne tabele kojima su dodati odgovarajući redovi iz druge
Sažetak tabele, a gde to nije moguće, rezultujući red je popunjen vrednostima
NULL na mestima gde bi bili podaci iz druge tabele
Spojevi d) nije ništa od prethodnog
• Spoj je postupak povezivanja dveju tabela. Tabele koje povezujemo navodimo u
3. Jednakovredni spoj je
odredbi FROM, zajedno s vrstom spoja. Treba takođe zadati i uslov koji opisuje na
koji način bi tabele trebalo da budu spojene. a) skup svih mogućih kombinacija redova iz dve ili više tabela
• Operator zarez i rezervisane reči JOIN, INNER JOIN i CROSS JOIN deluju na isti b) skup kombinacija redova iz dve ili više tabela koji su logički povezani
na č in, tj. kombinuju zadate tabele tako da omoguće traženje podataka u svim e) skup redova iz jedne tabele kojima su dodati odgovarajući redovi iz druge
tim tabelama. tabele, a gde to nije moguće, rezultujući red je popunjen vrednostima
NULL na mestima gde bi bili podaci iz druge tabele
• Lev i desni spojevi omogućavaju pronalaženje redova u jednoj tabeli koji nemaju
odgovarajuće redove u drugoj tabeli. d) nije ništa od prethodnog
106 Poglavlje 7 Složeniji upiti u s1eaecem poglaVlJU
4. Korelirani podupit se tako zove zato što uspostavlja korelaciju između Vežbe
a) redova različitih tabela 1.
select name, skill
b) redova iste tabele
from employee, employeeSkills
e) dva spoja where employee.employeeiD = e mpl oye e Skills.employeeiD;
d) redova glavnog upita i redova podupita 2.
5. Razlika između upita označenih sa 5.1 i 5.2 u nastavku teksta j e sledeća select client.clientiD, name
from client left join assignment
a) nema razlike on client . clientiD = assignmen t. clientiD
b) učitavaju različite podatke where employeeiD is NULL;
e) učitavaju iste podatke ali je verovatno da će se levi spoj (upit 5.1) brže 3.
select clientiD, name
uči tavati
from client
d) učitavaju iste podatke ali je verovatno da će se podupit (upit 5.2) brže where not exists
uči tavati (select *
from assignment
Upit5 .1:
where assignment . clientiD client.clientiD);
select employee.name
from employee left join assignment
on employee.employeeiD = assignment.employeeiD
where clientiD is null;
U sledećem poglavlju
Upit 5.2: U poglavlju 8",Upotreba MySQL-ovih ugrađenih funkcija u komandi SELECT",
select e.name, e.employeeiD razmatraćemo funkcije koje postoje u MySQL-u za upotrebu u komandi SELECT.
from employee e
where not exists
(select *
from assignment
where employeeiD e. employeeiD) ;
Vežbe
1. Napišite upit koji prikazuje imena zaposlenih i njihove stručne kvalifikacije.
2. Napišite upit koji pomoću operatora LEFT JOIN formira listu klijenata za koje
nijedan od zaposlenih nije obavio nijedan posao.
3. Upit iz vežbe broj 2 napišite tako da koristi operator EXISTS.
Odgovori
Pitanja
1. a
2. e
3. b
4. d
5. e
8
Upotreba MySQL- ovih ugrađenih
funkcija u komandi SELECT
MYSQL SADRŽI ŠIROK OPSEG UGRAĐENIH OPERATORA I FUNKCIJA koji mogu biti
korisni pri pisanju upita. Većina je namenjena upotrebi i odredbama SELECT i WHERE.
Postoje i specijalne funkcije koje deluju na grupe podataka i upotrebljavaju se u odredbi
GROUP BY. Već smo koristili osnovne operatore za poređenje i funkcije count () i
max (). U MySQL-u je na raspolaganju veliki broj ugrađenih funkcija. U ovom pogla-
vlju razmotrićemo najkorisnije među njima. Ovu knjigu nismo zamislili kao referentni
priručnik za MySQL-ove funkcije, već samo pokušavamo da predočimo sliku funkcio-
nalnosti koja je na raspolaganju.
Razmotrićemo sledeće teme:
• Operatori
• Funkcije za upravljanje tokom izvršavanja
• Funkcije za rad sa znakovnim vrednostima
• Numeričke funkcije
• Funkcije za rad s datumima i vremenima
• Funkcije za konverziju tipova podataka
• Druge funkcije
• Funkcije za upotrebu u odredbama GROUP BY.
Važno je zapamtiti da se u MySQL-u svaki izraz koji sadrži vrednost NULL svodi na
vrednost NULL, uz nekoliko izuzetaka koje ćemo istaći kada budemo naišli na njih. O
lome će biti više reči u odeljku o operatorima za poređenje vrednosti.
Poglavlje 8 Upotreba MySQL-ovih ugrađenih funkcija u komandi SELECT
MySQL podržava uobičajene aritmetičke operatore koje biste ocekivali: sabiranJe(+), Empty set (0.18 sec)
oduzimanje (-), množenje (*) i deljenje (/). Deljenje nulom daje vrednost NULL. Posle ovog uvoda, možemo preći na operatore za poređenje. Najčešće se koriste
operatori navedeni u tabeli 8.1.
Operatori za poređenje vrednosti . .
N ajvažnije što bi trebalo da zapamtite ~vezivs~ ope;atorima za poređenJe vr:~nosu Tabela 8.1 Operatori za poređenje
j este sledeće : izuzev u nekohko posebmh slucaJeva, sta god poredite s vrednoscu NULL, Operator Značenje
uvek daje NULL. To važi i za poređenje NULL s NULL:
Jednako
se lect NULL=NULL; != ili <> Različito od
< Manje od
+-- -- - -- - -- - +
l NULL=NULL l <= Jednako ili manje od
+-------- - - -+ > Veće od
NULL l >= Jednako ili veće od
·-----------+
1 row i n set (0 . 00 sec )
ll !'oglavlJe tl upotreoa My:>uL-ovm ugraaenm runKCIJa u KomanOI :>tLtLI runkCIJe za upravlJanje tokom izvršavanja komandi
poređenje
Tabela 8.1 Operatori za (nastavak) Funkcije za upravljanje tokom izvršavanja komandi
Operator Značenje Najpre ćemo razmotriti grupu funkcija za upravljanje tokom izvršava~a komandi.
n BETWEEN min AND max Poređenje da li se n nalazi u opsegu vrednosti od min do max. Među njima su najkorisnije IF i CASE, koje deluju slično iskazu if, odnosno switch
n IN (skup vrednosti) Pripadnost skupu vrednosti koji se može zadati u obliku liste ili case iz većine programskih jezika.
vrednosti, izraza ili podu pita. Primer skupa: (jabuka, orah, Prototip funkcije IF izgleda ovako
breskva)
IF (el, e2, e3)
<=> Operator za jednakost koji se može upotrebiti i za NULL. Kada se
pored e dve vrednosti NULL, rezultat je l (true). Ako izraz el ima vrednost true, funkcija IF vraća rezultat e2; u suprotnom, rezultat
n IS NULL Ispituje da li n ima vrednost NULL funkcije je e3. Na primer, ako ovu funkciju upotrebimo u bazi podataka employee,
ISNULL(n) Ispituje da li n ima vrednost NULL. možemo zadati sledeći upit:
select name, if(job='Programmer', "nerd", "not a nerd")
Logički operatori from employee;
MySQL podržava sve uobičajene logičke operatore koji povezt~u delove izraza. Ovaj upit daje sledeće rezultate:
Logički izrazi u MySQL-u mogu imati vrednost 1 (true), o (false) ili NULL. Osim toga,
+---------------+--------------------------------------------+
MySQL tumači kao true (istinito, tačno) svaku vrednost različitu od nule i različitu od l name l if(job='Programmer', "nerd", "not a nerd") l
NULL. +---------------+--------------------------------------------+
Kada su vrednosti NULL u pitanju, neki elementi tabela istinitosti su malo drugačiji l Ajay Patel nerd
od onog što biste očekivali. Tabela 8.2 prikazuje logičke operatore. l Nora Edwards nerd
l Candy Burnett not a nerd
l Ben Smith not a nerd
Tabela 8.2 Logički operatori
+---------------+--------------------------------------------+
Operator Primer Značenje 4 rows in set (0.00 sec)
AND ili && n && m Logičko I. Tabela istine izgleda ovako: Funkcija CASE ima sledeće moguće prototipe (prema MySQL-ovoj dokumentaciji):
true&&true = true CASE vrednost
false&&bilo šta = false WHEN [vrednost-za-poređenje] THEN rezultat
Svi ostali izrazi svode se na NULL. [WHEN [vrednost-za-poređenje] THEN rezultat .. . ]
Logičko ILI. Tabela istine izgleda ovako:
[ELSE rezultat]
OR ili ll n ll m
END
true l lbilo šta= true
NULLI l false= NULL ili
NULL l l NULL = NULL CASE
false! l false = false WHEN [uslov] THEN rezultat
[WHEN [uslov] THEN rezultat ... ]
NOT ili NOT n Logičko NE. Tabela istine izgleda ovako:
[ELSE rezultat]
!true = false END
!false = true
Ovu funkciju možete upotrebiti da biste izdvojili jednu vrednost iz skupa od ~ih
!NULL = NULL
nekoliko. Primera radi, pogledajte sledeći upit:
XOR n XOR m Logičko isključivo ILI. Tabela istine izgleda ovako:
select workdate, case
true XOR true = false
when workdate e 2000-01-01 then "archived"
true XOR false = true when workdate e 2003-01-01 then "old"
false XOR true = true else "current"
NULL XOR n = NULL end
from assignment;
n XOR NULL = NULL
1'14 PoglavlJe 8 Upotreba My:>UL-ovlh ugrađenih tuni<CIJa u 1<omand1 :>tLtCI runKCIJe za raa sa znaKovnim vreanost1ma
Ovaj upit ispituje vrednost kolone workdate (datum posla) u svakom redu tabele Funkcije za poređenje znakovnih vrednosti
assignment. Datumi iz prethodnog veka označavaju se sa "archived", datumi iz pret- Osim operatora jednakosti, u MySQL-u postoji i više drugih funkcija za poređenje
hodne godine označavaju se sa "old", dok se svi ostali datumi označavaju kao dve znakovne vrednosti:
"current". • LIKE: Poređenje s džokerskim znacima.
• RLIKE: Poređenje s regularnim izrazima.
Funkcije za rad sa znakovnim vrednostima • STRCMP: Poređenje znakovnih vrednosti, slično funkciji strcmp () u jeziku C.
MySQL-ove funkcije za rad sa znakovnim vrednostima dele se u dve kategorije: funk- • MATCH: Tekstualno pretraživanje.
cije za obradu znakovnih vrednosti i funkcije za poređenje znakovnih vrednosti.
U ovom odeljku objasnićemo funkcije LIKE, RLIKE i STRCMP. Tekstualno pretraži-
Verovatno ćete ustanoviti da su funkcije iz druge grupe korisnije od onih iz prve.
vanje je na raspolaganju samo u My ISAM tabelama. Više informacija o tome naći ćete
u poglavlju 9, "Tipovi tabela u MySQL-u".
Funkcije za obradu znakovnih vrednosti
Tabela 8.3 prikazuje najkorisnije funkcije za obradu znakovnih vrednosti. U doku- Poređenje s džokerskim znacima pomoću funkcije LIKE
mentaciji su opisane i mnoge druge. Pogledajmo primer upotrebe operatora LIKE:
select *
Tabela 8.3 Funkcije za obradu znakovnih vrednosti from department
Funkcija Namena where name like '%research%';
concat(s1, s2, ... ) Spaja znakovne vrednosti sl, s2, .... U ovom primeru ne tražimo nazive jednake reči 'research', već nazive koji bilo
conv(n, izvorna_baza, Pretvara broj n iz baze izvorna_baza u broj baze gde sadrže reč 'research'. Rezultati su sledeći:
nova_baza) nova_ baza. (Možda vas je iznenadilo to što je ova funkcija
navedena među funkcijama za rad sa znakovnim vrednostima,
+---------------+--------------------------+
ali se za notaciju nekih baza koriste slova, kao u heksadecimal-
l departmentiD l name
noj bazi.)
+---------------+----------------- ---------+
128 l Research and Development l
length (s) Vraća ukupan broj znakova sadržanih u s.
+---------------+------ --------------------+
load file Vraća sadržaj datoteke ime_ datoteke kao jedan niz l row in set (0.04 sec)
(ime_ datoteke) znakova.
Funkcija LIKE podržava dva načina poređenja s džokerskim znacima. Znak za pro-
locate (igla,plast_sena, Vraća početnu poziciju niza znakova igla u nizu
cenat (%), upotrebljen kao u navedenom primeru, utvrđuje poklapanje s grupom zna-
pozicija) plast_sena. Traženje počinje od pozicije pozicija.
kova bilo koje dužine (uključujući i nula). To znači da se izraz '%research%' poklapa
lower (s) i upper (s) Pretvara niz znakova s u mala, odnosno velika slova.
sa svakom znakovnom vrednošću koja sadrži reč research. Imajte u vidu da se pri
quote (s) Preslikava niz znakova s u oblik pogodan za smeštanje u bazu
poređenju znakovnih vrednosti obično ne pravi razlika između malih i velikih slova,
podataka. To podrazumeva uokvirivanje znakovnog niza
polunavodnicima i umetanje obrnute kose crte. kao što je objašnjeno u prethodnom delu ovog poglavlja.
replace(izvor, nađi, Vraća niz znakova izvor u kojem je podniz nađi zamenjen Stariji džokerski znak je podvlaka U, kojim se utvrđuje poklapanje s jednim zna-
za mena) nizom zamena na svim mestima gde se pojavljuje. kom. Na primer, '_at' se poklapa sa znakovnim vrednostima •cat •, •mat •, •bat • itd.
soundex(s) Vraća soundex oblik izvornog niza znakova s. Soundex oblik
znakovne vrednosti predstavlja način na koji znakovna Poređenje s regularnim izrazima pomoću funkcije RUKE
vrednost treba da se izgovara na engleskom jeziku . Na primer, Funkcija RL IKE omogućava poređenje znakovnih vrednosti s regularnim izrazima.
ponekad je lakše pronaći ime osobe ako se traži sound ex oblik Regularan izraz je šablon koji opisuje opšti oblik znakovne vrednosti. Uslovi koje
a ne kako je ime napisano . bi trebalo da ispunjavaju znakovni nizovi koje tražimo, opisuju se posebnom notaci-
substring(s, početak, Vraća ukupno znakova iz niza s, počev od početak. jom. Razmotrićemo ukratko tu notaciju.
ukupno) Prvo, svaki literal uvek se poklapa sa istim nizom znakova. To znači da se šablon
trim (s) Uklanja početne i završne beline iz niza znakova s. (Pomoću 'cat' poklapa s rečju 'cat'. Međutim, poklapanje važi i za • catacomb • i • the cat
funkcije l trim () možete ukloniti samo početne beline, a
sat on the mat'. Šablon 'cat' pronalazi niz znakova •cat • na svim mestinu
funkcija rt rim () uklanja završne beline.)
unutar većeg niza znakova.
116 Poglavlje 8 Upotreba MySQL-ovih ugrađenih tunkciJa u komano1 ::,tLtLI
Numeričke funkcije
Ako želite da šablon pronalazi samo reč 'cat', onda ga morate izmeniti u '"'cat$'. . Regularni izrazi mogu biti veoma moćni, ali i veoma složeni. Ako vam treba više
Znak karet ("') znači "fiksni početak niza znakova"; drugim rečima, niz znakova koji pnmera i opširniji opis sintakse, na Webu ćete naći mnogo dobrih tekstova na tu
tražimo mora da počinje rečju 'cat'. Znak za dolar($) znači "fiksni kraj niza zna- temu.
kova"; drugim rečima, niz znakova koji tražimo mora da se završava rečju 'cat'.
Prema tome, šablon '"'cat$' prihvata samo reč 'cat' i ništa drugo. Poređenje nizova znakova pomoću funkcije STRCMP()
U regularnim izrazima podržani su i džokerski znaci, isto kao u funkciji LIKE. ~a .funkciju s:RCMP (). ~ MySQL-u važe iste konvencije kao i u drugim programskim
Međutim, džokerski znak je drugačiji. Postoji samo jedan - tačka (.) - koji određuje JeZlCllUa, kao so su e lh P HP. Prototip funkcije izgleda ovako:
poklapanje s jednim znakom, bilo kojim. Na primer, ' . at' utvrđuje poklapanje s STRCMP(sl, s2)
'cat', 'bat', 'mat' itd. a funkcija vraća sledeće vrednosti:
Dovoljan je samo jedan džokerski znak jer se u traženom nizu znakova može zadati
i ponavljanje znakova (uključujući i džokerske znakove) određen broj puta.
• o ako su nizovi znakova jednaki
Kada iza nekog znaka postavite specijalni znak *, to znači da se prethodni znak • -l ako je sl maqji od s2 - ~· ako po redosledu sortiranja sl dolazi ispred s2
može pojaviti nula ili više puta. Na primer, šablon 'n*' prihvata ' ', 'n', 'nn', 'nnn' • l ako je sl veći od s2 - tj. ako po redosledu sortiranja sl dolazi iza s2
itd. Znaci se mogu grupisati između zagrada, tako da šablon ' (cat)*' prihvata ' ', Rezultati narednih upita izgledaju ovako:
'cat', 'cat cat', 'catcatcat' itd. Moguća je i upoteba džokerskih znakova, pa
mysql> select strcmp ('cat •, •cat •) ;
šablon ' . * ' prihvata neograničen broj znakova, što praktično znači svaki niz znakova. +- ---------------------+
Slično tome, znak plus(+) znači da se znak ili niz znakova ispred njega može poja- l strcmp ('cat', 'cat') 1
viti jedanput ili više puta, a upitnik (?) znači jednom ili nijednom. Možete zadati i +- ---------------------+
opseg vrednosti, tako da šablon ' (cat) (2, 4) ' prihvata 'catcat ', 'catcatcat ' i l o l
+- ---------------------+
'catcatcatcat'.
l row in set (0.42 sec)
Osim pojedinačnih znakova i nizova znakova, možete zadavati i skupove znakova,
koji se pišu između uglastih zagrada. Na primer, šablon ' [a-z] ' prihvata bilo koje mysql> select strcmp('cat', 'dog');
pojedinačno slovo, dok šablon ' [a- z]*' prihvata nizove sastavljene od proizvoljno g · - -------------- -------+
broja znakova. l strcmp( 'cat', 'dog') 1
I najzad, postoji više klasa znakova, koje su zapravo unapred definisani skupovi +- ---------------------+
uslova. Na primer, [ [:al num: JJ prihvata svaki alfanumerički znak.
l -1 l
1- ---------------------+
Ako se bavite programiranjem na jeziku Perl, vredno je napomenuti da MySQL l row in set (0.00 sec)
podržava regularne izraze u formatu POSIX, koji se razlikuje od formata Perlovih
regularnih izraza. mysql> select strcmp('cat', 'ant');
A sada, pogledajmo primer upotrebe šablona s funkcijom RLIKE. Razmotrite sle- · -- --------------------+
l strcmp( 'cat', 'ant') 1
deći upit:
l -- -------------------+
select * from department where name rlike 'an'; l l l
Ovaj upit pronalazi sve redove koji bilo gde u koloni department sadrže niz zna-
l - --------------------+
row in set (0.00 sec)
kova 'an':
+---------------+---------- ----------------+ Imajte u vidu da ~edosled s~rtiranja zavisi od lokalnog skupa znakova koji je akti-
l departmentiD l name van . Ako Je aktivan Jez1k razlicit od engleskog, znakovne vrednosti će biti sortirane
+------------ ---+-------------- ------- -----+ kako biste i očekivali, pod uslovom da ste zadali odgovarajući skup znakova kada ste
42 Finance 11:tprav1h tabelu.
128 l Research and Development l
129 l Human Resources l
+---------------+------- ------- --------- ---+ Numeričke funkcije
3 rows in set (0.00 sec)
l'.1bela .8.4
..
prikazuje
" ,
nekoliko korisnih numeričkih funkciia.
~
U MySQL- OVOJ· d O k ll _
111\'lltnc~p nar1 rete opise mnogih drugih funkcijn iz ll' kategorije.
Funkcije za rad s datumima i vremenima
Poglavlje 8 Upotreba MySQL-ovih ugrađemh tunKCIJa u KomanOI ;:,tLtLI
118
u drugi (na primer, char). password(s) Izračunava šifrovan oblik za lozinku zadatu parametrom s. To nije
Prototipovi ovih funkcija su sledeći: oblik u kojem se interno čuvaju lozinke korisnika MySQL-a, što je
opisano u poglav~ u 11, "Upravljanje pravima korisnika". Upotreba
cast(izraz AS tip) funkcije password () za šifrovanje lozinki koje se čuvaju u bazi
convert(izraz, tip) podataka ne preporučuje se.
Funkcija cast () podržana je u ANSI standardu, a funkcija convert () podržana je
u ODBC standardu.
Parametar tip može imati vrednost BINARY, CHAR, DATE, DATETIME, SIGNED
Fukcije za upotrebu u odredbi GROUP BY
Postoje funkcije posebno namenjene upotrebi u odredbi GROUP BY. One se ponekad
(INTEGER) i UNSIGNED (INTEGER).
Većina konverzija tipova podataka odvija se u MySQL-u automatski kad zatreba; naziVaJU grupne ili agregatne funkcije. Možete ih primeniti i na ceo skup rezultata
na primer, ako funkciji za rad s vrednostima znakovnog tipa prosledite broj, on će upita, pri Čemu se svi redovi obrađuju kao pripadnici jedne grupe. To smo već upo-
trebili u upitima kao što je sledeći:
automatski biti pretvoren u niz znakova.
select count(*)
from employee;
Ovaj upit daje ukupan broj redova u tabeli employee.
122 Poglavlje B Upotreba MySQL-ovih ugrađenih funkcija u komandi SELI::CI
Odgovo1
Ove funkcije se obično primenjuju na grupe podataka , kao u sledećem primeru: 3. Koju biste od sledećih funkcija upotrebili da dobijete ime meseca u datumu?
select job, count(job} a) dayname ()
from employee
b) extract()
group by job;
e) subdate ()
Ovaj upit prebrojava koliko ima zaposlenih na svakom radnom mestu.
d) now()
Tabela 8.7 prikazuje listu najkorisnijih grupnih funkcija .
4. Koju od sledećih funkcija poziva MySQL kada interno šifruje lozinke svojih
Tabela 8.7 Funkcije za rad s grupama podataka korisnika?
Funkcija Namena a) password()
avg (kolona) Vraća prosek vrednosti sadržanih u koloni kolona . b) encrypt ()
count(kolona) Vraća ukupan broj vrednosti u koloni kolona. e) rodS()
min (kolona) Vraća najmanju vrednost u koloni kolona. d) sha()
max (kolona) Vraća n;Uveću vrednost u koloni kolona.
5. Ako u komandi SELECT upotrebite grupnu funkciju a ne zadate odredbu GROUP
std (kolona) Vraća standardni otklon za vrednosti sadržane u koloni kol ona.
a) to je sintaksna greška
sum (kol ona) Vraća zbir vrednosti sadržanih u koloni kolona .
b) cela tabela se obrađuje kao jedna grupa
e) ceo skup rezultata se obrađuje kao jedna grupa
Sažetak d) svaki red se obrađuje kao jedna grupa
• MySQL pruža izbor aritmetičkih i logičkih operatora, kao i operatora za pere-
đenje vrednosti. Pri upotrebi operatora morate naročito obratiti pažnju na
mogućnost pojave vrednosti NULL jer u tom slučaju rezultati neće uvek biti
Vežbe
kakve očekujete. l. Napišite upit koji prikazuje imena zaposlenih i radnih mesta, ali ako je naziv rad
• MySQL pruža bogat izbor funkcija za rad s vrednostima znakovnog i numerič nog mesta 'Programmer', treba da se prikaže 'Analyst 1 Programmer'.
kog tipa, za rad s datumima, za konverziju tipova podataka i druge funkcije . 2. Napišite upit koji u kolonu department dodaje novu službu čiji je naziv Property
• Funkcije za rad s grupama podataka deluju na grupe vrednosti u kolonama Services. Zatim napišite upit koji dodaje novog zaposlenog, čije je ime Fred Smith
tabela. Te grupe se formiraju ako je zadata odredba GROUP BY, ali ako nije, funk- a radno mesto DBA i radi u toj službi. Upotrebite funkciju last_insert_id (} da
cije deluju na sve vrednosti u koloni tabele. biste dobili identifikator nove službe.
3. Napišite upit koji učitava najnoviji posao iz tabele assignment. Savet: upotrebite
grupnu funkciju max () .
Pitanja
l . Koji se od sledećih operatora ne mogu upotrebiti za ispitivanje da li je određena
vrednost jednaka NULL?
Odgovori
a) ISNULL ()
Pitanja
b) <=>
l. d
e) IS NULL
2. b
d) 3. b
2. Rezultat ovog pozivanja funkcije strcmp ( 'fred' , 'Fred') jeste 4. a
a) -1
5. e
b) o
e) 1
d) 2
124 Poglavlje 8 Upotreba MySOL-ovih ugrađen ih funkcija u komane11 ~tLtLI
Vežbe
I~
l.
select name, replace(job, 'Programmer', 'Analyst/Programmer')
from employee;
2.
insert into department values
(NULL, 'Property Services');
zbog nečeg (na primer, prestanka napajanja) prvi upit izvršio do kraja, ali ne i drugi. MyiSAM tabele su uvele sledeća poboljšanja:
U takvim slučajevima bilo bi neuporedivo bolje da se izvrše ili oba upita, ili nijedan, • Prenosivost tabela. Tabele smešten e na disk ili na druge medije mogu se prene ti na
jer baza podataka mora uvek biti u usklađenom stanju. drugi računar na kojem radi MySQL, bez obzira na platformu. To ne važi za
Tabele koje podržavaju transakcije omogućavaju da za date da je određena grupa ISAM tabele.
upita nedeljiva jedinica obrade -transakcija. Trebalo bi da se cela transakcija obavi do • Podrška za veoma velike tabele. Veličina ISAM tabela je ograničena na 4 GB.
kraja, a ako to nije moguće, baza podataka mora da je po11išti (engl. roll back), odnosno MyiSAM omogućava da tabela bude velika onoliko koliko to dozvoljava ope-
da se vrati u stanje u kojem je bila pre početka transakcije. rativni sistem. Budući da će to biti važno samo nekim korisnicima, moraćete
Transakcije i MySQL-ova sintaksa za njihovu upotrebu opisane su u poglavlju 10, pažljivo da odaberete operativni sistem (i sistem za rad s datotekama). Mnogi
"Upotreba transakcija u InnoDB tabelama". sistemi za rad s datotekama ograničavaju veličinu datoteka na najviše 2 GB.
U MySQL-u se mogu koristiti sledeći tipovi tabela: (Imajte u vidu da to ograničenje možete zaobići ako upotrebite MERGE tabele.)
• ISAM • Efikasnije iskorišćenje prostora na disku. Manji su rascepkanost i praznine na disku.
• MyiSAM • Manja ograni{enja klju{eva. ISAM tabele podržavaju najviše 16 ključeva po tabeli,
• InnoDB a podrazumevana maksimalna dužina ključa je 256 bajtova. My ISAM tabele
• BerkeleyDB (BDB) podržavaju 64 ključa po tabeli, a podrazumevana maksimalna dužina ključa je
• MERGE 1024 bajta.
• HEAP 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
Sve navedene tipove tabela objasnićemo pojedinačno, ali najviše prostora posveti-
bi da ozbiljno razmislite o njihovoj konverziji u My ISAM. Napor koji treba uložiti je
ćemo najčešće upotrebljavanim tipovima: My ISAM i InnoDB. InnoDB i BerkeleyDB
veoma mali, a prednosti su značajne.
podržavaju transakcije. Drugi (ISAM, My ISAM, MERGE i HEAP) to ne čine.
U ovom poglavlju objasnićemo i posebne mogućnosti koje pružaju My ISAM tabele,
a to su komprimovane tabele i tekstualno pretraživanje. Celo poglavlje 1O posvećeno je MyiSAM tabele
posebnim mogućnostima mašine za skladištenje InnoDB. Mnogi ljudi godinama koriste MySQL ne znajući da može 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 omogućavaju veoma brz pristup podacima ali ne podržavaju
ISAM tabele transakcije. One obezbeđuju visoke performanse u mnogim situacijama, čak i kada
ISAM tabele su uključene u MySQL samo radi podrške starijim aplikacijama. Budući
projektant napravi određene greške, a u rukanu stručnog administratora mogu da
daje njihova funkcionalnost u potpunosti održana MyiSAM tabelama, nećemo ih
podrže i veoma obimne i/ili veoma opterećene baze podataka.
detaljno razmatrati. Planirano je da budu uklonjene iz buduće verzije MySQL-a 5.0.
Naredni kod formira MyiSAM tabelu:
Naredni kod pravi ISAM tabelu, ukoliko vam je iz nekog razloga potrebna:
create table article (
create table asset
articleiD int not null auto_increment primary key,
title varchar(255},
assetiD int not null,
body text
description varchar(255}
};
type=ISAM;
Nije obavezno, ali na kraj možete dodati sledeći red
ISAM tabele omogućavaju brz pristup podacima ali ne podržavaju transakcije. Veći
deo onoga što ćemo reći o My ISAM tabelama važi i za ISAM tabele, pri čemu za sta- type=MyiSAM;
rije ISAM tabele postoji više ograničenja. i dobićete
isti rezultat.
MyiSAM tabele mogu biti jedne od sledeće tri vrste: dinamičke, statičke ili kompri
movane.Tabela automatski postaje dinamička ili statička u zavisnosti od definicija njenih
kolona. Komprimovane tabele možete praviti samo ručno, pomoću alatke myisampack.
IJU ruyodYIJC ::J IIJJUYI ldUCid U IYIY.>UL-U IVIYI.li'IIVI liiUCIC
Tabele čiji su redovi fiksne dužine automatski se prave kao statičke, dok se tabele s KomprimovanjeMyiSAM tabela
redovima promenljive dužine prave kao dinamičke tabele. Po čemu možemo utvrditi Iako tabele nastaju kao statičke ili dinamičke bez vašeg izričitog zahteva (ali kao rezultat
da li tabela ima redove fiksne ili promenljive veličine? odluka koje ste doneli pri projektovanju), tabele se ne komprimuju automatski. Da biste
Tip podataka char i svi numerički tipovi su fiksne veličinc . Veli č ina kolona tipa komprimovali tabelu, morate upotrebiti alatku myisampack s komandne linije. (Postoji
varchar, text i b lob menja se u zavisnosti od sadržaja. Tabela čije su sve kolone tipa pack_isam, njena verzija isključivo za ISAM tabele, ukoliko ih koristite.)
char ili numeričkog tipa, biće statička, ali tabela koja sadrži barem jednu kolonu tipa Mada se komprimovanje na prvi pogled čini korisno, trebalo bi da ga primenjujetc
varchar, text ili blob biće dinamička. samo za neke aplikacije jer se komprimovane tabele mogu samo čitati. Ako treba da
U odeljku "Tekstualno pretraživanje My ISAM tabela", napravićemo tabel u koju izmenite strukturu komprimovane tabele, ili da ažurirate podatke u njoj, ili da joj
ćemo nazvati article. To će biti dinamička tabela zato što sadrži kolonu tipa varchar dodate nove, morate da dekomprimujete celu tabelu, unesete odgovarajuće izmenc
i kolonu tipa text. Prostor na disku koji će biti potreban za skladištenje svakog reda i zatim ponovo komprimujete tabelu.
tabele zavisiće od tekućih podataka u poljima tabele. Postupak komprimovanja koji obavlja alatka myisampack čini kombinacija pravog
Statička tabela pruža više prednosti. Pretražuje se brže od dinamičke ili komprimo- komprimovanja (Hafinanovim kodom) i više optimizacija čiji je cilj sažimanje kolona,
vane tabele. Baza podataka može veoma lako učitati zapis pronađen na osnovu indeksa na primer, konverzijom postojećih tipova podataka u manje, i konverzijom sadržaja
kada se svaki zapis nalazi na određenom pomaku od početka datoteke. Tabela se veoma kolona u nabrajanja . Budući da se svaki zapis komprimuje zasebno, dekomprimovanje
lako smešta u ostavu (keš). Manja je verovatno ća nepovratnog oštećenja podataka u pojedinačnog zapisa je relativno jednostavno. Na sporijim uređajima za skladišteqje
slučaju ozbiljnog kvara sistema- alatka za popravku tabela obično uspeva da restaurira podataka trajanje operacije dekomprimovanja može čak biti i zanemarljivo u pare-
sve redove osim oštećenog. đenju s trajanjem učitavanja podataka s diska.
Nedostatak statičkih 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 uko- Tekstualno pretraživanje MyiSAM tabela
liko se veličina vaših podataka ne razlikuje previše. Na primer, to važi za imena i pre- Jedna od mogućnosti koju zasad pružaju samo My ISAM tabele jeste tekstualno pretra-
zimena ljudi. Međutim, cena će vam možda biti previsoka ako se podaci veoma živanje i indeksiranje. Standardni indeksi su veoma efikasni kada u tabeli treba pronaći
mnogo razlikuju po veličini. Ako smatrate da će prezimena zaposlenih imati uvek vrednost jednaku traženoj, ali često se traže reči ili nizovi znakova unutar blokova tek-
maqje od 80 znakova, možda nećete želeti da nepotrebno rasipate po 75 znakova svaki sta. U takvim slučajevima tekstualno pretraživanje je korisnije.
put kada se neko preziva Perić ili Jović. Naredna SQL komanda formira MyiSAM tabelu sa indeksom za tekstualno
Za dinamičke tabele potrebno je složenije upravljanje unutar samog MySQL-a. pretraživanje:
Posao keširanja, učitavanja ili popravljaqja zapisa nije tako jednostavan za mašinu za create table article (
skladištenje. Razlog je delimično to što je veličina tabele promenljiva, ali i to što tabela articleiD int not null auto increment primary key,
postaje rascepkana (fragmentirana).Ako je zbog promene sadržaja red postao veći, deo title varchar(255),
podataka će ostati na izvornom mestu, a deo će biti smešten u novi blok unutar dato- body text,
fulltext (title,body)
teke.To znači da se ne može garantovati da segment datoteke koji je operativni sistem ) ;
u čitao u keš sadrži sve delove reda. Osim toga, oštećenje tabele može biti teže popra-
vljivo jer ako se izgube blokovi podataka ili veze između njih, ne može se lako utvrditi Naredni upit učitava sve zapise koji sadrže re č 'merger • :
koji delovi kojim redovima pripadaju. select title
from article
Da biste popravili ili defragmentirali My ISAM tabelu, možete s komandne linije
where match (title,body) against ('merger');
upotrebiti alatku myisamchk ili MySQL-ovu komandu REPAIR TABLE. (To je opšir-
nije objašnjeno u poglavlju 13",Administriranje baze podataka") . Za defragmentiranje Moguća su i složenija pretraživanja. Naredni upit učitava zapise koji sadrže bilo
baze podataka, ali bez popravljanja, možete upotrebiti MySQL-ovu komandu OPTI- koju re č iz skupa 'merge ', 'acquis i tion', 'acquire' ili 'take over'.
MIZE TABLE. (To je opširnije opisano u poglavlju 18",0ptimizovanje baze podataka".) select title from article
where match (title,body) against ('merge acquisition acquire
takeover');
l ..lL 1 u~tdVIJI;;: ~ ,,._,uv1 LdUCid u tvty..JuL.-u
MyiSAM tabele
Iako je razvijen odvojeno od većeg dela MySQL-a, InnoDB se može koristiti pod
Za logičko pretraživanje nije neophodno da postoje indeksi za tekstualno pretraži-
jednakim uslovima dve vrste licence.
vanje. Tako se mogu pretraživati i neindeksirane tabele, ali je postupak veo~a spo~.
Mnoge opsežne i veoma posećene Web lokacije koje koriste MySQL, kao što su
Još jedna mala razlika između tekstualnog pretraživanja i logičkog p~etr_až_lvanJa jeste
Slashdot (www. slashdot. org), Google (www. google. com) i Yahoo! Finance (http: l l
to što se pri logičkom pretraživanju zanemaruju reči koje se često poJaVlJUJU _me~u
finance. yahoo. com), koriste mašinu InnoDB. Naročito je pogodna za obradu velikih
podacima. U tom slučaju ne važi pravilo 50%. Ako pretražujemo tekstove obJaVlJene
količina podataka, velikom brzinom i u okruženju koje podržava transakcije.
u biltenu kompanije Acme PTY Ltd., naredni upit bi verovatno učitao gotovo sve
InnoDB je jedan od najbržih sistema na svetu koji podržava transakcije, ali po cenu
redove, dok bi rezultat upita iza njega bio prazan skup.
izvesnih žrtava. Pri većini upotreba, My ISAM će biti brži, ali razlika najčešće neće biti
select title from article tako značajna.
where match (title,body) against ('Acme' IN BOOLEAN MODE);
InnoDB proizvodi kompanija InnoBase Oy, koja ima vlastitu Web lokaciju. Najno-
select title from article vije informacije o InnoDB-u naći ćete na www. innodb. com.
where match (title,body) against ('Acme');
BerkeleyDB (BDB) tabel e
lnnoDB tabele Druga mogućnost koju imate kada za MySQL birate mašinu za skladištenje koja podr-
Sada ćemo razmotriti InnoDB tabele. InnoDB je mašina za skladištenje koja je brza i žava transakcije jeste BerkeleyDB (obično se skraćuje na BDB). BDB se može nabaviti
podržava transakcije. Njene mogućnosti transakcione obrade su toliko važne da ćemo od kompanije Sleepycat software (www. sleepycat. com) . Ova mašina se koristi za trans-
njihovoj primeni posvetiti celo naredno poglavlje. akcionu obradu u MySQL-u ređe nego InnoDB. Mada je BDB mašina već duže vreme
InnoDB table omogućavaju na tržištu, integracija s MySQL-omje relativno novijeg datuma, a u MySQL-ovoj
• Transakcionu obradu.Videti poglavlje 10. dokumentaciji stoji da je kvalitet usklađenosti s MySQL-om nivoa "gama". To znači da
j e pouzdanost bolja od verzije beta, ali postoje određeni problemi. Ne zaboravite, u
• Zakiju{avanje podataka na nivou reda. To znači da samo red koji se trenutno obra-
MySQL-ovoj kvalifikaciji beta verzije, pouzdanost je bolja nego u verzijama softvera
đuje u nekom upitu nije na raspolaganju drugim korisnicima.Većma drug1h .
mašina za skladištenje (osim BDB-a) primenjuje zaključavanje podataka na mvou koje mnoge druge kompanije kvalifikuju kao "zlatno izdanje".
BDB primenjuje zaključavanje podataka na nivou stranice, usled čega su perfor-
cele tabele, tj. kada jedan proces ažurira jedan red tabele, cela tabela nije dostupna
manse neznatno slabije od InnoDB-a. Postaje spor i kada istovremeno otvorite veći
drugim procesima.
broj tabela.
• Upotrebu spoljnih kiju{eva. Primeri iz prethodnih poglavlja u kojima se koriste
Sve BDB tabele moraju imati primarni ključ (što i nije neki problem, pošto se to
spoljni ključevi neće raditi s tabelama drugog tipa.
ionako preporučt~e) . U stvari, primarni ključ će automatski biti napravljen ako ga
• Dosledno u{itavanje podataka bez zakiju{avanja u komandama SELECT. (Ideja je sami izričito ne zadate.
pozajrnljena iz Oraclea.) BDB tabele se čuvaju u bazi podataka u obliku b-stabala (engl. b-trees) . Uporedite
InnoDB ima vlastite konfiguracione opcije, vlastiti direktorijum i vlastiti način skla- to s drugim tipovima tabela za koje se indeksi čuvaju u obliku b-stabala. Posledica je
dištenja podataka. Dok My ISAM smešta svaku tabelu u zasebnu datoteku, InnoDB sporije sekvencijalno učitavanje redova tabele (što se primenjuje, npr. kada bezuslovno
smešta sve tabele i indekse u tabelarni prostor, što znači da se delovi jedne tabele mogu u čitavate sve redove tabele ili izvršavate upite u kojima su indeksi neupotrebljivi).
nalaziti u više datoteka. Zahvaljujući tome, InnoDB može raditi s veoma obimnim Osim toga, BDB tabele zauzimaju više mesta na disku.
tabelama za čiju veličinu ne važe ograničenja koja nameće operativni sistem. Međutim, Važno ograničenje BDB tabela jeste to da ne možete po meri ti postojeće podatke
imajte u vidu da u poređenju s MyiSAM tabelama,jedna InnoDB tabela zauz1ma na drugo mesto na disku. Razlog je to što se zajedno s podacima tabele skladišti i apso-
znatno više prostora na disku za skladištenje istih zapisa. .. . , . lutna putanja do tih podataka. Kada pravite rezervne kopije BDB tabela, morate oba-
Celo naredno poglavlje, 10, posvećeno je upotrebi ovih speclJalmh mogucnost1 vezno napraviti i rezervnu kopiju datoteka dnevnika jer bez njih nećete moći da
JnnoDB-a. pokrenete bazu podataka.
Podešavanje InnoDB-a zahteva određeni napor. Osnovnu ~onfiguracij~ opisali :~10
u poglavlju 1, "Instaliranje MySQL-a", a konfiguracione opclje razmatracemo opslr-
nijl! u poglavlju 12",Podešavanje MySQL-a" .
IVICn\JC taUt'll"
Poglavlje 9 Tipovi tabela u MySQL-u l '
osobine: ima istu strukturu kao tri tabele koje ćemo grupisati, njen tip je MERGE,
MERGE tabele a sadržaj je unija (UNION) tekućeg sadržaja sve tri tabele. Osim toga, zadali smo last
MERGE tabele predstavljaju vešt način zaobilaženja ograničenja maksimalne veličine (poslednja) kao vrednost opcije INSERT_METHOD. To znači da će nov red koji unesemo
datoteka koja nameće operativni sistem. Pošto se svaka MyiSAM tabela smešta u u ovu MERGE tabel u biti fizički smešten u poslednju tabelu u grupi, u ovom slučaju,
zasebnu datoteku, veličina tabele je ograničena na maksimalnu veličinu datoteke koju log2003Mar. Ostale mogućnosti su FIRST (podaci se umeću u prvu tabelu u grupi) ili
operativni sistem dozvoljava. To se može zaobići pomoću MERGE tabele,j:r one NO (umetanje novog reda nije dozvoljeno u MERGE tabelu).
omogućavaju da se u upitima više My ISAM tabela obrađuju kao Jedna log1cka tabela. Tako smo formirali tabelu s kojom možemo da radimo na uobičajeni način i koja
Pogledajmo primer. Listing 9 .l sadrži kod koji formira MERGE tabel u od tn prividno sadrži sve podatke iz svih tabela u grupi. Ako izvršimo upit
tabele dnevnika promena. select * from logs;
Listing 9.1 A MERGE Table Example dobićemo sledeće rezultate:
(logid int auto_increment primary key, l l 2003-02-01 00:00:00 l first feb entry l
create table logs komande FLUSH možete izvršiti i bilo koju od navedenih komandi, ali mi smo ustanovili
(logid int auto increment primary key, da to nije uvek sasvim tačno. Na primer, u vreme pisanja ove knjige, ako se pomoću
logLs datetime, komande DROP izbriše jedna od tabela u grupi, automatski se briše i sama MERGE
• ntry char(255)) tabela. Ako je potrebno da neku od navedenih komandi izvršite nad jednom od tabela
ype • merge u grupi, najbolje je da prethodno izbrišete MERGE tabel u i da je zatim ponovo napra-
Ullion • (log2003Jan, log2003Feb, log2003Mar)
insert_method = last; vite. Brisanje MERGE tabele ni na koji način ne utiče na njene komponente niti na
podatke u njima.
U ovom listingu napravili smo tri tabele s jednakom strukturom, log2003Jan, Tabele koje čine MERGE tabelu možete komprimovati pomoću alatke myisam-
lo~2003Fcb i log2003Mar. MERGE tabele se često primenjuju za beleženje promena, pack. To je naročito korisno u slučajevima kao što je naš primer u kojem skladištima
k.10 što ćete videti u nastavku teksta. datoteke dnevnika promena -jer se datoteke iz ranijih meseci mogu ko mp rimovati
N nkon umetanja nekih pro bnih podataka u te tri tabele, od njih smo naravi li jednu budući da se novi podaci upisuju samo u poslednju datoteku.
M ERG E tabclu.To smo uradili tako što smo napravili tabelu logs, koj;l 1111.1 ''''lk·ćc
.Jdl.l:ldl\
MyiSAM
HEAP tabele • My ISAM je podrazumevani tip tabele. Veoma je brz, ali ne podržava transakcije.
HEAP tabele su izuzetno brze i cele se čuvaju u memoriji. Brzina se postiže zahvalju- • MyiSAM podržava komprimovanje tabela.
jući upotrebi heširanih indeksa. • ":eličina ~yiSAM tabela je ograničena
na maksimum koji dozvoljava operativni
Nedostatak čuvanja cele tabele u memoriji jeste, naravno, to da u slučaju problema
s1stem, al1 se to ograničenje može zaobići pomoću MERGE tabela.
s napajanjem računara, podaci iz HEAP tabele nestaju zauvek. Međutim, tabele tog
• Datoteke u koje su smeštene My ISAM tabele prenosive su između različitih ope-
tipa su savršene za čuvanje privremenih podataka.
rativnih sistema.
Tabelu tipa HEAP možete napraviti na sledeći način:
• Jedna tabela može imati najviše 64 ključa a svaki može sadržati najviše 1024 bajta.
create table testHeap
(id int not null primary key,
data char(lOO)) lnnoDB
type=heap • InnoDB tabele podržavaju transakcije.
max_rows = 100; • InnoDB podržavaju zaključavanje na nivou redova.
Kao što vidite, tip tabele zadali smo kao HEAP. Osim toga, primenili smo i dobro
• Ne postoji teorijska gornja granica veličine tabele jer jedna tabela može biti
praktično pravilo ograničavanja maksimalnog broja redova u tabeli. Ako vaša HEAP smeštena u više datoteka.
tabela previše naraste, lako se može dogoditi da vam ponestane memorije. Maksimalan
• InnoDB omogućava dosledno učitavanje redova bez zaključavanja u komandama
broj redova u HEAP tabeli može se zadati u konfiguracionoj opciji
SELECT.
max_heap_table_size.
HEAP tabele imaju sledeća ograničenja: • InnoDB tabele su prenosive između različitih operativnih sistema.
• InnoDB tabele zauzimaju više prostora na disku od MyiSAM tabela.
• Nisu podržane kolone tipa AUTO_ INCREMENT.
• InnoDB tabele podržavaju spoljne ključeve .
• Nisu podržani tipovi podataka BLOB i TEXT.
• U HEAP tabelama ne mogu se tražiti redovi na osnovu početnog dela indeksa.
BDB
(Ako ne znate šta tačno ovo znači, više informacija o indeksiranju naći ćete u
• Kao i InnoDB tabele, BDB tabele podržavaju transakcije. BDB tabele ređe se
poglavlju 19.) koriste u MySQL-u od InnoDB tabela .
• Indeksi se mogu koristiti pri pretraživanju redova tabele samo u upitima koji u
• BDB podržava zaključavanje podataka na nivou stranice.
uslovima za pretragu sadrže operatore = ili <=>.
• BDB tabele nisu prenosive.
Sažetak MERGE
• MySQL podržava šest tipova tabela: ISAM, My ISAM, InnoDB, BDB, MERGE • MERGE tabele omogućavaju da se više My ISAM tabela tretira kao jedna
i HEAP. logička tabela, zahvaljujući čemu se zaobilazi problem najveće dozvoljene
• Samo tabele tipa InnoDB i BDB podržavaju transakcije. veličine MyiSAM tabela .
Pitanja Vežbe
1. Potrebne su nam transakcije i tabele koje se lako mogu preneti na drugi opera- Za ovo poglavlje nema formalnih vežbi, ali bi bilo korisno da vežbate pravljer~je
tivni sistem. Za tu namenu pogodne su tabele tipa 1upotrebu tabela pojedinih tipova.
a) ISAM
b) MyiSAM
e) InnoDB Odgovori
d) BDB
2. Potrebna nam je privremena tabela za brzo pretraživanje. Trebalo bi da upotre-
Pitanja
bimo tabelu tipa 1. e
a) ISAM 2. d
3. a
b) MyiSAM
e) MERGE 4. a
d) HEAP 5. b
3. Potrebne su nam izuzetno velike tabele. Za tu namenu nisu pogodne tabele tipa
a) ISAM U sledećem poglavlju
b) MERGE U sled ećem poglavlju, "Upotreba transakcija u Inn oD B tabelama", razmatraćemo šta
e) InnoDB ta čno znači pojam transakcija, zbog čega su transakcije tako važne i kako se one pri-
menJUJU u InnoDB tabelama.
d) nijedan od prethodnih
4. Potrebno nam je tekstualno pretraživanje. Za tu namenu pogodne su tabele tipa
a) MyiSAM
b) InnoDB
e) BDB
d) HEAP
S. Pogledajte sledeći upit za tekstualno pretraživa~e:
select title
from article
where match (title,body)
against ('+php +pdf pdflib >tutorial -reference'
IN BOOLEAN MODE);
Koja od sledećih tvrdnji o ovom upitu nije tačna?
• Šta je transakcija
• Upotreba transakcija u MySQL-u
• InnoDB-ov model transakcije i usklađenost 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
obrađivati kao nedeljiva celina. Drugim rečima, sve što treba da bude urađeno u trans-
akciji mora se uraditi u celini, ili ne sme ništa uraditi. Ovaj koncept je poznat kao
nedeljivost (engl. atomicity). Kaže se da je transakcija atom obrade jer se ne može razbiti
na manje delove - obrađuje se u celini ili se uopšte ne obrađuje.
Ovaj koncept ima važne posledice kada se razmatra pristup podacima u okruženju s
više korisnika, procesa i niti izvršavanja (engl. threads) istovremeno, a važan je i za obna-
vljanje podataka nakon kvara. Savremenim računarima često pristupa više korisnika
istovremeno. Na njihovim računarima obično je aktivno više programa u isto vreme,
a često koriste i programe kao što je softver za Web server koji formiraju više istovreme-
nih procesa ili niti izvršavanja. Svakom od tih korisnika, programa, procesa ili niti
izvršavanja može biti neophodan pristup serveru baze podataka.
Više niti izvršavanja ne smeju uticati jedna na drugu kada rade istovremeno. Ako
dođe do greške, pri obnavljanju podataka baza podataka mora završiti otvorene trans-
akcije. To znači da se baza podataka mora vratiti u stanje u kojem je bila pre početka
..JI.d j\. ll dllltU\l.ljtll
Poglavlje 10 Upotreba transakcija u lnnoDB tabelama
transakcije, ili mora da izvrši celu transakciju do kraja. Uglavnom je bolje izgubiti celu Ukoliko dva klijentska programa izvršavaju parove ovakvih upita istovremeno,
transakciju koja se sastoji od međusobno povezanih izmena nego doći u stanje deli- rezultati će zavisiti od toga koji se u kom trenutku izvršio. Ako smo pomoću ovih
mično unetih izmena čiji rezultat može biti neusklađenost sadržaja baze podataka.
upita pokušali da upišemo uplatu od 500 dolara, a drugi klijentski program je pomoću
Ovaj koncept se može izraziti formalno, ali je verovatno najbolje da na primeru naredna dva upita pokušao da uplati 1 OO dolara, konačno stanje računa može biti 11 OO
shvatite o čemu se tačno radi. Recimo da imate vrlo jednostavnu (ali potencijalno dolara ili 1500 -a nijedno od toga neće biti tačan rezultat.
veoma važnu) bazu podataka u kojoj se čuvaju podaci o prometu na bankovnim raču # najpre učitavamo tekuće stanje na računu
nima. Za svaki račun postoje barem podaci o identifikatoru računa i tekućem stanju. select balance from account where number = 2;
# upit daje rezultat od 1000 dolara
Tabelu bankovnih računa, accounts, možemo napraviti sa sledećom strukturom:
# sada upisujemo novo stanje
crea te table account update account set balance = 1100 where number = 2;
Jasno je da bi to bilo neprihvatljivo, ali se u ovom sučaju problem može lako rešiti.
number int not null auto increment primary key,
balance float Ako izmene zadamo kao relativne a ne kao apsolutne, postaće nedeljive jedinice i rešili
type = InnoDB; smo problem. Naredni upit će davati ispravne rezultate, bez obzira na to da li se u isto
Verovatno vas neće iznenaditi način na koji ćemo otvoriti tri nova računa pomoću vreme izvršavaju i drugi upiti:
s l edeći h upita: update account set balance = balance + SOO where number = 2;
insert into account (balance) values (O. O); U MySQL-u je jedna komanda update uvek nedeljiva. Ne može je prekinuti
insert into account (balance) values (1000.0); druga komanda, niti se može izvršiti samo delimično. Izvršiće se cela, ili će u slučaju
insert into account (balance) values (2000.0); greške cela biti poništena.
Pošto dosad ništa nije moglo da krene baš naopako, trebalo bi da rezultati budu sle- Složeniji slučajevi su malo teže shvatljivi. Pogledajte naredni par upita čija je svrha
deći podaci: prenošenje iznosa od 1000 dolara sa računa 2 na račun l:
+--------+---------+ update account set balance = balance - 1000 where number = 2;
l number l balance l update account set balance = balance + 1000 where number = l;
+ ------- +---------+ Oba upita unose izmenu u relativnom obliku, ali je važno da se oba upita izvrše da
l l l o l
1000 l
bismo dobili smislene rezultate. Trebalo bi da nakon izvršavanja upita iznos novca u
l 2 l
3 l 2000 l sistemu bude isti kao pre izvršavanja upita. Novac treba da bude prebačen s jednog
l
+--------+---------+ računa na drugi, a ne da se samo pojavi na jednom ili nestane s drugog. Ako dođe
Ako ništa unapred ne određujemo u vezi s brojevima računa koji se generišu u do prekida napajanja između izvršavanja prvog i drugog upita, podaci više neće biti
koloni tipa auto-increment, nevažan je redosled kojim ćete izvršiti ove upite. Sasvim je usklađeni.
nebitno da li ćete ih izvršiti istovremeno s tri interaktivna klijentska računara i ne U jednostavnim slučajevima, problem se može zaobići tako što se oba upita združe
možete znati koji će upit biti izvršen prvi. u jednu SQL komandu. U ovom primeru možemo napisati sledeći upit:
To često nije tačno kada se izvršavaju složeniji upiti ili grupe upita . Pogledajte update account as source, account as dest
naredne dve komande koje uplaćuju SOO dolara na račun broj 2: set source.balance = source.balance - 1000,
dest.balance = dest.balance + 1000
# najpre učitavamo tekuće stanje na računu where source.number = 2 and dest.number = l;
select balance from account where number = 2;
ll upit daje rezultat od 1000 dolara Pošto smo upotrebili dva alijasa (source i dest) za istu tabelu, account, obezbedili
ll sada upisujemo novo stanje smo da izmena postane nedeljiva i da se u potpunosti izvrši ili da se uopšte ne izvrši.
\lpdate account set balance = 1500 where number= 2; Ne moramo da brinemo da li će server prestati da radi tokom izvršavanja nekog dela
Ova dva upita su međusobno povezana i moraju se izvršiti zajedno. Ako klijentski operacije koju smo zahtevali.
programi s drugih računara mogu da izmene stanje na ovom računu između naše pro- U ovom slučaju "stradala" je jedino razumljivost upita. Ovako kombinovan upit je
vere stanja i našeg ažurira~a stanja, može se dogoditi da ne dobijemo rezultate koje slabije razumljiv i teže se otkrivaju greške nego u prvoj verziji koju smo naveli.
SiliO očekivali.
ruyldVIjt: lU UJJUllt:Ud lldll~dr\\:ljd U IIIIIUUD l.dU'Cidllld UjJUllt:Ui:l lli:lll~i:ll\\:ljCI u IVIY;)UL- U l
U mnogim slučajevima neće biti moguće združivanje svih povezanih upita u jedan Podešavanje automatskog potvrđivanja transakcije
kao u navedenom primeru.Jedino rešenje u takvim slučajevima, ukoliko želite razu- U MySQL-uje standardno uključeno automatsko potvrđivanje transakcija (režim rada
mljiv kod, jeste da koristite MySQL-ovu sintaksu za transakcije. Ako grupu komandi autocommit). Svaki upit koji pokrenete, automatski se izvršava u okviru vlastite
označite kao transakciju, time obaveštava te bazu podataka da je to povezan i nedeljiv transakcije. Možete zamisliti da se sve odvija kao da ste izričito zadali komande START
skup, koji se mora obraditi kao nedeljiva jedinica; moraju se izvršiti ili sve komande u TRANSACTION i COMMIT ispred i iza svakog upita koji pokrenete. Par jednostavnih upita
skupu ili nijedna od njih. Pomenuta dva upita možete izvršiti kao jednu transakciju kao što su sledeći
pomoću sledećih SQL komandi: update account set balance = balance - 1000 where number 2·
'
s tart transaction; update account set balance = balance + 1000 where number l·
'
update account set balance balance 1000 where number 2
'
o
U tabelama koje podržavaju transakcije, postoje akcije (osim izričitog izdavanja Blokada niskog prioriteta biće odobrena samo ako nema nijedne druge niti koja je
komande COMMIT) koje će automatski pokrenuti komandu COMMIT. Ako zahtevate zahtevala blokadu za čitanje ili pisanje u toj tabeli. Međutim, ako je server veoma opte-
zaključavanje podataka, time ćete implicitno potvrditi sve započete upite. rećen, takva situacija se možda nikad neće dogoditi.
Verovatno nećete često ručno upravljati blokadama na ovakav način, ali postoje
Zaključavanje podataka izvesni razlozi zbog kojih biste to ipak učinili. Ako imate aplikaciju koja treba da obez-
Druga mogućnost da iskoristite deo prednosti transakcija jeste da ručno zaključavate bedi veoma visoke performanse a transakciona obrada joj je potrebna samo u redim slu-
i otključavate tabele. čajevima, može biti isplativije da koristite brze tabele koje ne podržavaju transakcije i da
Ako zaista želimo da primer koda za deponovanje novca na bankovni račun napi- ručno postavljate blokade da biste rešili problem nemogućnosti transakcione obrade.
šeme s dva odvojena upita, to bi izgledalo ovako: Još jedan čest slučaj u kojem ćete izdavati komande LOCK TABLES jeste kada
lock tables account write; direktno manipulišete MySQL-ovim datotekama s podacima. Na primer, ako želite da
select balance from account where number = 2; obezbedite da sadržaj datoteka na disku ostane usklađen i nepromenjen dok pravite
update account set balance = 1500 where number = 2; njihove rezervne kopije, morate zaključati te datoteke.
unlock tables; Najvažnije što treba da zapamtite u vezi sa zaključavanjem podataka jeste da morate
Komanda LOCK TABLES pokušava da zaključa sve tabele koje navedete da bi tekuća što pre ukinuti sve blokade koje ste postavili inače će drugi sistemi i korisnici morati
nit izvršenja mogla da radi s njima bez ometanja. Komanda UNLOCK TABLES oslobađa sve da vas čekaju. Imajte u vidu da neki poslovi za čije obavljanje ćete postavljati blokade,
blokade koje je tekuća nit postavila. Postupak deblokade tabela vrlo je jednostavan. kao što su indeksiranje ili izrada rezervne kopije velike datoteke, mogu potrajati pri-
Ukoliko ste zaključali tabel u, imajte u vidu da je morate što pre osloboditi da biste što lično dugo.
manje ometali druge niti. Zaključavanje tabela je složenije pitanje.
Sve tabele koje vam trebaju morate zaključati istom komandom. U prethodnom
prim eru zahteva se zaključavanje samo jedne tabele, ali ako nameravate da pristupate
Transakcioni model lnnoDB
grupi tabela istovremeno, ili čak različitim alijasima iste tabele, morate ih sve navesti u Svi transakcioni sistemi za upravljanje bazama podataka nastoje da postignu manje-više
istoj komandi, na primer: iste ciljeve ali uz primenu različitih pristupa problemu. Da bi izolovao transakcije
jedne od drugih, InnoDB primenjuje zaključavanje podataka na nivou reda tabele. To
lock tables account write, account as a read, othertable low_priority
znači da se različite transakcije mogu odvijati nad sadržajem iste tabele u isto vreme,
write;
pod uslovom da samo čitaju tabelu ili da ne menjaju iste redove kada upisuju podatke.
Pošto komanda LOCK TABLES oslobađa sve blokade koje ste pre nje postavili, ako Nepotvrđene izmene sprečavaju da druge niti pristupaju samo redovima na koje
pokušate da grupišete blokade koje su vam potrebne za više komandi, sve prethodne deluje tekuća transakcija, ali ne i celoj tabeli. Zahvaljujući toj osobini, InnoDB obezbe-
blokade biće ukinute a blokada će važiti samo za poslednju komandu u grupi. đuje visoke performanse uz prednosti koje biste očekivali od jednog savremenog
Postoje dve vrste blokada: za čitanje i za pisanje. Ako vam je potreban pristup tabeli sistema za upravljanje bazama podataka.Jedna od tih prednosti jeste usklađenost s gru-
radi upisivanja podataka i ne možete dozvoliti da druge niti pristupaju tabeli u isto pom pravila ACID.
vreme kad i vi, blokada za pisanje će sprečiti da bilo koja druga nit čita tabelu ili piše
u nju dok vi ne oslobodite tabelu. Ukoliko nameravate samo da čitate tabelu, nema Usklađenost sa ACID pravilima
nik:lkvc štete ako dozvolite da i druge niti čitaju tabelu u isto vreme. Blokada za čitanje Važan pojam iz terminologije baza podataka koji još nismo definisali jeste ACID. To je
sprcbva druge niti da pišu u tabel u samo dok je vaša nit blokira. akronim od engleskih reči Atomicity, Consistency, Isolation i Durability (nedeljivost,
nlokada za pisanje može se zadati sa opcijom low_priority (nizak prioritet). U sva- usklađenost, izolovanost i trajnost). Mnogima smeta činjenica da pri korišćenju
kon! sistemu koji omogućava blokiranje tabela, uključujući i MySQL, neophodna su MyiSAM tabela",MySQL pada na ACID ispitu". Kada se koriste InnoDB tabele,
pr.1v1Ll koja određuju ko će u slučaju sukobljenih zahteva moći prvi da postavi blokadu. MySQL je usklađen sa ACID pravilima.
MySQL obično daje veći prioritet zahtevima za blokade radi pisanja da bi omogućio da Atomicity (nedeljivost) znači da je svaka transakcija nedeljiva celina. U bazu poda-
mncnc uskladištenih podataka budu obavljene što pre. Ako vam takvo ponašanje ne taka moraju se uneti sve izmene koje transakcija zahteva, ili nijedna od njih. U slučaju
odgov:mt, možete zahtevati blokadu za pisanje niskog prioriteta kao što smo uradili spoljne greške, jasno je da bi bilo savršeno kada bi postupak obnavljanja baze podataka
"·' tabel u othertable u prethodnom primeru. Međutim, postoji začkoljica. Kad god bio u stanju da dovrši sve transakcije koje su bile započete u trenutku greške; među
:t.illtcvatc blokadu tabele, može se dogoditi da morate sačekati da ona bude odobrena. tim, prihvatljivo je i da te transakcije budu poništene.
l ransakciOni model lnnoDB
Poglavlje 10 Upotreba transakcija u lnnoDB tabelama
Izolovanost transakcija bila Izolovana od drugih. Osim zaključavanja redova na koje se transakcija odnosi,
InnoDB tabele mogu da se rade s četiri nivoa izolovanosti transakcija. Redosledom od ,tlgoritam blokiranja sledećeg ključa blokira i razmake između redova koje nađe u
najjačeg ka najslabijem, to su sledeći: tndeksu. Pošto se problem fantomskih podataka rešava na taj način, nivo izolovanosti
wrializ able moraćete da koristite samo u malom broju sistema .
• Serializable (transakcije se serijalizuju)
_Kada na serveru podesite nivo izolovanosti read committed, transakcije zapravo više
• Repeatable read (podaci su ponovljivi pri svakom čitanju)
nece b1t1 ~asv1m 1z~~ovane. Ako izvršite neki upit, a zatim ga kasnije u transakciji pono-
• Read committed (dozvoljava se čitanje podataka iz potvrđenih transakcija) VIte, dob1cete razhc1te rezultate ukoliko je druga transakcija u međuvremenu izmenila
• Read uncommitted (dozvoljava se čitanje podataka iz nepotvrđenih transakcija) podatke i prenela izmene u bazu. Ako vam baš to odgovara, komanda je sledeća
Kao i u mnogim drugim slučajevima, morate napraviti kompromis između robu- Hl'L transaction isolation level read committed;
snesti i performansi.
2 Poglavlje 1O Upotreba transakCIJa u lnnouts taoe1ama
Pri korišćenju najnižeg nivoa izolovanosti, read uncommitted,javljaju se dva pitanja- 2. Nedeljivost transakcije znači sledeće:
da li su transakcije izolovane i usklađene, pa prema tome, ne krše ACID pravila, i da li
a) izvršavaju se sve operacije koje transakcija zahteva ili se nijedna ne izvršava
se uopšte može pričati o transakcijama. U ovom režimu rada, transakcije mogu da
b) operacije prebacuju bazu podataka iz jednog usklađenog stanja u drugo
čitaju izmene koje su druge transakcije načinile a da te izmene još nisu potvrđene
(prenete u bazu podataka). To se zove čitanje prljavih podataka (engl. dirty reads) i može e) transakcije ne utiču jedna na drugu
sc prihvatiti samo u zaista posebnim okolnostima, npr. kada znate da će sve aktivne niti d) izmene koje su načinile potvrđene transakcije treba da ostanu trajne
samo čitati ili samo upisivati podatke, ali ne i jedno i drugo. Da biste podesili nivo read 3. Izolovanost transakcije znači sledeće:
uncommitted, upotrebite sledeću komandu: a) se izvršavaju sve operacije koje transakcija zahteva ili se nijedna ne izvršava
set transaction isolation level read uncommitted; b) operacije prebacuju bazu podataka iz jednog usklađenog stanja u drugo
Tabela 10.1 prikazuje osobine svakog nivoa izolovanosti. e) transakcije ne utiču jedna na drugu
d) izmene koje su načinile potvrđene transakcije treba da ostanu trajne
Tabela 10.1 Osobine nivoa izolovanosti transakcija
4. Trajnost transakcije znači sledeće:
Prljavi podaci Neponovljivi podaci Fantomski podaci
a) izvršavaju se sve operacije koje transakcija zahteva ili se nijedna ne izvršava
Read Uncommitted Mogući Mogući Mogući
b) operacije prebacuju bazu podataka iz jednog usklađenog stanja u drugo
Read Committed Nisu mogući Mogući Mogući
e) transakcije ne utiču jedna na drugu
Repeatable Read Nisu mogući Nisu mogući Mogući (ali malo
verovatni) d) izmene koje su načinile potvrđene transakcije treba da ostanu trajne
Serializable Nisu mogući Nsu mogući Nisu mogući 5. U režimu ponovljivog čitanja može se dogoditi da
a) učitate prljave podatke
Sažetak b) učitate neponovljive podatke
e) učitate fantomske podatke
• Transakcija je grupa SQL upita koja se obrađuje kao nedeljiva celina. Izvršava se
u potpunosti ili se poništava u potpunosti. d) nijedno od prethodnog
• Standardna SQL-ova sintaksa za definisa~e transakcije izgleda ovako
start transaction;
# do work
Vežbe
commit; Dokumentacija za MySQL/InnoDB sadrži mnogo saveta za poboljšanje performansi
sistema kada se koriste InnoDB tabele. Primenite što veći broj na svoj sistem.
ali postoji i više drugih ekvivalentnih načina da se postigne isti rezultat.
Možete početi od ovog mesta:
• ACID je akronim za Atornicity, Consistency, Isolation i Durability (nedeljivost,
www.innodb.com/ibman.html#InnoDBTuning
usklađenost, izolovanost i trajnost). Trebalo bi da zapamtite šta ove reči znače
inače drugi zaluđenici za računare neće hteti da razgovaraju s vama. Na serveru koji nije previše važan za poslovanje firme, srušite MySQL dok ste
• Redosledom od najjačeg ka najslabijem, nivoi izolovanosti transakcija su sledeći: usred neke transakcije. Nije neophodno da gurnete kućište čvrstih diskova s velike
serializable, repeatable read, read committed i read uncommitted. Podrazumevani nivo u visine, niti da iščupate kabi za napajanje iz utičnice. Dovoljno je da prekinete rad
Inn o DB tabelama je repeatable read. MySQL-ovog procesa. Pregledajte sadržaj dnevnika izmena i posmatrajte šta se događa
kada ponovo pokrenete server.
Pitanja
l. Ako je režim autocommit isključen, transakcija će biti potvrđena
a) kada se izda komanda COMMIT
b) kada se zahteva blokada tabele
e) i a) i b)
d) ni u jednom od navedenih slučajeva
154 Poglavlje 10 Upotreba transakcija u lnnoDB tabelama
Odgovori
Pitanja
l. e
2. a
v
3. e
4. d
Administriranje MySQL-a
5. e
U sledećem poglavlju
U poglavlju ll razmotrićemo MySQL-ov složen sistem upravljanja pravima korisnika . 11 Upravljanje pravima korisnika
Na raspolaganju je bogat izbor mogućnosti za moć koju ćete dati korisnicima baze
podataka. U tom poglavlju savladaćete postojeće opcije i načine na koje se njima 12 Podešavanje MySQL-a
upravlja. 13 Administriranje baze podataka
14 Izrada rezervnih kopija i obnavljanje podataka
15 Zaštita MySQL servera
16 Replikovanje baze podataka
11
Upravljanje pravima korisnika
Dodeljivanje prava
Najpre ćemo razmotriti komandu GRANT, koja omogućava da pravite nove korisničke
naloge i da dodeljujete korisnicima prava za pristup bazama podataka, tabelama i funk-
cija mn. Pogledajte sledeći primer:
gran l liU (e
158 Poglavlje 11 Up ravlj anje pravima korisn ika Nivoi prava
Ova komanda fomura nalog za korisnika čije je ime l uke kada on pokuša da se pri- Korisnikovu lozinku možete izmeniti ako izdate komandu, na primer,
javi na MySQL server s računara localhost. Tom nalogu dodeljuje lozinku (reč set password for fred®localhost = password('novalozinka');
lozinka, koju je vrlo teško pogoditi - razume se, vi ćete zadati nešto bolje!). Reč
Da biste to uradili, morate imati pristup bazi podataka mysql.
usage opisuje pravo koje dodeljujemo korisniku luke. Pravo usage znači da korisnik
Odredba WITH GRANT OPTION je specijalno pravo koje korisniku omogućava da
može samo da se prijavi na server i ništa više. U odredbi ON zadajemo objekte na koje
svoja prava dodeljuje drugim korisnicima. Ako ustanovite da ne možete da dodeljujete
se odnose prava koja dodeljujemo korisniku. Budući da korisniku dodeljujemo samo
prava drugim korisnicima, razlog je to što vam nedostaje ovo pravo. Osim toga, dru-
pravo da se prijavi na server, ta odredba je u ovom slučaju izlišna.
gom korisniku ne možete dodeliti pravo koje sami nemate.
Opšti oblik komande GRANT je, kako stoji u MySQL-ovoj dokumentaciji, sledeći:
Odredbu WITH možete upotrebiti i da biste po satu ograničiti broj izvršenih upita,
GRANT vrsta_prava [(lista_kolona)] [, vrsta_prava [(lista_kolona)] unetih izmena, ili uspostavljenih veza s bazom podataka. Podrazumevana vrednost tih
... ]
parametara je nula, što znači da nema ograničenja.
ON {ime_tabele l * l *.* l ime_baze.*}
TO ime_korisnika [IDENTIFIED BY [PASSWORD] 'lozinka'] Odredba REQUIRE omogućava da zahtevate da se korisnik prijavljtije isključivo
[, ime_korisnika [IDENTIFIED BY 'lozinka'] . .. ] putem zaštićene veze . Da biste mogli daje koristite, moraćete da podesite MySQL na
[REQUIRE odgovarajući način. To ćemo podrobnije razmotriti u poglavlju 15, "Zaštita MySQL
NONE l servera " .
[{SSLI X509}]
[CIPHER način_šifrovanja [AND]]
[ISSUER davalac_sertifikata [AND]] Nivoi prava
[SUBJECT subjekt]]
[WITH [GRANT OPTION l MAX_QUERIES_PER_HOUR # l Prava koja možete dodeliti pomoću komande GRANT dele se u dve osnovne kategorije:
MAX_UPDATES_PER_HOUR # l prava za obične korisnike i prava za adnunistratore.
MAX CONNECTIONS_PER_HOUR #]]
U odredbi GRANT treba da navedete prava koja dodeljujete. Koja sve prava postoje, Prava za ob i čne korisn ike
saznaćete u narednom odeljku . Neka prava su globalna (odnosno, važe za sve baze Prava za obične korisnike pobrojana su u tabeli 11.1.
podataka na serveru), dok druga važe samo za određene objekte (baze podataka, tabele
Ta be la 11 .1 Prava za obične korisnike
ili pojedine kolone tabela).
Pravo Zn ačenje
U odredbi ON treba da navedete objekte na koje se odnose prava koja dodeljujete.
To može biti ime tabele ili ime baze podataka, ili ime baze podataka sa svim njenim CREATE Korisniku je dozvoljeno pravljenje tabela.
tabelama (oblik ime_baze. *). Umesto imena objekta, možete zadati i *. *, što ozna- CREATE TEMPORARY TABLES Korisniku je dozvoljeno prav ljene privremenih tabela.
Čava sve baze podataka i sve tabele u njima. Ako zadate samo *, prava koja dodeljujete DELETE Korisniku je dozvoljeno da briše redove iz tabela.
važe samo za tekuću otvorenu bazu podataka. Ako nije otvorena nijedna baza poda- EXECUTE Korisniku je dozvoljeno da izvršava procedure.
taka, prava se dodeljuju kao da ste zadali *. * u odredbi ON. INDEX Korisniku je dozvoljeno da pravi indekse.
U odredbi TO treba da navedete korisnika kome dodeljujete prava. Ako taj korisnik INSERT Korisniku je dozvoljeno da umeće nove redove u table.
već ima nalog, dodaju mu se nova prava. Ukoliko nalog ne postoji, MySQL će ga LOCK TABLES Korisniku je dozvoljeno da zaključava tabele.
napraviti. U ovoj odredbi možete zadati više od jednog korisnika te imena računara s SELECT Korisniku je dozvoljeno da učitava redove.
kojih se mogu prijavljivati, na primer, fred®localhost. Ako imate teškoća pri prija- SHOW DATABASES Korisniku je dozvoljeno da izdaje komandu SHOW DATABA-
vUivanju kao korisnik za kojeg je upravo napravljen nalog, u komandi GRANT navedite SES da bi dobio listu baza podataka koje postoje na serveru.
i ime računara s kojeg se prijavljujete. Ime MySQL-ovog korisničkog naloga ne mora UPDATE Korisniku je dozvoljeno da ažurira podatke.
biti jednako imenu pod kojim se korisnik prijavljuje u operativni sistem. Ime kori- USAGE Korisniku je dozvoljeno da se prijavi na server, ali osim toga,
snika može sadržati najviše 16 znakova. ne može da radi ništa drugo.
Odredbom IDENTIFIED BY zadaje se lozinka novog korisnika, ili dodeljuje nova
lozinka postojećem korisniku. Prava za administratore
Korisnici mogu da menjaju svoje lozinke pomoću komande: U tabeli 11.2 prikazana su prava koja bi trebalo da se dodeljuju samo administratorim3 .
seL password = password('novalozinka'); Neka među njima možete dodeliti i određenim korisnicima, ako procenite da bi to bilo
ispravno, ali nijedno od tih prava ne treba da se podrazumeva za obične korisnike.
.............. ,., ......
Poglavlje 11 Upravljanje pravima korisnika
• Pravo pristupa određenoj tabeli. Dodeljuje se tako što se navede ime te tabele
Tabela 11.2 Prava za administratore u komandi GRANT:
Pravo Značenje grant select on department to fred;
ALL Korisnik ima sva prava osim WITH GRANT OPTION. • Prava pristupa određenoj koloni. Dodeljuje se tako što se zada ime kolone
ALTER Korisniku je dozvoljeno da menja strukture tabela. Ovo pravo u odredbi GRANT komande GRANT. Na primer:
možete dodeliti korisnicima koji imaju dovoljno stručnog znanja, ali grant select (employeeiD) on employee to fred;
budite oprezni pri tome jer se može (zlo)upotrebiti i za promenu
sadržaja tabela prava. Kada utvrđuje da li korisnik ima pravo da izvrši određeni posao, MySQL kombi-
DROP Korisniku je dozvoljeno da briše tabele. Ovo pravo možete dodeliti nuje pomoću operatora OR korisnikova globalna prava, prava koja ima za bazu poda-
korisnicima u koje imate dovoljno poverenja. taka, prava koja ima za tabelu i prava koja ima za kolonu .
FILE Korisniku je dozvoljeno da podacima iz jedne datoteke dopunjuje ili
menja sadržaj druge datoteke. Ovo pravo takođe možete dodeliti
korisnicima u koje imate dovoljno poverenja. Pazite se korisnika Upotreba komande REVOKE
koji pokušavaju da proslede podatke u datoteku koju slobodno Komanda REVOKE suprotna je komandi GRANT i služi za ukidanje prava koja korisnik
izaberu, kao što je /etc/passwd ili slična datoteka! ima. Na primer:
PROCES S Korisniku je dozvoljeno da prikaže listu svih procesa- tj. da vidi sve revoke all on employee.* from fred;
tekuće procese koje MySQL izvršava.
RE LOAD Korisniku je dozvoljeno da izdaje komandu FLUSH. Ova komanda Opšti oblik komande revoke izgleda ovako:
ima više namena. U nastavku ovog poglavlja razmotrićemo REVOKE vrsta_prava [ (lista_kolona) l [, vrsta_prava [ (lista_kolona) l
komandu FLUSH PRIVILEGES, a komandom FLUSH bavićemo se ... l
detaljnije u poglavlju 13. ON {irne_tabele l * l *·* l ime_baze.*}
REPLICATION CLIENT Korisniku je dozvoljeno da ispituje gde se nalaze glavni i zavisni FROM ime korisnika [, ime_korisnika ... l
serven. Kao što vidite, odredbe su u suštini iste kao u komandi GRANT i omogućavaju uki-
REPLICATION SLAVE Specijalno pravo namenjena specijalnom korisniku replikovanja na danje odgovarajućih prava.
zavisnom serveru.Više informacija o tome naći ćete u poglavlju 16.
SHUTDOWN Korisniku je dozvoljeno da izdaje komandu mysqladmin
shutdown.Više informacija o tome naći ćete u poglavlju 13. Tabele prava
SUPER Korisniku je dozvoljeno da se prijavljuje na server čak i kada je s Podaci koje menjate pomoću komandi GRANT i REVOKE čuvaju se u bazi podataka koja
MySQL-om uspostavljen maksimalni dozvoljeni broj istovremenih se zove mysql. Umesto pomoću komandi GRANT i REVOKE, tabele u toj bazi podataka
veza i može da izvršava komande CHANGE MASTER, KILL (thread) ,
možete me~ati i direktno, ukoliko tačno znate šta treba da uradite. Osim toga,
mysqladmin debug,PURGE MASTER LOGSiSET GLOBAL.
podatke iz tih tabela možete i da učitavate da biste lakše rešili probleme u vezi s pra-
WI TH GRANT OPTION Korisniku je dozvoljeno da drugima dodeljuje svako pravo koje sam
vima ukoliko se pojave.
1ma.
Ako sadržaj tih tabela menjate direktno, morate izdati komandu
Postoji još jedno pravo koje se zove REFERENCES. Rezervisano je za buduću upo- flush privileges;
trebu i mada ga možete dodeljivati, zasad nema nikakvog efekta. da bi izmene počele da važe.
U bazi podataka mysql nalazi se šest tabela:
Utvrđivanje ukupnih prava • user • tables_priv
Pomoću komande GRANT možete dodeliti prava na četiri nivoa: • db • columns_priv
• Globalna prava koja važe za sve baze podataka na serveru. Zadaju se pomoću • host • func
niza znakova*.* u komandi GRANT. Na primer:
Prvih pet tabela koristi se za čuvanje podataka u vezi s pravima korisnika. (U tabeli
grant all on*.* to fred; func skladište se podaci koji se tiču funkcija koje korisnici pišu, ali to je tema koja
• Prava koja važe samo za određenu bazu podataka. Zadaju se izrazom izlazi izvan okvira ove knjige.)
irne_ba z e . * u komandi GRANT:
q n mL a ll on e mpl oy ee .* to fred;
t"091CIVIjt: ll Uf.HCIVIJCIIIjt: fHCIVIIIICI I'.UII)IIII'.d
Prve tri tabele- user, db i host -koriste se kada se utvrđuje da li imate pravo pri- Tabela db
stupa bazi podataka. Svih pet tabela se koristi kada se utvrđuje imate li pravo da U ovoj tabeli čuvaju se podaci o pravima korisnika za pojedine baze podataka. Tabela
izvršite određenu komandu. se sastoji od sledećih kolona:
• Kolone za opseg vidlj'ivosti Na osnovu njihovog sadržaja, MySQL utvrđuje koji
Tabela user red treba učitati. Ako imate različita pravila za različite računare, ostavite polje
Tabela user sadrži podatke o globalnim pravima korisnika. host prazno, a u tabeli host dodajte odgovarajuću grupu redova da biste obezbe-
Ova tabela ima sledeće kolone: dili detaljnije podatke. Ovoj grupi pripadaju sledeće kolone:
• Kolone za opseg vidljivosti Na osnovu sadržaja ovih kolona utvrđuje se koji red Host
treba učitati. Ovoj grupi pripadaju sledeće kolone: Db
Host: Ime računara s kojeg korisnik uspostavlja vezu User
• Kolone za prava Njihov sadržaj određuje koja sve prava ima kombinacija Host,
user: Ime korisnika
Db i User. Ove kolone takođe mogu sadržati samo vrednosti Y ili N. Kolone za
Password: Korisnikova lozinka, u formatu šifrovanom pomoću funkcije
prava su sledeće:
PASSWORD ()
Select_priv Create _pri v
• Kolone za prava Svaka kolona odgovara jednom globalnom pravu i može
sadržati vrednost y (korisnik ima to globalno pravo) ili N (korisnik nema to glo- Insert _pr iv Drop_pri v
balno pravo). Ovoj grupi pripadaju sledeće kolone: Update_priv Grant_priv
Shutdown_priv Delete _pri v Create_tmp_table_priv
Select_priv
Process_priv Index_pri v Lock_tables_priv
Insert _pri v
File _pri v Alter_pri v
Update_priv
'i' db _pri v
'shOW'_
Delete _pri v
Super_pr iv
Tabela host
Index_pri v
MySQL pretražuje tabelu host kad god naiđe na prazno polje u tabeli db. Takvo
Alter_pri v Create_tmp_table_priv
ponašanje ne možete zadati komandom GRANT, ali možete ga ručno podesiti. Tabela
Create_priv Lock_tables_priv ima sledeće kolone:
Drop _pr iv Execute _pr iv
• Kolone za opseg vidljivosti Na osnovu njihovog sadržaja, MySQL utvrđuje koji
Grant _pri v Repl_slave_priv
red treba u čitati. Svaki red u ovoj tabeli sadrži podatke o jednoj bazi podataka
References _pri v Repl_client_priv kojoj se pristupa s jednog računara. Ovoj grupi pripadaju sledeće kolone:
Reload_priv Host
• Kolone za uspostavljanje zaštićene veze Odgovaraju podacima koji se zadaju Db
u odredbi REQUIRE komande GRANT. Ovoj grupi pripadaju sledeće kolone: • Kolone za prava Njihov sadržaj određuje koja sve prava ima kombinacija Host i
ssl_type Db. Ove kolone takođe mogu sadržati samo vrednosti Y ili N. Kolone za prava su
ssl_cypher sledeće:
x509_issuer Select _pri v Create _pri v
x509_subject Insert_priv Drop_pr iv
• Kolone za ograničavanje upotrebe resursa Sadrže podatke o eventualnim ograniče Update_priv Grant_priv
njima upotrebe određenih resursa koje zadajete na kraju komande GRANT. Ovoj
Delete_priv Create_tmp_table_priv
grupi pripadaju sledeće kolone:
Index_pr iv Lock_tables_priv
max_questions
Alter_pri v
max_updates
max_ connections
ou-.
Sa ela
Pitanja Odgovori
l . Pravo GRANT OPTION omogućava korisniku da
a) učitava podatke iz datoteke Pitanja
b) drugima dodeljuje prava koja sam ima l. b
e) se prijavljuje na server, ali ništa više 2. e
d) izdaje komandu FLUSH 3. d
2. Pravo USAGE omogućava korisniku da 4. a
a) učitava podatke iz datoteke 5. a
b) drugima dodeljuje prava koja sam ima
e) se prijavljuje na server, ali ništa više Vežbe
d) izdaje komandu FLUSH l.
grant select, update, insert, delete
3. Pravo RELOAD omogućava korisniku da on employee.department
a) učitava podatke iz datoteke to bill®localhost
b) drugima dodeljuje prava koja sam ima identified by 'secret';
2.
e) se prijavljuje na server, ali ništa više
revoke select, update, insert, delete
d) izdaje komandu FLUSH on employee.department
4. Pravo FILE omogućava korisniku da from bill;
a) učitava podatke iz datoteke
b) drugima dodeljuje prava koja sam ima U sledećem poglavlju
e) se prijavljuje na server, ali ništa više U sledećem poglavlju, "Podešavanje MySQL-a", razmotrićemo mnogobrojne opcije
d) izdaje komandu FLUSH za podešavanje MySQL-a.
12
Podešavanje MySOL-a
Kada je MySQL instaliran na Unixu, možete imati jednu globalnu datoteku opcija, Na isti način kao što zadajete opcije za pojedine programe, možete zadati i grup11
po jednu datoteku opcija za svaki MySQL server instaliran na računaru i po jednu opcija [client], koje će važiti za sve programe.
datoteku opcija za svakog korisnika. (Na jednom fizičkom računaru može raditi Redovi koji počinju znakom # su komentari .
istovremeno više MySQL servera, što je objašnjeno u nastavku ovog poglavlja.) Postoje tri oblika sintakse za zadavanje vrednosti opcija:
Globalna datoteka opcija nalazi se u direktorijumu /etc/my. cnf. Datoteke opcija • Možete navesti ime opcije koju želite da uključite; na primer:
za pojedine servere nalaze su direktorijumima data svakog servera, a datoteke opcija za log-bin
pojedine korisnike nalaze se u matičnom direktorijumu svakog korisnika. Imajte u Ovo je ekvivalentno pozivanju mysqld --log-bin s komandne linije.
vidu da imena datoteka opcija za korisnike imaju prefiks tačku- tj. ime datoteke je • Možete navesti ime opcije i vrednost koju joj dodeljujete; na primer:
.my.cnf a ne my.cnf. innodb_flush_log_at_trx_commit=l
Pogledajmo ponovo datoteku opcija koju smo u poglavlju 1 naveli kao primer
• Možete navesti ime opcije i do deli ti joj vrednost pomoću sintakse set -vari a-
sintakse za tu vrstu datoteka. Njen sadržaj ponovo prikazujemo u listingu 12.1.
ble; na primer:
Listing 12.1 Primer datoteke opcija my.cnf set-variable = innodb_log_buffer_size=BM
Treći oblik sintakse smatra se zastarelim, ali smo ga naveli radi celovitosti. Pošto
[mysqld]
# binarno beleženje i beleženje sporih upita ćete nailaziti na ovaj oblik sintakse u nekim datotekama primera, trebalo bi da
log-bin znate šta on znači. Na primer, to je slučaj s primerom datoteke my. cnf, koju
log-slow-queries smo preuzeli iz MySQL-ove dokumentacije kao jednostavnu datoteku opcija
za lnnoDB.
# podešavanje za InnoDB tabele
# ovo je osnovna datoteka opcija predložena u dokumentaciji. Neke opcije koje određuju kako će se koristiti datoteke opcija važe za sve programe:
# Datoteke za podatke treba da omoguće • --no-defaults znači da nema datoteka opcija čiji bi sadržaj trebalo učitati.
# skladištenje podataka i indeksa.
# obezbedite dovoljno slobodnog • - -print-defaults prikazuje sve vrednosti opcija koje važe za tekući program.
# prostora na disku. • --defaults-file=/putanja/do/datoteke nalaže programu da koristi zadatu
innodb_data_file_path = ibdatal:lOM:autoextend datoteku umesto standardnih datoteka opcija. To je korisno pri testiranju izmena
# podesite veličinu rezerve za bafere na
konfiguracije.
# so-so% količine memorije
# na računaru • --defaults-extra-file=/putanja/do/datoteke učitaće navedenu datoteku
set-variable = innodb_buffer_pool_size=70M nakon učitavanja globalne datoteke opcija, ali pre učitavanja datoteka opcija za
set-variable = innodb_additional_mem_pool_size=lOM pojedinačne korisnike.
# podesite veličinu dnevnika na približno
# 25% veličine rezerve za bafere Opcije za mnoge programe koje možete podesiti pomoću datoteka opcija opisane
set-variable = innodb_log_file_size=20M su na drugim mestima u ovoj knjizi. Izuzetak je mysqld. U narednom odeljku razmo-
set-variable = innodb_log_buffer_size=BM trićemo najvažnije i najkorisnije opcije za komandnu liniju programa MySQL server.
# podesite .. flush_log_at_trx_commit
# na o ako možete da prihvatite gubljenje
u nekoliko poslednjih transakcija Opcije za program mysqld
innodb_flush_log_at_trx_commit=l Naredna lista opcija nije potpuna, a svrha joj je da predoči najčešće korišćene opcije
za mysqld. Svaka opcija se može zadati na komandnoj liniji pri pokretanju programa
Pogledajmo format ove datoteke. mysqld ili, kao što smo već pomenuli, putem datoteke opcija.
Prvi red u datoteci je Listu svih opcija (upozorenje: prilično je dugačka) dobićete ako na komandnoj
[mysqld] liniji otkucate
To znači da su opcije navedene iza ovog reda namenjene programu mysqld. Ako mysqld --help
želite da zadate opcije za drugi program, navedite njegovo ime na početku grupe
opcija. Imc mora biti napisano unutar uglastih zagrada.
1/2 Pog lavlje 12 Podešavanje MySQL-a
imedatoteke : veličina [; imedatoteke:veličina; .. . ] [ :autoex- • socket: Na Unixu, svaki server mora koristiti drugu datoteku utičnice. Na
tend [:max: veličina]] Windowsu, opcijom socket zadaje se ime imenovanog cevovoda koji server
Opcija autoextend omogućava da se veličina prostora za tabele povećava prema koristi. U oba slučaja, vrednost opcije socket mora biti različita za svaki server.
potrebama. Opcija max omogućava da zadate maksimalnu veličinu do koje dato- • shared-memory-base-name (samo na Windowsu): Svaki server mora koristiti
teka može da naraste. drugi blok deljene memorije.
• innodb_buffer_pool_size=70M pi d- file (samo na Unixu): Svakom serveruje potrebna vlastita datoteka u koju
Ova opcija podešava veličinu bafera koji se koristi kao ostava za (keš) pri radu upisuje identifikator svog procesa (picl).
s podacima u InnoDB tabelama i indeksima . Kao i svaka druga ostava, što veća,
• Opcije za beleženje podataka u dnevnike izmena: Ako zadate vrednost bilo koje
to bolja- omogućava manje direktnih pristupa disku . Koliko ćete memorije
opcije koja se odnosi na datoteke dnevnika, za svaki server moraćctc da zadatl~
odvojiti za rezervu bafera zavisiće od toga da li na serveru ima i drugih aplikacija 1h 111-1i direktorij um za datoteke dnevnika.
i kmisnik.l, ali i ml količine memorijl' s kojo111 raspolažete.
1 14 Poglavlje 12 Podešavanje MyS UL-a
Jednostavan način da to postignete jeste da opciji basedir dodelite različitu vred- • Sintaksa datoteke počinje imenom programa između uglastih zagrada, Čl'lllll
nost za svaki server. Tako će direktorijumi data i datoteke dnevnika automatski biti slede opcije koje se odnose na taj program. Komentari počinju znakom ll. Sv.d.;,1
različiti. Toplo preporučujemo da svaki server ima svoj direktorijum data, tako izbe- opcija može se zadati u obliku opcija, opcija=vrednost, ili set-variabl
gavate razne neprijatnosti. opcija=vrednost.
Opcija --defaults-fileje veoma korisnajer omogućava da se svaki server • Listu svih opcija za program mysqld možete dobiti pomoću komande mysqlcl
pokrene s različitim skupom podrazumevanih vrednosti opcija (ili da se svaki server --help.
instalira kao Windowsov servis s vlastitim skupom podrazumevanih vrednosti opcija). • Više MySQL servera može raditi na istoj mašini u isto vreme, pod uslovom da
Važno je da zapamtite sledeće: kada na istom računaru radi više servera, klijentskim podesite opcije tako da serveri ne ometaju jedan drugog. Za svaki server morate
programima i drugim programima koji uspostavljaju veze sa serverom, kao što je mys- zadati različite brojeve TCP priključka, utičnica i datoteka dnevnika.
qladmin, morate zadati server s kojim treba da se povežu. U takvim situacijama može
• U datoteci opcija možete zadati podrazumevani skup znakova i jezičkih pravila
biti veoma pametno da za svakog korisnika napravite po jednu datoteku my. conf u
koja će važiti na serveru. Skup znakova se sastoji od skupa dozvoljenih simbola .
kojoj ćete zadati odgovarajući broj TCP priključka- tako korisniku omogućavate da
Jezička pravila određuju redosled sortiranja.
automatski uspostavi vezu sa svojim serverom.
lnternacionalizovanje Pitanja
l. Opcija --no-defaults za mysqld znači
Postoje dve opcije za mysqld koje omogućavaju da se zada podrazumevani skup zna-
kova i jezičkih pravila. Skup znakova je skup simbola koji se može koristiti na serveru. a) ne važe podrazumevane vrednosti, već samo vrednosti zadate u datoteci
Jezička pravila određuju način na koji se parede nizovi znakova iz tog skupa- čime se opcija
određuje i redosled sortiranja- što zavisi od govornog jezika. b) ne učitavati ništa iz datoteka opcija
Podrazumevani skup znakova možete zadati pomoću opcije --default -charac- e) učitati vrednosti samo iz globalnih datoteka opcija
ter-set. Svakom skupu znakova pridružen je i podrazumevani skup jezičkih pravila, d) nijedno od prethodnih
ali možete zadati i neki drugi pomoću opcije --default-collation option. Ako
2. Opcija za Inn oD B koja podešava veličinu prostora za tabele je
kombinacija skupa znakova i skupa jezičkih pravila nije ispravna, mysqld će prikazati
a) innodb_buffer_pool_size
poruku o grešci.
Ako nijedna od ovih opcija nije zadata, podrazumeva se skup znakova latin l i skup b) innodb_data_file_path
jezičkih pravila latinl_swedish_ci. Taj skup znakova se takođe označava kao IS0- e) innodb_log_buffer_size
-8859-1 West European. Jezička pravila latinl_swedish_ci određuju redosled sor- d) nijedna od prethodnih
tiranja teksta na Švedskom i finskom jeziku koji se sastoji od znakova iz skupa latin l. 3. Opcija za InnoDB koja podešava veličinu bafera za podatke je
(Možda niste znali da za reči napisane istim slovima važe različita pravila sortiranja u a) innodb_buffer_pool_size
različitim jezicima.) Postoje i jezička pravila koja se mogu pridružiti skupu znakova
b) innodb_data_file_path
latinl koja opisuju kako se sortira tekst na nemačkom, danskom i norveškom jeziku.
Više informacija o skupovima znakova koje MySQL podržava, naročito ako vas e) innodb_log_buffer_size
z~nima baš određeni skup, potražite u MySQL-ovoj dokumentaciji. d) nijedna od prethodnih
4. Kada više servera radi na istom računaru, nUe neophodno da sledeći elementi
budu odvojeni:
Sažetak
a) datoteke dnevnika
• MySQL-ovi programi mysql, mysqladmin, mysqld, mysqld_safe, mysql.server,
b) TCP priključci
mysqldump, mysqlimport, mysqlshow, mysqlcheck, myisamchk i myisampack
podržavaju upotrebu zajedničkih datoteka opcija. e) utičnice
• Opcije možete podesiti tako da važe na globalnom nivou, na nivou pojedinač d) klijentski programi
nog servera i/ ili korisnika, ili na svim navedenim nivoima istovremeno.
~G Poglavlje 12 Podešavanje MySOL-a
Odgovori
Pitanja
u OVOM POGLAVLJU RAZMOTRIĆEMO uobičajeneposlove koji su neophodni za
upravljanje MySQL-ovom bazom podataka. To obuhvata sledeće aktivnosti:
l. b • Pokretanje i spuštanje srevera
2. b • Prikazivanje podataka o serveru i bazama podataka na njemu
3. a • Podešavanje serverskih promenljivih
4. d • Uništavanje niti
S. a • Pražnjenje ostava
• Analiziranje tabela
U sledećem poglavlju • Pregledanje datoteka dnevnika izmena
U sledećem poglavlju, "Administriranje baze podataka", razmotrićemo uobičajene Mada prvenstveno objašnjava poslove koje treba da obavlja administrator baze
t svakodnevne poslove održavanja koje treba obavljati u MySQL-ovoj bazi podataka.
podataka, ovo poglavlje opisuje i jedan važan skript, mysqladmin, koji omogućava da
automatizujete neke od tih poslova.
Zadavanjem odgovarajućih parametara, skript mysqladmin se može upotrebiti za
obavljarUe velikog broja administrativnih poslova. Na kraju ovog poglavlja naći ćete
njihov spisak.
U ovom poglavlju razmotrićemo i upotrebu skriptova mysqlshow i mysqlcheck, te
SQL-ovih komandi KILL, RESET, CHECK, REPAIR i ANALYZE TABLE.
ali samo ako imate kopiju izvršne datoteke mysqld u direktorijumu koji se podrazu-
meva u distribuciji Red Hat. Ako se ta datoteka nalazi na drugom mestu, moraćete da
zadate tačnu putanju. Više informacija o tome naći ćete u poglavlju l. Server možete
pokrenuti i pomoću skripta
safe_mysqld
Ovaj skript najpre pokušava da automatski odredi odgovar~uće opcije za pokre- 1'1-0Yidosn..,
~o ...
.......
........ toc•~
Locd~~Sys;t~
tanje MySQL-a, a zatim pokreće MySQL s tim opcijama.Ako skript nije na vašoj (alecb ..... ..
~'-·· '"""""'
Lout5o,ostem
........ ,....
-.......
fnobiH• ... 51:•ted
Atltritvw:t ... 51:•ted Local~
Da biste na Linuxu spustili MySQL server, imate dve mogućnosti. Možete izdati loadJNe. ... St•ted
l'rl;wlcle$p . .• St•ted ............- "..,
Locals-,.tem
LCIUIISyod:em
komandu ........ """""-
Crut••···
Mlnoqei: • ...
5t•ted
....... Loct/Sysl:.-!1
LQ(also,stem
/etc/init.d/mysqld stop
ili
PnNidest ...
~t
ENbletrl ...
...
St•ttd .........
.........
.........
"""-
Net.-lo.S ...
,....
lCIUIISerw;•
....
"._
Lou!So,lt.,..
.....
Offeru- . ..
,
su..-.....
-- ........
~- "....
.....
5l•ted
Razume se, možete koristiti i neki drugi adm.inistratorski nalog, ali nalog root je
J~W~eoet:e ...
fNtllessu .. .
St•t..:l
....... Loul Sylt. .
,.... ,.,...
LouoiSeMc:e
loc.. s.r.t:e
~·-··..
uvek upotrebljiv. Nalozi pod kojima rade obični korisnici ne bi trebalo da imaju pravo Tr.:boy~.
.....
..... -...
5t•t..:l
.-
Lauls,.st. .
Loul~
LocdiiSytten~
spuštanja servera.
Na Windowsu, ukoliko ste mysqld instalirali kao Windowsov servis, najjednostavniji
način da pokrenete bilo koji servis jeste da otvorite Control Panel i pređete u Admini-
Slika 13.1 Prozor Services alatke Windows
strative Tools, Services. Ako izaberete servis MySQL,Windows će vam za njega ponuditi
Administrative Tools.
opcije Stop (spuštanje), Pause (zaustavljanje) ili Restart (ponovno pokretanje), kao što je
prikazano na slici 13.1. (Pošto je ovo ekranska slika iz Windowsa XP Professional, sadržaj
vašeg ekrana će se možda malo razlikovati, što zavisi od verzije operativnog sistema.) Kao i većinu skriptova koji se pokreću s komandne linije, skript mysqlshow možete
Server možete spustiti i pomoću skripta mysqladmin za Linux, na opisani način. pokrenuti s parametrom -u kojem sledi ime korisničkog naloga, i parametrom -p,
kojim se prosleđuje lozinka tog naloga. Postoje i druge korisne opcije. Ako zadate
mysqlshow --help
Prikazivanje podataka o serveru i bazama podataka
prikazaćese lista svih opcija na raspolaganju.
na nJemu Jedna od njih omogućava da zadate ime baze podataka da biste prikazali podatke
Skript mysqlshow i SQL-ova komanda SHOW pružaju vam, kao administratoru, puno samo o određenoj bazi koja vas zanima. Na primer, ako ime baze podataka zadate u
informacija o onome što se odvija u bazama podataka i na samom serveru. sledećem obliku, prikazaće se lista tabela u toj bazi podataka:
prikazaće se lista baza podataka u koje vam je dozvoljen pristup pod vašim tekućim Rezultati su malo teže čitljivi zbog dugačkih redova, ali se za svaku tabelu prika-
korisničkim nalogom. Rezultat je isti kao kada zada te zuju podaci o mašini za skladištenje podataka koja se koristi, količini podataka u tabeli,
tekućoj vrednosti u koloni tipa auto-increment (ukoliko postoji takva kolona) i podaci
show databases;
o skupu znakova koji važi za tabelu.
u programu mysql ili u nekom drugom korisničkom interfejsu.
l 111'-U"-IWUIIJ"'- t'"'._.._. ..... ,....,.""'--· •- · - • ..,._"_,.._. .,,.,_. r----~---- ··-''l "'
l tlU
Podatke o bazi podataka i stanju servera možete pribaviti i pomoću SQL-ove Vrednosti većine serverskih promenljivih možete zadati u konfigur a<:tonoj datoteci,
komande SHOW koju zadate unutar MySQL-ovog klijentskog programa. Dosad bi tre- na komandnoj liniji kada pokrećete server ili dinamički, unutar MySQL· ,t, ponto ć u
balo da već znate da izdate komande kon1ande SET. Podešavanje servera opisano je u poglavlju 12",Podešavanjc MyS(~J .t'',
a upotreba komande SET opisana je u nastavku ovog poglavlja.
show databases;
Komanda RESET koristi se na isti način kao komanda FLUSH. Na primer, možete
dobićete sledeći rezultat:
zadati
CREATE TABLE 'department'
'departmentiD' int(ll) NOT NULL auto_increment, reset query cache;
•name' varchar(30) default NULL, Umesto da samo defragmentira ostavu za upite, ova komanda je prazni.
PRIMARY KEY ('departmentiD') Listu svih promenljivih na koje deluju komande FLUSH i RESET naći ćete u
TYPE=InnoDB CHARSET=latinl MySQL-ovoj dokumentaciji.
(Obratite pažnju na to da su, za svaki slučaj, imena ko~ona napisa~:. između polu-
navodnika i naveden je podrazumevani skup znakova, koj l rusmo lZnClto zadah kada
smo napravili tabel u).
Datoteke dnevnika
MySQL održava više datoteka dnevnika koje mogu biti korisne. Budući da beleženje
u većinu tih datoteka dnevnika nije uključeno u standardnoj konfiguraciji servera,
Podešavanje serverskih promenljivih .. . . to ćete morati sami da učinite. Svaki dnevnik se aktivira pomoću opcije zadate na
Komanda SET omogućava da zadajete vrednosti serverskih promenljlVlh - koje ste komandnoj liniji pri pokretanju servera ili pomoću komande set.
mogli da vidite pomoću komande show variables. Sintaksa komande izgleda ovako: Možete održavati sledeće dnevnike:
set promenljiva=vrednost; • Dnevnik grešaka (engl. Error log): tu se beleže sve greške nastale pri radu servera.
Na primer, možete zadati: Ovaj dnevnik je standardno aktivan a njegova datoteka se nalazi u direktorijumu
set sql_safe_updates=l; data. U Linuxu, ime te datoteke je hostname. err, a u Windowsu, njeno ime je
mysql. err. Možete je smestiti i u neki drugi direktorij um, koji morate navesti u
Time se uključuje bezbedno ažuriranje podataka (isto se postiže i ako na koman-
opciji log-error=imedatoteke u konfiguracionoj datoteci my. ini ili my. cnf.
dnoj liniji zadate --i-am-a-dummy). v. . . .
Ovu komandu koristićemo često kada budemo dosh do opt1m1zovanp servera u • Dnevnik upita (engl. Query log): tu se beleže svi upiti koji se izvršavaju u sistemu.
poglavlju 17 ",Optimizovanje MySQL Servera". Ovaj dnevnik možete aktivirati i zadati direktorijum za njegovu datoteku
pomoću opcije log=imedatoteke.
• Dnevnik izmena (engl. Binary log): tu se beleže rezultati svih upita koji menjaju
Uništavanje niti . podatke. Ovaj dnevnik zamenjuje nekadašnji Update log, koji će ostati na raspo-
Komanda show processlist koju smo pomenuli u prethodnom delu ovog poglavlja laganju i u MySQL-ovoj verziji 5.0, ali se smatra zastarelim. Ovaj dnevnik
omogućava da vidite koje se sve niti izvršavaju na serveru. Između ostalog, komanda možete aktivirati i zadati direktorijum za njegovu datoteku pomoću opcije
prikazuje i jedinstveni identifikator dodeljen svakoj niti. Ak~ za ~:~~ m.~ sum~jate da log-bin=imedatoteke.
je uzrok problema (na primer, upit koji s; izv.ršava "celu vecnos: ih klljentskl pro-
• Dnevnik sporih upita (engl. Slow query log): tu se beleže svi upiti čije izvršavanje
gram zbog kojeg je nastao problem), mozete je prekinuti pomocu komande
traje duže od vremena zadat og u promenljivoj long_query_t ime. Ovaj dnevnik
kill id_procesa; možete aktivirati i zadati direktorijum za njegovu datoteku pomoću opcije
log-slow-queries=imedatoteke
Pražnjenje ostava v . . • ,
Svi navedeni dnevnici, osim dnevnika izmena, obične su tekstualne datoteke.
MySQL koristi pri radu grupu internih ostava (kešova), koje m.ozete 1spra~mt1 pom~cu Sadržaj dnevnika izmena možete videti pomoću komande
komandi FLUSH i RESET. Na primer, ako ste izmenili prava konsmka tako sto ste rucno mysqlbinlog logfile
izmenili sadržaj tabela prava, te izn1.ene će početi da važe u celom sistemu tek kad izdate
Upotrebu dnevnika sporih upita razmotrićemo u poglavlju 19.
komandu: Pošto veličina datoteka dnevnika raste, trebalo bi da ih ciklično zamenjujete dru -
flush privileges; gim datotekama. Ako koristite Linux, uz MySQL dobijate i skript mysql-log- rota te
Druga česta upotreba komande FLUSHjeste pražnjenje bafera za upite: koji formira grupu datoteka za cikličnu upotrebu.
(lush query cache;
Time ćete defragmentirati bafer za upite, čime se poboljšavaju performanse.
R4 Poglavlje 13 Administriranje baze podataka
Ako koristite neki drugi operativni sistem, stare datoteke dnevnika možete ručno • Vrednosti serverskih promenljivih možete zadati pomoću konlalhh•
premestiti na bezbedno mesto a zatim naložiti MySQL-u da započne upisivanje u menlj iva=vrednost;.
novu datoteku dnevnika, pomoću sledeće komande • Listu aktivnih niti možete prikazati pomoću komande show proceoo l l t 1 1 11
mysqladmin flush-logs možete uništiti pomoću komande kill id_procesa.
• Ostave se prazne pomoću komandi FLUSH i RESET.
Opcije za skript mysqladmin • Brzinu upita u kojima se spajaju tabele možete povećati pomoću komandl" 111,
Za skript mysqladmin postoje mnogobrojne, manje ili više korisne opcije. lyze table ime_tabele; .
Neki poslovi, kao što je pravljenje i brisanje baza podataka, mogu se obaviti • MySQL beleži podatke u dnevnik grešaka, dnevnik upita (svi upiti), dnevnik
pomoću SQL-ovih komandi ili pomoću skripta mysqladmin:
izmena (upiti koji menjaju podatke) i dnevnik sporih upita (upiti čije izvršava liJI'
mysqladmin create databasename traje duže nego što je zadato upromenljivoj long_query_time).
mysqladmin drop databasename
Skript mysqladmin se često upotrebljava za prikazivanje podataka o serveru i Pitanja
njegovom. tekućem stanju. Podatak može biti bilo šta u opsegu od vrlo jednostavnog, 1. Koji su od sledećih dnevnika standardno aktivni?
npr. "Da li server radi?'' (ping), do nečeg znatno detaljnijeg, kao što je lista vrednosti a) dnevnik upita
serverskih promenljivih ili aktivnih procesa. U nastavku je opisana upotreba skripta b) dnevnik sporih upita
mysqladmin za mnoge takve poslove.
e) dnevnik grešaka
Da biste saznali da li server uopšte radi, zadajte sledeće:
d) dnevnik izmena
mysqladmin ping
e) svi prethodni
Da biste saznali koja je verzija softvera za MySQL server instalirana na računaru,
2. SQL-ova komanda SHOW može se upotrebiti za prikazivanje
zadajte sledeće:
a) liste svih baza podataka na serveru
mysqladmin version
b) liste svih tabela u određenoj bazi podataka
Da biste prikazali kratak ili dugačak opis statusa servera, zadajte sledeće:
e) liste svih kolona u određenoj tabeli
mysqladmin status
d) svega prethodnog
mysqladmin extended-status
3. Skript mysqladmin može se upotrebiti za
Da biste prikazali listu aktivnih niti na serveru, zadajte sledeće:
a) učitavanje prava nakon izmena da bi se obezbedile da izmene počnu da
mysqladmin processlist
važe
Ako se prikaže lista procesa (niti), neželjene niti možete uništiti na sledeći način:
b) prikazivanje tekućeg statusa servera
mysqladmin kill idl,id2,id3 ... e) spuštanje i pokretanje servera
Da biste prikazali vrednosti MySQL-ovih serverskih promenljivih, zadajte sledeće: d) zatvaranje i ponovno otvaranje datoteka dnevnika
mysqladmin variables e) sve prethodno
Sažetak Vežbe
• Server se može pokrenuti pomoću skripta mysqladmin, pokretanjem izvršne Aktivirajte sva četiri dnevnika. Pošto izvršite više upita, pregledajte sadržaje dnevnika .
datoteke mysqld, ili pomoću Windowsove alatke Services manager. Ako nemate pristup većoj bazi podataka, možda nećete postići da se nešto upiše u
• Server se može spustiti pomoću komande mysql. server stop ili pomoću dnevnik sporih upita. Definicija "sporog" je najmanje jedna sekunda .
skripta mysqladmin shutdown .
• Komanda mysqlshow omogućava prikazivanje podataka o tekućoj bazi ili
o MySQL serveru .
186 Poglavlje 13 Administriranje baze podataka
Odgovori
Pitanja
l. e
2. d
3. e
Izrada rezervnih kopiJ
U sledećem poglavlju
U poglavlju 14, "Izrada rezervnih kopija i obnavljanje podataka", objašnjavamo izradu
i obnavljanje podatak
rezervnih kopija baza podataka i šta treba uraditi kad nešto krene naopako.
Ako vam zatreba da pomoću ove datoteke ponovo formirate bazu podataka i njen Ovaj skript se pokreće na sledeći način:
sadržaj, postupak će biti brži nego kada zadate niz pojedinačnih komandi INSERT. mysqlhotcopy -u imekorisnika -p ime_baze ciljni_direktorijum
• --lock-tables: Nalaže MySQL-u da zaključa sve tabele pre nego što započne
Skript je napisan na jeziku Perl. Ako imate Unix ili srodni operativni sistem, golovn
izradu datoteke slike stanja. je sigurno da negde imate i izvršnu datoteku perl. Ukoliko imate Windows, morale
Imajte u vidu da opcija --opt (koja znači optimizovati) optimizuje vreme potrebno instalirati Perl da biste mogli da koristite ovaj skript. Ako ga još nemate, možete p rl'
za rekonstruisanje baze podataka pomoću datoteke slike, a ne vreme potrebno za izradu same uzeti verziju Perla za Windows s Web lokacije kompanije ActiveState:
datoteke slike. Postupak izrade datoteke slike može biti prilično spor. www.activestate.com/Products/ActivePerl
Evo još nekoliko korisnih opcija:
Datoteke koje pravi skript mysqlhotcopy identične su kopije datoteka baze poda
• --databases: Omogućava da zadate više odjedne baze podataka čije slike stanja taka. Da biste mogli da upotrebite te kopije za restauriranje baze podataka, morate
želite da napravite. spustiti MySQL server i zameniti tim kopijama datoteke u MySQL-ovom direkto-
• --all-databases: Nalaže MySQL-u da napravi slike stanja svih baza podataka rijumu data.
na serveru.
• --allow-keywords: Ako u tabelama imate polja sa istim imenima kao rezervi- Ručna izrada rezervnih kopija i obnavljanje podataka
sane reči MySQL-a (ili onima koje u budućnosti mogu postati rezervisane reči), Umesto skripta mysqlhotcopy, možete i sami ručno uraditi sve što taj skript radi. To
ova opcija nalaže MySQL-u da svakom imenu kolone pridruži i ime tabele kojoj podrazumeva pražnjenje bafera, zaključavanje tabela i kopiranje datoteka s podacima
kolona pripada. u odredišni direktorij um, pri čemu tabele moraju biti zaključane.
• -d ili --no-data: Formira samo sliku strukture baze podataka, ali ne i njenog To znači da morate otvoriti novu sesiju na MySQL serveru. Možete najpre izdati
sadržaja. To je veoma korisno kada testirate baze podataka ili ih instalirate na komandu LOCK TABLES da biste zaključali sve tabele za koje nameravate da napravite
druge računare. rezervne kopije:
lock tables
Prednosti skripta mysqldump jesu u tome što se jednostavno upotrebljava i auto-
employee read,
matski rešava problem zaključavanja tabela umesto vas. department read,
Međutim, ima i nekoliko nedostataka. Prvi je to što skript zaključava tabele: kada client read,
skript pokrenete na serveru, korisnicima sprečavate pristup tokom više sekundi ili čak assignment read,
minuta, što zavisi od veličine tabela. Ako planirate izradu slike stanja na serveru koji se employeeSkills read;
ne replikuje, trebalo bi da pokušate da taj postupak obavite u vreme manje optereće Parametri komande LOCK TABLES su lista imena tabela i vrsta blokade koju posta-
nosti sistema da ne biste previše ometali korisnike. Ako u svako doba dana imate velike vljate, READ ili WRITE. Za izradu rezervnih kopija obično je dovoljna blokada tipa
količine podataka i veliki broj korisnika, trebalo bi da se opredelite za drugi način READ. To znači da druge niti (otvorene veze sa serverom) mogu neometano da čitaju
izrade rezervnih kopija. tabele ali ne mogu ništa da menjaju u njima dok traje postupak kopiranja.
Drugi nedostatak je sledeća činjenica: pošto skript mysqldump za svoj rad koristi Zaključavanje tabela je važno u ovakvim situacijama jer kopiranje može da potraje
MySQL server, postupak je sporiji nego kada koristite skript mysqlhotcopy. Skript prilično dugo. U našem primeru baze podataka employee, bilo bi veoma nezgodno da
mysqlhotcopy ne zavisi mnogo od MySQL servera, već se pri svom radu obraća nakon izrade rezervne kopije tabele, a pre kopiranja tabele department, neko izbriše
direktno sistemu datoteka na računaru. sve zaposlene iz neke službe, a zatim izbriše i samu službu. Rezultat bi bio neusklađena
kopija podataka u kojoj bismo imali zaposlene koji rade u nepostojećoj službi.
Izrada rezervne kopije i obnavljanje baze podataka Sledeći korak je izdavanje komande FLUSH TABLES:
pomoću skripta mysqlhotcopy flush tables;
Skript mysqlhotcopy razlikuje se od skripta mysqldump po tome što direktno kopira
Ako pravite rezervnu kopiju svih baza podataka na serveru, ovaj korak možete
datoteke baze podataka, umesto da učitava podatke preko veze koju uspostavi sa serve-
kombinovati s prethodnim pomoću sledeće komande:
rom. On se povezuje sa serverom da bi ispraznio bafere tabela i zaključao tabele, ali
budući da komunicira sa sistemom datoteka na računaru i ne izvršava upite na serveru, flush tables with read lock;
trebalo bi da bude nešto brži od skripta mysqldump. Sada možete započeti kopiranje datoteka s podacima.Veoma je važno da vaša sesija
(u kojoj ste zaključali tabele i ispraznili njihove bafere) ostane otvorena tokom celog
I!J4 PoglavlJe 14 Izrada rezervni h kOpiJa 1 obnavlJanJe podataka O O-' -•- O -·-·- ··.-e...._.....,_____
postupka jer će tako blokade koje ste postavili biti održane. Kada zatvorite tu sesiju, Korisno je da pregledate tu listu pre nego što ponovo izvršite upite ev1dclllll.lll
tabele će biti oslobođene. u dnevniku jer neke među njima možda nećete žele ti da izvršite. Moguće je d.1 \l
Kada završite kopiranje, trebalo bi da oslobodite tabele: zbog loše osmišljenog upita morali da restaurirate stanje baze podataka iz reze t Vl H
unlock tables; kopije.
Opisani postupak je ono što radi skript mysqlhotcopy, a podatke možete obnoviti Na primer, imali smo slučaj da je program er zadao upit nalik na sledeći
iz kopija na isti način kao da ste kopije napravili pomoću tog skripta. update user set password='password';
Jasno je da kada obnavljate tabelu, ne biste želeli da se ovakav upit ponovo izvrši
Izrada rezervni h kop ija i ob navljanj e podataka pomoću komandi i da lozinka svakog korisnika sistema ponovo bude password!
BACKU P TABLE i RESTORE TABLE
Osim primenom postupaka koje smo opisali u prethodnim odeljcima, isti rezultat
možete postići i pomoću dve SQL-ove komande, BACKUP TABLE i RESTORE TABLE. Testiranje rezervne kopije
Te komande deluju samo na tabele tipa MyiSAM. Bez obzira na metod izrade rezervne kopije za koji se opredelite, veoma je važno da je
Rezervnu kopiju MyiSAM tabele možete napraviti na sledeći način: testirate ili, tačnije rečeno, da ispitate njenu upotrebljivost za obnavljanje podataka.
Nisu retki administratori koji redovno prave rezervne kopije ali nikad ne proveravaju
backup table tl to 'putanja/do/kopije';
da li bi iz tih kopija mogli da restauriraju podatke ako zatreba.
Ako koristite Windows, imajte u vidu da morate zadati slovnu oznaku diska kao u Postupak izrade rezervne kopije morate pažljivo razmotriti kada analizirate rizike
sledećem primeru: ' i odlučujete o tome šta ćete raditi. Gde ćete tačno smestiti datoteke rezervnih kopija
backup table tl to 'c:/putanja/do/kopije'; da bi bile na drugom fizičkom disku? Kako ćete obezbediti da rezervna kopija ostane
Ova komanda na zadatu putanju kopira datoteku u kojoj se nalazi zadata My ISAM neoštećena na udaljenoj lokaciji gde je čuvate? Ako donesete odgovarajuće odluke
tabela. Tabela se automatski zaključava tako da bude dozvoljeno samo čitanje i pravi se na osnovu ovih pitanja i počnete da pravite rezervne kopije u redovnim vremenskim
njena kopija. razmacima, nema razloga da brinete da li će te kopije biti upotrebljive. Ukoliko resta-
Možete zadati i listu imena tabela razdvojenih zarezima; međutim, u tom slučaju se urirate bazu podataka kao vežbu, možete otkriti eventualne probleme pre nego što
tabele zaključavaju i kopiraju jedna za drugom.Ako želite da podaci u svim navedenim postanu nerešivi.
tabelama budu međusobno usklađeni, izdajte najpre komandu LOCK TABLES (pogle- Izuzetno važan element pri instaliranju MySQL-a, kao i za postupak obnavljanja
dajte prethodni odeljak, "Ručna izrada rezervnih kopija i obnavljanje podataka") . podataka, jeste da uključite beleženje izmena u dnevnik izmena. Taj dnevnik stan-
Da biste iz rezervne kopije obnovili tabelu, izdajte sledeću komandu: dardno nije aktivan, ali je neophodan za dovođenje res ta urirane baze podataka u
poslednje ispravno stanje.
restore table tl from 'c:/tmp';
Rezultat će biti uspešan samo ako tabele koje obnavljate ne postoje u tekućoj bazi
podataka. Ako već imate tabel u sa istim imenom, morate je prethodno izbrisati Proveravanje i popravljanje tabela
komandom DROP TABLE da biste zatim mogli da upotrebite komandu RESTORE. Proveravanje da li su tabele oštećene, deo je standardnog postupka održavanja tabela
Komanda RESTORE takođe deluje samo na MyiSAM tabele. a deo je i postupka restauriranja baze nakon katastrofalne greške, na primer, u slučaju
prekida napajanja računara .
Restauriranje podataka iz dnevnika izmena U MySQL-u postoje tri načina da proverite ispravnost tabela: pomoću komande
l<;1da obnavljate bazu podataka iz rezervne kopije, vrlo često se dešava da korisici CHECK TABLE, pomoću skripta myisamchk (ili isamchk) i pomoću skripta mysql-
dodaju nove podatke i ažuriraju postojeće nakon izrade poslednje rezervne kopije. check.Tabele u kojima otkrijete problem možete popraviti pomoću komande REPAIR
U tom slučaju se stanje baze podataka može restaurirati iz rezervnih kopija na jedan TABLE ili takođe pomoću skripta myisamchk (ili isamchk) ili mysqlcheck.
od na čina opisanih u prethodnim odeljcima, a zatim treba ponovo primeniti sve Kada razmatrate koju ćete mogućnost primeniti, trebalo bi da imate u vidu sledećih
i;-mene načinjene nakon izrade rezervne kopije. nekoliko činjenica. Komande CHECK i REPAIR možete izdati iz samog MySQL-a, dok sc
Tc izmene se čuvaju u dnevniku izmena (engl. binary log), što ga čini izuzetno druge mogućnosti mogu primeniti samo s komandne linije. Komande CHECK i REPAIR
va7n im . Listu izvršenih operacija možete u čitati iz dnevnika izme na pomoću komande deluju i na MyiSAM i na InnoDB tabele. Skript isamchk upotrebljiv je za ISAM tabele,
mysqlbinlog logfile > updates.sql dok se skriptovi myisamchk i mysqlcheck mogu koristiti za My ISAM tabele.
1:70 rU!JiliVIJC l'+ ILl dUll l CLCI VIlli l II.Uf.IIJ<I l UUII<IVIJ<IIIJC f.IUU<Il<lll.čl
Ako se tabele upravo koriste, nemojte pokretati skript myisamchk ili isamchk. Program myisamchk izuzetno je koristan i izvući će vas iz neprilika u koje ste
Bolje je da spustite server pre nego što pokrenete jedan od tih skriptova, ali ako je možda upali. Za program myisamchk takođe važi da se ne sme pokrenuti dok se server
neophodno, možete i zaključati tabele. Ako te skriptove pokrenete za tabele s kojima još koristi. Bezbednije je da ga spustite.
u isto vreme možda rade druge MySQL-ove niti, podaci se mogu oštetiti. Komande Najjednostavniji način da pokrenete myisamchkjeste da na komandnoj liniji
CHECK, REPAIR i skript mysqlcheck mogu se slobodno koristiti dok server radi i tabele otkucate l
se koriste. myisamchk tabela
Razmotrićemo redom navedene alatke. Vrednost parametra tabela mora biti putanja do.MYI datoteke u kojoj je smeštena
MyiSAM tabela.
Proveravanje i popravljanje tabela pomoću komandi CHECK i REPAIR Ovaj program prikazuje podatke o praktično svim mogućim greškama do kojih
Ispravnost tabele možete proveriti pomoću komande CHECK TABLE, kao u ovom može doći.Ako vam se čini da ne uspeva da reši vaš problem, pokušajte da ga pokrenete
primeru: sa opcijom -m. Standardno ponašanje je da progran1 ispituje da li su indeksi oštećeni;
check table department; kada zadate ovu opciju, ispituju se i redovi tabele.
Komanda CHECK TABLE deluje i na MyiSAM i na InnoDB tabele. Alatka myisamchk omogućava i ispravljanje otkrivenih grešaka. Tako se može ispra-
Trebalo bi da dobijete rezultat nalik na sledeći (ako je sve u redu): viti velika većina grešaka do kojih dolazi u MyiSAM tabelama. Program myisamchk
možete pokrenuti sa opcijama -q -r za brzo popravljanje, kao u sledećem primeru:
+---------------------+-------+----------+----------+
l Table l Op Msg_type Msg_text l l l
myisamchk -q -r tabela
+---------------------+-------+----------+----------+ Ako je rezultat neuspešan, napravite rezervnu kopiju datoteke s podacima a zatim
l employee.department l check l status l OK
pokušajte potpuno obnavljanje tabele:
+---------------------+-------+----------+----------+
l row in set (0.00 sec) myisamchk -r tabela
Može se pojaviti i poruka Table is already up to date, koja takođe znači da je Ako i to bude bezuspešno, pokušajte opciju --s af e- recover, koja ispravlja neke
sve u redu. greške koje opcija -r ne može da ispravi:
Ako se pojavi bilo kakva drugačija poruka, to znači da imate problem pa pokušajte myisamchk --safe-recover tabela
da popravite tabel u. To možete učiniti pomoću komande REPAIR TABLE (ako je u
Program myisamchk ima veliki broj mogućih opcija, koje ćete videti ako na
pitanju MyiSAM tabela) na sledeći način:
komandnoj liniji otkucate myisamchk bez parametara.
repair table tl;
Ako se postupak popravljanja završi uspešno (ili ako popravljanje zapravo nije ni Proveravanje i popravljanje tabela pomoću alatke mysqlcheck
bilo poptrebno), trebalo bi da dobijete rezultat nalik na sledeći: Program mysqlcheck može se upotrebiti za proveravanje i popravljanje MyiSAM
+---------+--------+----------+----------+ i InnoDB tabela, kao i za popravljanje MyiSAM tabela dok se server koristi.
l Table l Op Msg_type Msg_text
l l l Da biste pomoću alatke mysqlcheck proverili tabele baze podataka, pokrenite je
+- --------+--------+----------+----------+ kao u sledećem primeru:
test.tl l repair l status l OK
mysqlcheck -u imekorisnika -p employee
l -- ------+--------+----------+----------+
l row in set (0.03 sec) Iza ovih parametara možete navesti imena tabela koje želite da proverite, ali ako
Ako se pojavi poruka drugačija od OK, komanda REPAIR nije delovala i morate da ništa ne zada te, biće proverene sve tabele u bazi podataka (što je korisna odlika). Ako
upotrebite moćniju alatku myisamchk. se sve završi bez grešaka, trebalo bi da dobijete rezultate nalik na sledeće:
employee.assignment OK
Proveravanje i popravljanje tabela pomoću alatke myisamchk employee.client OK
U ovom poglavlju razmotrićemo samo alatku myisamchk a zanemarićemo alatku employee.department OK
employee.employee OK
isamchk. Ako još radite sa ISAM tabelama, predlažemo da ih pretvorite u My ISAM employee.employeeSkills OK
tabele (videti poglavlje 9",Tipovi tabela u MySQL-u").
8 Poglavlje 14 Izrada rezervn1n KOpija 1 ounaviJčHIJt: flUUCILCIII.d
U ~II::Ut:l:t:m poglaVlJU l'
Opcijom --databases možete zadati listu baza podataka koje treba proveriti, 2. Trebalo bi da ručno zaključate tabele pre nego što
a opcija --all-databases čini da se proveravaju sve baze podataka na serveru. a) započnete ručnu izradu rezervne kopije
Programu mysqlcheck možete zadati opciju -r da bi popravio sve oštećene
b) pokrenete skript mysqldump
MyiSAM tabele na koje iđe.
e) pokrenete skript mysqlhotcopy t' J
d) nijedno od prethodnog
Sažetak 3. Koji se tipovi tabela mogu proveravati pomoću komande CHECK
TABLE?
a) InnoDB i MyiSAM
Izrada rezervnih kopija
b) samo MyiSAM
• mysqldump pravi datoteku slike stanja koja sadrži SQL komande.
e) MyiSAM i BDB
• mysqlhotcopy kopira datoteke baze podataka u odredišni direktorijum.
d) InnoDB i BDB
• BACKUP TABLE kopira datoteku tabele u odredišni direktorijum.
4. Koji se tipovi tabela mogu popravljati pomoću komande REPAIR TABLE?
• Rezervne kopije možete napraviti i ručno, tako što zaključate tabele, ispraznite
a) InnoDB i MyiSAM
njihove bafere a zatim napravite kopije datoteka baze podataka.
b) samo MyiSAM
Restauriranje podataka e) MyiSAM i BDB
• Izvršite komande iz datoteke slike stanja napravljene pomoću skripta mysqldump. d) InnoDB i BDB
• Vratite kopije datoteka koje ste napravili pomoću skripta mysqlhotcopy ili 5. Ako je rezultat komande CHECK TABLE poruka Table is already up
to date
ručno. a) morate upotrebiti komandu REPAIR TABLE
• Pomoću komande RESTORE TABLE obnovite stanje iz datoteke koju ste napravili b) komanda CHECK TABLE ne podržava mašinu baze podataka
komandom BACKUP TABLE. e) tabela je dobra
• Ponovo izvršite sve operacije evidentirane u dnevniku izmena nakon izrade d) nijedno od prethodnog
poslednje rezervne kopije.
Imajte u vidu da dva reda mogu sadržati različite lozinke. To može biti uzrok velike redove u tabeli user. Tamo će naći kombinacije laura®% i (anonymous) ®localhost.
zabune. (Primer takve situacije pogledaćemo u odeljku "Brisanje anonimnih naloga", Budući da MySQL daje prvenstvo redovima koji sadrže konkretna imena računara,
u nastavku ovog poglavlja.) uzima red (anonymous) ®localhost. Kao što vidite, iako je laura navela svoje kori-
Drugi korak se odvija kada pokušate da izvršite određene upite ili komande. Pre sničko ime, u ovom slučaju ono ne služi ničemu! Za anonimne naloge nije potrebno
izvršenja svakog upita, MySQL proverava u tabelama prava da li je vam dozvoljeno zadati korisničko ime. Anonimni nalog verovatno ima drugačiju lozinku od naloga
izvršavanje upita koji ste poslali. korisnika laura (anonimni nalozi standardno nemaju lozinke, tj. korisnik koji se tako
Ako je za upit koji pokušavate da izvršite potrebno globalno pravo - npr. kao za prijavljuje ne mora da zada lozinku).To znači da će laura, kada pokuša da se pod svo-
komande LOAD DATA INF ILE ili SHOW PROCESSLIST - ispituje se tabela user. Pri izvr- jim korisničkim imenom i lozinkom prijavi s računara localhost, dobiti poruku
Šavanju upita u određenoj bazi podataka, najpre se ispituje tabela user. Kad korisnik Access Denied (pristup nije dozvoljen) bez očiglednog razloga.
ima pravo pristupa u sve baze podataka na serveru, to pravo je dovoljno. Ako nema to Najbolji način da izbegnete tu vrstu problema jeste da izbrišete anonimne naloge
pravo, ispituju se tabele db i host. Ako korisnik nema prava ni na tom nivou, na kraju i zaboravite da oni uopšte postoje.
se utvrđuje da li možda ima pravo pristupanja određenim tabelama i kolonama.
Opasna prava
MySQL ima veoma detaljan sistem prava korisnika, što je opisano u poglavlju ll.
Zaštita korisničkih naloga Morate vrlo pažljivo razmotriti kome ćete dodeliti neka od tih prava. Budite veoma
Postoji nekoliko opštih bezbednosnih principa koji važe i za upravljanje korisničkim oprezni s pravima FILE, PROCESS i WITH GRANT OPTION.
nalozima na MySQL serveru. Razmotrićemo ih u narednom odeljku. Pravo FILE omogućava korisnicima da izdaju komandu LOAD DATA INF ILE. Ta
komanda može se zloupotrebi ti za menjanje sadržaja datoteka na serveru (kao što je
Zadavanje lozinke za korisnički nalog Root datoteka za lozinke, /etc/passwd) ili čak za menjanje datoteka baza podataka, čime se
Kada završite instaliranje MySQL-a, korisnik root nema lozinku. Obavezno zadajte zaobilazi sistem prava pristupa.
lozinku za tog korisnika pre nego što počnete da koristite MySQL za bilo šta drugo Pravo PROCESS omogućava korisnicima da izdaju komandu SHOW PROCESSLIST.
osim isključivo za eksperimentisanje. Dok ne zadate lozinku za korisnika root, svako Tako u svakom trenutku mogu videti koji se sve upiti izvršavaju, što im omogućava da
se može prijaviti na vaš server i raditi s vašim podacima šta god požcli.To gotovo nikad dođu do poverljivih podataka o drugim korisnicima.
nije prihvatljiva situacija. Ako još niste zadali lozinku, učinite to odmah. Pravo WITH GRANT OPTION omogućava korisnicima da svoja prava dodeljuju dru-
gim korisnicima. Ako znate kakve mogu biti posledice tog prava, možete ga oprezno
Brisanje anonimnih naloga dodeljivati drugima.
Kada MySQL instalirate na Windows, on automatski pravi nekoliko naloga. Na
Linuxu se to obavlja kada pokrenete skript mysql_install_db. Dva od tih naloga su Šifrovanje lozinki
anonimna, odnosno predstavljaju nalog koji vam se dodeljuje kada ne zadate svoje MySQL čuva lozinke korisnika u šifrovano m obliku. Pre verzije 4.1, mogli ste pri pri-
korisničko ime. Ime jednog naloga je localhost a drugo je %(predstavlja bilo koji javljivanju na server da zadate i šifrovani oblik lozinke.To je sada ispravljeno i ugrađena
računar, što omogućava uspostavljanje veza sa udaljenih računara). Ti nalozi stan- je jača zaštita lozinki i mehanizma prijavljivanja.
dardno nemaju lozinke. Ako pišete aplikaciju koja skladišti imena i lozinke svojih korisnika (ne korisnika
Verovatno ste već shvatili zbog čega, ali ipak izričito preporučujemo da izbrišete te MySQL-a), nemojte ih šifrovati pomoću funkcije PASSWORD ().Umesto nje, prepo-
naloge. To možete uraditi na sledeći način: ručujemo funkciju MDS () ili ENCRYPT ().Te funkcije su detaljnije objašnjene u pogla-
delete from user where User=''; vlju 8",Upotreba MySQL-ovih ugrađenih funkcija u komandi SELECT".
delete from db where User='';
Nakon ovih komandi treba da izdate i komandu FLUSH PRIVILEGES da biste ispra-
Zaštita instaliranih datoteka
znili tabele prava. Osim zaštite MySQL-ovih korisničkih naloga, morate kontrolisati i pristup MySQL-
Drugi razlog za brisanje tih naloga jeste to što mogu izazvati zbrku kada regularan
-ovim binarnim datotekama, skriptovima i datotekama s podacima. Navešćemo neko
korisnik pokuša da uspostavi vezu sa serverom. Primera radi, recimo da ste napravili
liko preporuka koje možete primeniti na svoj sistem.
nalog čije je ime laura i koji sme da se prijavljuje s bilo kojeg računara(%); kada
1 ura pokuša da se prijavi s računara localhost, MySQL server traži odgovarajuće
Drugi savet l :ICI
Poglavlje 15 Zaštita MySQL servera
U sledeće m poglavlju
U poglavlju16",Replikovanje baze podataka", saznaćete kako se dva servera ba~a .
podataka mogu podesiti da rade sa istim podacima. Time se raspoređuje opterecenJe,
povećava robusnost sistema i olakšava izrada rezervnih kopija podataka.
16
Replikovanj e baze podataka
•
Principi replikovanja
Replikovanje se može odvijati u više oblika. U MySQL se koristi usmerena veza glavni-
-zavisni server.Jedan od servera je glavni (engl. master).Jedan ili više servera tretiraju sc
kao zavisni (engl. slaves) od određenog glavnog servera. Glavni server određuje koji sc
podaci čuvaju u sistemu, dok zavisni serveri pokušavaju da preslikaju njegov sadrž,j.
IV
Postupak replikovanja oslanja se na sadržaj dnevnika izmena na glavnom serveru. Ako su vam zaista neophodne dve verzije MySQL-a u istom sistemu, na sJede ć oj
U tom dnevniku čuvaju se podaci o svakom upitu koji je bio izvršen na serveru od adresi naći ćete dokumentaciju s matricom verzija glavnih i zavisnih servera koje
po četka beleženja u dnevnik. Zavisnim serverima se šalju upiti iz dnevnika izmena mogu raditi zajedno:
glavnog servera a oni ih primenjuju na svoje podatke. www.mysql.com/doc/en/Replication_Implementation.html
Sve operacije upisivanja podataka uglavnom se odvijaju direktno na glavnom serveru,
dok se operacije čitanja raspodeljuju između zavisnih servera, ili čak između glavnog
i zavisnih servera. To se postiže najčešće ugradnjom odgovarajuće logike u aplikacije.
Podešavanje sistema za replikovanje
Važno je imati u vidu da kada počnete da replikujete bazu podataka koja već sadrži U većini sistema u kojima se primenjuje replikovanje koristi se više računara pove-
podatke, dnevnik izmena možda neće biti potpun. Budući da beleženje izmena u dnev- zanih u jednu internu mrežu. Ako imate račun are povezane putem javnog Interneta,
nik standardno nije uključeno, podaci koje ste uneli u sistem možda nisu zabeleženi u pažljivo razmotrite bezbednosne mere. Za početak, obavezno proverite da li je TCP
dnevniku izmena. Kada započnete replikovanje, svi zavisni serveri moraju sadržati pot- priključak koji ste odredili za MySQL dostupan kroz zaštitni zid svim računarima koji
puno iste podatke kao glavni server na početku beleženja u dnevnik izmena.Ovu temu treba da komuniciraju sa serverom (podrazumevani broj TCP priključka za MySQL
ra zmotrićemo detaljnije u nastavku poglavlja.
server je 3306) .
Pošto zavisne servere napunite usklađenim podacima i pokrenete ih, oni usposta- Pod pretpostavkom da na svojim računarima imate noviju verziju MySQL-a i
vljaju veze s glavnim serverom i na svoje podatke primenjuju izmene zabeležene u jednu ili više baza podataka koje želite da replikujete, naredni koraci su obavezni da
dnevniku izmena glavnog servera. Jedna nit izvršenja na zavisnom serveru uspostavlja • biste napravili sistem s jednim glavnim serverom i jednim ili više zavisnih servera.
vezu s glavnim serverom i ispituje da li ima novih izmena. Te izmene se smeštaju u
prenosni dnevnik (engl. relay log) na zavisnom serveru. Druga nit izvršenja na zavisnom Napravite korisnički nalog koji ćete upotrebljavati samo pri replikovanju
serveru čita izmene iz prenosnog dnevnika i primenjuje ih na lokalnu kopiju podataka. Umesto da za sve što radite koristite nalog root, preporučujemo da za poslove repE-
Budući da glavni i zavisni serveri mogu biti dostupni u različita vremena (npr. zato
kovanja napravite korisničke naloge koji će imati samo prava neophodna za te poslove,
što se u sistem mogu dodati novi serveri baš u trenutku izvršavanja upita, ili zato što je kađ Što smo napomenuli u poglavlju 1, "Instaliranje MySQL-a" . Dakle, potreban vam
mreža postala zagušena, ili je čak prestala da radi), neophodno je da zavisni serveri beleže je poseban nalog na glavnom serveru, namenjen isključivo poslovima replikovanja.
dokle su stigli sa unošenjem izmena.Važno je da se sve transakcije 'izvrše u celini i da se Ako nameravate da početno stanje zavisnih servera generišete pomoću komandi
LOAD TABLE FROM MASTER ili LOAD DATA FROM MASTER, korisničkom nalogu za
izmene primenjuju pravilnim redosledom. U većini aplikacija, ako se garantuje da baza
podataka uvek prelazi iz jednog usklađenog stanja u drugo, manje je važna činjenica da replikovanje potrebna su specijalna prava. Naredna komanda GRANT (koju izdate na
će se ponekad učitati podaci zastareli nekoliko sekundi ili minuta.
glavnom serveru) pravi korisnički nalog s pravima koja su potrebna alatkama za
Ako razmatrate primenu replikovanja, morate shvatiti šta se tačno događa. Ažuriranje uspostavljanje početnih veza između servera:
podataka odvija se asinhrono, a ne u realnom vremenu. Pošto ažurirate podatke u bazi grant replication slave, reload, super, select
na glavnom serveru, upiti poslati različitim zavisnim serverima nakon toga mogu izvesno on logs.*
to replication®"%" identified by 'password';
vreme davati različite rezultate. To se može smatrati nedostatkom, ali prednost je u tome
Što će zavisni server koji radi na prenosivom računaru ili u nepouzdanoj mreži, sasvim (U ovom primeru koristi se baza podataka logs. Izmenite komandu tako da odgo-
lepo raditi u intervalu između dva ažuriranja s glavnog servera. vara imenu vaše baze podataka i, razume se, obavezno odaberite bezbedniju lozinku .)
Pošto završite kopiranje početnih podataka s glavnog servera na zavisni server,
Napomena o verzijama MySOL-a korisničkom nalogu za replikovanje više neće biti potrebna tako velika ovlašćenja. Ako
l ~c plikovanje je prvi put ugrađeno u jednu od novijih verzija MySQL-a (3 .23 .15), što zavisne servere punite iz rezervne kopije ili nameravate da smanjite ovlašćenja kori-
z n ači da se ta mogućnost još uvek razvija gotovo sa svakom novom izdatom verzijom. sničkog naloga za replikovanje nakon završetka početnog kopiranja, tom nalogu je
Ako nameravate da koristite replikovanje, dobro je da na svim računarima koji u tome dovoljno samo pravo replikovanja. Naredni upit pravi korisnički nalog čije je ime
u čes tvuju instalirate ažurnu i istu verziju MySQL-a. replication i koji ima pravo da uspostavlja vezu s glavnim serverom sa svakog zavisnog
Mogu će su određene kombinacije verzija MySQL-a između glavnog i zavisnih servera (kao i sa svakog drugog računara):
servera, ali pošto time samo uvodite određen stepen nepouzdanosti, najbolje je da to grant replication slave on logs.* to replication®"%" identifi e d by
izbe gavate ako je ikako moguće. Primera radi, možete naići na problem da se funkcij e, 'password' ;
kao što j e PASSWORD (),razlikuju između dve verzije MySQL- a s kojima pokušavate da
radit e.
rUyli:tVIJC l0 nC~III\UVdiiJC UdLC tJUUdldl'\.đ
Podešavanje sistema za replikovanjr
' l .it
Sintaksa komande GRANT opisana je u poglavlju 11 ",Upravljanje pravima korisnika". Za My ISAM tabele, kopiju tekućeg stanja svakog zavisnog servera možete napraviti
Pravo replication slave (zavisni server pri replikovanju) uvedeno je u MySQL 4.0.2 nakon njegovog pokretanja. Pogledajte odeljak "Pokretanje zavisnih servera", u
upravo za tu namenu. U starijim verzijama MySQL-a koristite pravo file. nastavku ovog poglavlja. Međutim, ova metoda nije posebno efikasna, naročito kad
Navedena komanda omogućava samo pristup bazi podataka logs. Ako želite da doz- imate veliku količinu podataka i veliki broj zavisnih servera. Komanda LOAD DATA FROM
volite replikovanje svih baza podataka na serveru, u komandi zamenite logs. * sa * . *. MASTER izdata sa svakog zavisnog servera zaključaće podatke na glavnom serveru do
završetka kopiranja. Baze podataka će biti zaključane znatno kraće vreme ako kopiju
Proverite da li je glavni server podešen za replikovanje tekućeg stanja napravite ručno pomoću komandi operativnog sistema. To vam takođe
Na glavnom serveru mora biti uključeno beleženje izmena u dnevnik. Ako ste pročitali omogućava da istom kopijom tekućeg stanja glavnog servera inicijalizujete koliko god
uputstva za instaliranje MySQL-a iz ove knjige, verovatno st.e već uključili dnevnik . vam zavisnih servera treba, čime skraćuj ete interval u kojem je server zaključan.
izmena jer on služi i za druge svrhe osim replikovanja. Da b1ste provenli da li Je uklju- Za InnoDB tabele ne možete izdati komandu LOAD DATA FROM MASTER. Kopiju
čeno beleženje izmena u dnevnik, možete izdati komandu SHOW VARIABLES. Dovoljno stanja morate napraviti ručno pomoću komandi operativnog sistema ili nabavite
softver i opremu koji omogućavaju izradu kopije podataka dok se server koristi .
je da zadate
Ako kopiju tekućeg stanja servera pravite ručno, pomoću komandi operativnog
show variables;
sistema, morate se uveriti da su podaci međusobno usklađeni i ažurni, tako što ćete
da biste prikazali vrednosti svih serverskih promenljivih, ali za skraćeni rezultat zadajte izdati sledeću komandu:
sledeće :
• flush tables with read lock;
show variables like "log_bin";
Time ćete zaključati tabel u i sprečiti upisivanje izme na dok je ne oslobodite.
Ako je beleženje izmena u dnevnik isključeno, dodajte opciju log-bin u datoteku Ime tekuće datoteke dnevnika i pomak od njenog početka možete dobiti pomoću
opcija, kako je prikazano u listingu 1.1. Ime datoteke opcija biće my. ini ili my. cnf, sledeće komande:
u zavisnosti od konvencije operativnog sistema koju ste primenili.
show master status;
U datoteci my . ini/my. cnf zadajte glavnom serverujedinstven identifikator. Trebalo
bi da vaša datoteka opcija sadrži barem sledeće redove: Trebalo bi da dobijete rezultate nalik na sledeće:
Tabela employee koju koristimo u celoj knjizi (kao i većina tabela koje autori kori- U ovom primeru, reč server je ime računara na kojem radi glavni server. Reč
ste u svojim projektima) tipa je InnoDB.Ako imate (komercijalni) softver za kopiranje replicationje korisničko ime naloga koji ste napravili za poslove replikovanja.
InnoDB tabela dok se koriste, onje savršen za ovu namenu. Može se nabaviti od firme Umesto reči password upište lozinku tog naloga. Zadajte i ime datoteke dnevnika
izmena (parametar master_log_file) i pomak (parametar master_log_pos).
Innobase Oy na adresi
Komanda START SLAVE pokreće na zavisnom serveru nit koja obavlja replikovanjc,
www.innodb.com/hotbackup.html usled čega zavisni server pokušava da uspostavi vezu sa glavnim serverom i preuzme
Ako nemate takvu alatku, najbolje rešenje je da ispraznite bafere baze podataka i da 1zmene.
ispraznite njene tabele pomoću narednih komandi. Prvo zadajte komandu Ako ste napravili kopiju tekućeg stanja pomoću komandi operativnog sistema, tre-
flush tables with read lock; balo bi da pokrenete izvršavanje upita koji ispituju razlike između glavnog servera i
a zatim prikažite i zapišite podatke o datoteci dnevnika izmena i pomaku u njoj (na isti zavisnih servera, da biste se uverili da se replikovanje odvija kako treba. Napravite
malu izme nu na glavnom serveru, a zatim p rover ite da li je zavisni server i preuzimaju .
način kao za MyiSAM tabele):
Ako replikujete relativno male My ISAM tabele, možete ih napraviti i popuniti
show master status; podacima pomoću komande nalik na sledeću:
Bazu podataka isključite iz upotrebe a da je ne oslobodite, a sadržaj direktorij uma
load table logs.logJan2003 from master;
u kojem se nalaze tabele te ~aze podataka kopirajte u MySQL-ov direktorijum data.
Ako imate InnoDB tabele, morate kopirati datoteke s podacima i datoteke dnevnika. • kada želite da kopirate samo jednu tabel u, ili
Kada završite kopiranje, možete ponovo pokrenuti bazu podataka i osloboditi njene load data from master;
tabele. da biste kopirali sve tabele na zavisni server.
Kada postupak replikovanja počne da se normalno odvija, više neće biti zgodno da
Podesite zavisne servere ručno izdajete komande za podešavanje replikovanja, čak ako zbog toga retko ponovo
Svakom serveru treba jedinstven identifikator. U datoteci opcija (my . cnf/my. ini) pokrećete server. Iste podatke koje biste zadali pomoću tih komandi možete uneti u
dodajte red nalik na sledeći: datoteku opcija, uz malo drugačiju sintaksu.
server-id=2 Datoteka my. ini ili my. cnf na zavisnom serveru može sadržati nešto nalik na sledeći:
Identifikator mora biti celobrojna pozitivna vrednost, ali dok ne zadate dva jednaka, [mysqld]
potpuno je nevažno koje ćete vrednosti izabrati. Ako ćete imati veći broj servera, niz server-id = 2
master-host server
rastućih vrednosti je najverovatnije najbolji način da identifikatori imaju jedinstvene
master-user replication
vrednosti. master-password password
Ukoliko koristite kopije koje ste ručno napravili u sistemu datoteka, morate kopi- replicate-do-db = logs
rati datoteke na odgovarajuća mesta na zavisnom server u. Ako radite s više različitih
operativnih sistema, vodite računa o razlikovanju malih i velikih slova.
Nakon ažuriranja datoteke opcija ili kopiranja InnoDB datoteka na zavisni server, Složenije topologije
Najčešća pr imena replikovanja jeste raspoređivanje opterećenja (engl. load balancing)
morate ga ponovo pokrenuti.
u sistemu u kojem se obavlja veliki broj operacija čitanja podataka a relativno mali broj
operacija upisivanja podataka. Mnogi sistemi s replikovanjem sastoje se od jednog
Pokretanje zavisnih servera
Da biste pokrenuli zavisni server podešen kako je opisano u prethodnim odeljcima, glavnog servera i manjeg broja zavisnih servera, ali postoje i slučajevi u kojima je
opravdana upotreba složenijih konfiguracija.
treba da izdate sledeće komande:
Ako predviđate da ćete imati veći broj zavisnih servera ili su vaši računari razmešteni
change master to master_host='server',
master_user='replication', na većem broju različitih geografskih lokacija, može biti pogodno rešenje u obliku
master_password='password', hijerarhijskog sistema u kojem jedan server igra ulogu glavnog servera za određen broj
master_log_file='server-bin.000007', zavisnih servera. Jedan ili više tih zavisnih servera igraju ulogu glavnog servera za drugu
master_log_pos=211; grupu zavisnih servera. Na slici 16.1 prikazanje jedan glavni server (računar broj l) koji
start slave; je gl:wni ?:a ra č unarc od 2 do 6. Neki od tih zavisnih servera igraju ulogu glavnih
servl't .1 :t.t dru~\.' grupe zavisnih servera .
216 Poglavlje 16 Rep likovanje baze podataka
Pitanja
Raspored kao na slici smanjuje opterećenje glavnog servera na najvišem nivou i U .datoteci opcija P?stoji nekoliko parametara koji se tiču replikovanja ali zasad
smanjuje obim saobraćaja na mrežnim vezama koje vode ka tom računaru. U zavisno- • nemaJumkakvog UtiCaJa. To su opcije za podešavanje SSL veza između glavnog servera
sti od odnosa između broja operacija čitanja i upisivanja podataka u vašoj aplikaciji, I zav1smh se~.era . Ukoliko podatke replikujete putem javne mreže, postupak će tako
tako možete obezbediti dobru skalabilnost bez prevelike složenosti sistema. biti bezbed~IJI. Ako vam tre~aju zaštićene veze, zasad je jedino rešenje da nabavite
Prilično jednostavno možete formirati sistem s proizvoljnim brojem zavisnih ser- odgovaraJUCI proiZvod, kao sto je Stunnel.
vera i možda čak više glavnih servera, pod uslovom da je svaki računar glavni server
u jednoj vezi i zavisni server u drugoj vezi. Ako pri projektovanju aplikacija vodite Sažetak
računa da će ponekad na određenom serveru nedostajati najnovije izmene, ceo sistem
možete tretirati otprilike kao da je u pitanju samo jedan server baze podataka. • Repl~kovanje nije pogodno za. sve situacije, ali ako imate opterećenu aplikaciju s
Stvari počinju da se komplikuju kada imate cirkularne veze u kojima više servera V~SOkJm vodnosom ,Između broja operacija Čitanja j upisivanja podataka, to može
primaju komande za ažuriranje podataka a izmene se prosleđuju u više smerova. b1t1 odhcna mogucnost da obezbedite skalabilnost aplikacije.
Najjednostavnija cirkularna veza sastoji se od dva računara koji se ponašaju i kao glavni • Imajte u vidu da se izmene ne izvršavaju na zavisnim serverima u isto vreme.
i kao zavisni server. Svaka izme na koju načinite na jednom računaru prosleđuje se dru- Svaka kopija tabele mora prelaziti iz jednog usklađenog stanja u drugo, ali učita
gom. Kada pišete aplikacije za tu vrstu sistema, morate biti veoma oprezni. vanJe podataka sa različitih servera može dati zastarele rezultate dok se zavisni
Budući da se izmene unose asinhrono, može doći do dupliranja vrednosti u poljima serveri ne ažuriraju.
tipa auto increment ili jedinstvenih identifikatora i do neusklađenih podataka. U nekim • Najkorisnije komande koje se odnose na replikovanje su START SLAVE LOAD
aplikacijama to može biti prihvatljivo. Na primer, u aplikaciji koja samo evidentira TABLE imetabele FROM MASTER,LOAD DATA FROM MASTER,SHOW MAS~ER STA-
podatke i u kojoj imate manji broj jednostavnih veza između tabela, a zahteva se veliki TUS, SHOW SLAVE STATUS i SHOW SLAVE HOSTS.
protok podataka i raspoloživost za upotrebu, možda ćete prihvatiti da tome žrtvujete
usklađenost podataka.
Pitanja
l. Na MySQL serveru replikovanje se može upotrebiti za
B udućnost replikovanja a) punjenje podacima razvojnog servera koji će služiti za bezbedno testiranje
Imajući u vidu sve što je rečeno, moramo napomenuti da su u pitanju relativno nove novih programa na stvarnim podacima
mogućnosti, koje nisu do kraja "izbrušene". Kao što ste videli, postupak inicijalizovanja
b) poboljšavanje performansi
novog zavisnog servera kopijom stanja glavnog servera nije baš najpraktičniji. Nije uskla-
đen ni način na koji se radi s MyiSAM tabelama i InnoDB tabelama. Tekuće mogućnosti
e) postupak izrade rezervnih kopija podataka koji manje ometa korisnike
n:plikovanja u MySQL-u nisu baš najrobusnije. Ugrađene su u standardnu distribuciju d) poboljšavanje stepena raspoloživosti sistema
(za razliku od većine komercijalnih baza podataka) i redovno se upotrebljavaju u okru- e) sve prethodno navedeno
1cnjima gde sc obraduju velike količine podataka.Verovatno ćete čuti da su među kori
Sllltim.l kompanije kao što su Slashdot,Yahoo! i Googlc.
218 Poglavlje 16 Replikovanje baze podataka
2. Datoteka dnevnika
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
VI
3. Operacije čitanja i upisivanja podataka obično se odvijaju
a) čitanje na zavisnim serverima, upisivanje na zavisnim serverima Optimizovanje MySQL-a
b) čita~e na zavisnim serverima, upisivanje na glavnim serverima
e) čitanje na glavnim serverima, upisivanje na zavisnim serverima
d) čitanje na glavnim serverima, upisivanje na glavnim serverima
e) nijedno od prethodnih
17 Optimizovanje MySQL servera
4. Replikovanje MySQL-ovih podataka znači da
a) su podaci uvek ažurni 18 Optimizovanje baze podataka
•
b) serveri moraju biti povezani preko pouzdane mreže, a ako jedan od servera 19 Optimizovanje upita
postane nedostupan, drugi moraju da čekaju dok se on ponovo priključi
e) izmene podataka su brze, ali je potrebno izvesno vreme dok se one presli-
kaju na sve zavisne servere
d) izmene podataka se mogu unositi na bilo kom serveru i prosleđuju se glav-
nom serveru, a zatim svim ostalim zavisnim serverima
Odgovori
Pitanja
l. e
2. b
3. b
4. e
17
Optimizovanje MySQL servera
•
u OVOM POGLAVLJU RAZMOTRIĆEMO NEKOLIKO MOGUĆNOSTIubrzavanja
MySQL servera. Podešavanje servera je opsežna tema i ima izvesnih sličnosti sa ezote-
ričnom umetnošću. Naša namera je da vam u ovom poglavlju predstavim o osnove
podešavanja servera. Obradićemo sledeće teme:
• Prevođenje i povezivanje koda radi veće brzine rada
• Podešavanje parametara servera
• Podešavanje drugih činilaca
kod MySQL-a prevedete pomoću prevodioca pgcc, koji optimizuje rezultujući kod Datoteka opcija my.cnf sadrži toliko veliki broj opcija da ćete se možda pitati
samo za procesor Pentium. (Tako dobijena izvršna datoteka nije kompatibilna sa odakle da počnete. Uz većinu verzija MySQL-a dobijate i prime re datoteka my. en t ,
AMD-ovim procesorima, zato je binarna verzija koju preuzimate s MySQL-ove Web koje se obično nalaze u direktorijumu support-files instalacije. U tom direktorijumu
lokacije prevedena pomoću prevodioca gcc.) Autor MySQL-a, firma AB, tvrdi da ser- naći ćete sledeća četiri predloga za datoteku my. cnf: my-huge. cnf, my-large. cnf,
ver možete ubrzati od 10% do 30% ako sami prevedete kod pomoću odgovarajućeg my-medium. cnf i my- small. cnf. Izaberite jednu od njih kao početnu datoteku op cijn
prevodioca i pravilno podešenih opcija- više informacija o tome naći ćete u MySQL- za svoj sistem.
-ovoj dokumentaciji. Najvažniji parametri koje treba da podesite jesu oni koji određuju kako MySQL
Drugo poboljšanje u poređenju s MySQL-ovom gotovom izvršnom datotekom troši memoriju. Za svaki server baza podataka važi pravilo "što više memorije, to
jeste da prevedete MySQL s podrškom samo za skup (ili skupove) znakova koji name- bolje", ali je važno i da ta memorija bude na raspolaganju serveru baze podataka i da
ravate da koristite. U binarne datoteke koje preuzimate s Web lokacije ugrađena je se pravilno raspodeljuje između njegovih procesa.
podrška za sve postojeće skupove znakova. (Više informacija o skupovima znakova MySQL održava grupu internih bafera i ostava. Možete podesiti količinu memorije
naći ćete u poglavlju 12",Podešavanje MySQL-a" .) koja se odvaja za tu namenu. Dva najvažnija parametra koja treba da podesite su
MySQL-ova dokumentacija sadrži predloge o optimizovanju binarnih datoteka key_buffer_size i table_cache. Pošto te bafere dele sve niti koje rade na serveru,
koje korisnici sami prevode za razne operativne sisteme. Osim toga, u diskusionim njihovo podešavanje ima veoma veliki uticaj na performanse servera.
grupama na Internetu posvećenim MySQL-u možete naći mišljenja i savete u vezi .. U baferu nazvanom bafer za ključeve (engl. key buffer) čuvaju se blokovi MyiSAM
s mnogim problemima specifičnim za određene operativne sisteme i prevodioce koda. indeksa. Kada aplikacija zatraži određeni blok iz datoteke indeksa, on se učitava u taj
Arhive se nalaze na adresi bafer. Kad god se izvršava neki upit, ako se odgovarajuću blok indeksa nalazi u baferu,
http://lists.mysql.com podaci se učitavaju iz njega. U suprotnom, blok indeksa mora da se učita iz datoteke
na disku u bafer za ključeve, što je, razume se, sporije. Za bafer ključeva važi pravilo da
Ukoliko želite da se pridružite diskusijama o prevodiocima, potražite forum na adresi
što je veći, to bolje služi svojoj svrsi.
www.lukelaura.com Kada razmatrate vrednost koju ćete dodeliti parametru key_bu ff er_ s i ze, treba da
uzmete u obzir ukupnu količinu memorije s kojom raspolažete, da li se računar koristi
isključivo kao MySQL server ili služi i za druge poslove, a važna je i veličina datoteka
Podešavanje parametara servera
indeksa (tj. ukupna veličina .MYI datoteka).Jeremy Zawodny, poznati stručnjak koji
Da biste optimizovali svoju konfiguraciju, pokušajte da podesite parametre MySQL
održava servere kompanije Yahoo!, preporučuje da na računaru koji radi isključivo kao
servera.
MySQL server,parametru key_buffer_size dodelite vrednost u opsegu između 20% i
Podsećanja radi, tekuće vrednosti parametara servera prikazaćete na sledeći način:
50% ukupne količine memorije na računaru . Ako je u pitanju deljen računar, jasno je da
show variables;
vrednost tog parametra treba da bude manja. Ukoliko podaci vaših indeksa zauzimaju
Uticaj tekućih vrednosti parametara na konfiguraciju servera videćete pomoću sle- samo 20 MB, bilo bi besmisleno da veličinu bafera za ključeve podesite na 128 MB.
deće komande: Imajte u vidu i to da se bafer za ključeve koristi isključivo za MyiSAM tabele. Za
show status; druge tipove tabela postoje drugi parametri koje treba podesiti. Nema svrhe da znatno
povećate bafer za ključeve ako, na primer, radite isključivo sa InnoDB tabelama. U
Druga korisna alatka koja omogućava da vidite šta se događa na serveru jeste Perl
skript mytop, čiji je autor Jeremy Zawodny. tom slučaju važniji je parametar innodb_buffer_pool_size. U baferima za InnoDB
čuvaju se i podaci indeksa i podaci tabela. (Više informacija o podešavanju za rad sa
Ta alatka deluje kao ekvivalent Unixove komande top i prikazuje aktivne procese,
~ta nje procesa, trajanje itd. Osim toga, ta alatka omogućava da prikažete detalje
InnoDB tabelama naći ćete u poglavlju 12 i u MySQL-ovoj dokumentaciji.)
MySQL-ovog procesa i vidite koji se upit izvršava. Drugi zaista važan parametar je ostava za tabele (engl. table cache) kojom se upravlja
pomoću opcije table_cache.Vrednost te opcije određuje maksimalan broj tabela koje
Skript možete preuzeti sa adrese
mogu biti otvorene u isto vreme. Kod My ISAM tabela, svaka tabela i svaki indeks su
http://jeremy.zawodny.com/mysql/mytop
zasebne datoteke u operativnom sistemu. Budući da je otvaranje i zatvaranje dato tc b
Sve navedene alatke omogućavaju da evidentirate izmene koje ste uneli i učinke spora operacija, te datoteke ostaju otvorene dok ne budu izričito zatvorene, server spu
koj e one imaju na sistem. šten, ili dok ukupan broj otvorenih tabela ne premaši vrednost parametra table_cache.
Poglavlje 17 Optimizovanje MySQL servera
Povećanje vrednosti parametra table_cache korisno je kada na serveru imate veliki • Performanse ćete poboljšati ako sami prevedete izvorni kod MySQI ,, 11 11 1 illi
broj tabela. Budući da vaš operativni sistem ograničava ukupan broj otvorenih datoteka datoteku, naročito ako imate računar koji radi pod Linuxom ili ima JlllH l'''"
u isto vreme, ili ukupan broj datoteka koje jedan proces ili korisnik može držati otvo- Pentium.
rene u isto vreme, utvrdite tu vrednost u svom operativnom sistemu pre nego što izme- • Podesite parametre servera za bolje performanse, naročito one koje sc odnosa·
nite vrednost parametra table_ cache. na potrošnju memorije. Velika količina fizičke memorije na računaru uvek Jt'
Osim tih globalnih memorijskih bafera, pojedinim nitima se takođe dodeljuju korisna, ali je važnije kako se ona raspodeljuje. Evo nekoliko posebno va žn ih
određeni blokovi memorije- kao što su, na primer, bafer za sortiranje (engl. sort buffer) parametara:
i br.ifer za čitanje (engl. read bulfer).Veličina tih b afera je jednaka za svaku nit, ali svaka nit • key_buffer_size: Količina memorije koja će biti odvojena za skladištenje
može koristiti tu količinu memorije za drugu namenu . MyiSAM indeksa.
U bafer za čitanje, čija se veličina određuje parametrom read_buffer_size, sme- • table_cache: Ukupan broj tabela koje mogu biti otvorene u isto vreme.
štaju se podaci iz tabele kada se njen sadržaj čita sekvencijalnim redosledom (engl. table
• read_buffer_size: Količina memorije koja se koristi pri sekvencijalnom
sca11). Što se više podataka iz tabele može smestiti u bafer, to će biti manji broj opera-
čitanju tabela.
cija čitanja sa diska; međutim, ako je vrednost tog parametra previsoka, grupa bafera
za čitanje koje niti koriste može potrošiti previše memorije. Možda se sećate da se u • sort_buffer: Količina memorije koja se koristi za skladištenje podataka iz
ranijim verzijama ovaj parametar zvao bafer za zapise (engl. record buffer) a veličinu muje .. tabela kada se pomoću odredbe ORDER BY zahteva sortiranje podataka.
određivao parametar record_buffer. • Poboljšajte hardver ugradnjom dodatne memorije, RAID grupe diskova, upo-
Bafer za sortiranje, čiju veličinu određuje parametar sort_buffer, koristi se pri trebom žurnalskog sistema datoteka i brze mreže između klijenata i servera, te
izvršavanju upita koji sadrže odredbu ORDER BY, tj. služi za sortiranje podataka. Ako između glavnih i zavisnih servera.
sorti rate velike količine podataka, povećajte bafer za sortiranje, ali i za njega važi isto
upozorenje kao i za bafer za zapise. Pitanja
l. Parametar koji određuje koliko će memorije biti odvojeno za skladištenje
Podešavanje drugih činilaca indeksa Inn oD B tabela je
Na kraju, još nekoliko saveta koji vam mogu pomoći pri podešavanju fizičke konfigu- a) key_buffer_size
racije sistema. b) innodb_buffer_pool_size
Što se operativnog sistema tiče, MySQL preporučuje Solaris kada želite da izvučete
e) innodb_key_buffer_size
maksimum od računara s više procesora. Iako postoje verzije MySQL-a za razne ope-
d) read_buffer_size
rativne sisteme, razvoj i početno testiranje obavljaju se na Solarisu, zahvaljujući čemu
bi to po logici stvari trebalo da bude najbolje optimizovana platforma. 2. Parametar koji određuje koliko će memorije biti odvojeno za keširanje podataka
Ukoliko možete da nabavite više diskova, poboljšaćete performanse ako baze poda- Inn oD B tabela je
taka rasporedite na različite fizičke diskove. U tom slučaju možete koristiti i RAID a) key_buffer_size
konfiguracije - RAID O poboljšava performanse pri čitanju i pisanju, a RAID l ili 5 b) innodb_buffer_pool_size
poboljšavaju performanse pri čitanju. Osim toga, SCSI diskovi obezbeđuju bolje per- e) innodb_key_buffer_size
foJillanse od IDE diskova. d) read buffer size
Možete razmotriti i upotrebu žurnalskog sistema datoteka (engl.journalingjile
3. Parametar koji određuje koliko će memorije biti odvojeno za keširanje podataka
1ystc'111), kao što je Reiserfs ili XFS. Tako možete još više poboljšati performanse.
My ISAM tabela je
Rnume se, značajan boljitak može se postići povezivanjem klijenata i servera preko
bt7C mreže, što takođe važi i za glavne i zavisne servere u replikovanju.
a) key_buffer_size
b) table cache
e) innodb_key_buffer_size
Sažetak d) read_buffer_size
Budući da je tema optimizovanja MySQL-a toliko opsežna da zaslužuje zasebnu
kii_JI~ll, obavcwo nastavite s prikupljanjem informacija i istraživanjem te oblasti.
u Poglavlje 17 Optimizovanje MySOL servera
• Dodeljujem prava pojedinačno za tabele i kolone tabela. Ako prava dodeljujete pojedi- lnd~ksiranje u cilju optimizovanja
načno za tabele ili kolone bilo kog resursa, kad god korisnik pošalje upit na izvrša- Uk~hko .ste pratili gr:divo i vežbe iz ove knjige, trebalo bi da imate bazu pod.lt.lka kn 1,1
vanje, MySQL mora da utvrđuje koja su sve prava za tabele i kolone tabela zadata. ~adrz1 pnmarne kljuceve. To znači da imate barem po jedan indeks za svaku tnbdll
~~r MySQL automatski pravi indekse za kolone koje deklarišete kao PRIMARY KEY
• Struktura baze podataka nije optimalna. Postoje načini da se struktura baze podataka
1h UNIQUE. ,
projektuje tako da se upiti brže izvršavaju.
~o pokušavat.e da optimizujete postojeću bazu podataka, korisno je ispitati da Ji ll'
U naredna dva odeljka razmotrićemo strukture baze podataka i indekse koji omo- u nJ. OJ vdefimsan bilo kakav mdeks. Izostavljanje indeksa je česta greška pri projekta o
gućavaju ubrzavanje rada s bazom podataka. vanJU. seme baze podataka. SQL-ova komanda DESCRIBE prikazuje koji sve indeksi
postoje za određenu tabelu.
Pravilni izbori pri projektovanju baze podataka Dakle, šta je indeks i čemu služi?
Indeks je sličan referentnoj tabeli po tome što omogućava da se brzo pronađe odrc-
Postoji više pravilnih izbora koji, ako ih napravite pri projektovanju baze podataka,
đe.m red ~ tabel1. Ako napravite indeks za kolonu X, pronalaženje tražene vrednosti u
doprinose poboljšanju njenih performansi. To su sledeći:
tOj ..kolo~l zna.tno je brže pomoću indeksa. Indeks pokazuje gde se u tabeli nalazi red
• Uvek upotrebite najmanji tip podataka koji je dovoljan za podatke s kojima ćete kOJI sadrz1 tr~ze~u vredn~st, što omogućava da se direktno pređe na taj red.
raditi. Na primer, ako u koloni tabele čuvate samo brojeve od 1 do 10, nemojte
zadati tip INT, već tip TINYINT. Što su kraći redovi i manje tabele, to će se one
.. . Ako tabeh mJe pndruzen nijedan indeks, MySQL mora da pretražuje jedan po
Jedan red tabele dok ne pronađe redove koje ste zahtevali. Zamislite da morate da
brže pretraživati. Što su podaci manji, više se redova može keširati u memoriju. pronađe:e određe~u ten~u. u ovoj knjizi tako što ćete početi od prve stranice i čitati
• Koristite zapise fiksne dužine gde god je moguće. Ako su svi redovi tabele jed- svaku ree na sv~kOJ stran1e1. ~na tn o je brže da u indeksu knjige potražite temu koja vas
nake dužine, MySQL brže pristupa redovima u sredini tabele. Da bi tabela imala zamma 1 da zat1m pređete direktno na stranicu koja vam treba.
redove fiksne dužine, tipovi podataka u svim kolonama moraju biti fiksne dužine. U MySQL-u se po.daci indeksa čuvaju u obliku b-stabala (binarna stabla); to su
To znači da ne sme biti kolona tipa VARCHAR, TEXT, niti BLOB. strukture podataka koje se vrlo brzo pretražuju.
Ako vam je neophodan tip TEXT i BLOB, možda biste mogli da denormalizujete . I~dek~i mogu o?~hvatati je~nu kolonu ili više njih (isto kao ključevi tabela). Pri
šemu tabele tako da polja tipa TEXT ili BLOB izdvojite u zasebnu tabelu. IzvrsavanJU up1ta, b1ce upotrebljen mdeks ukoliko se pretražuje jedno od sledećih:
Ukoliko imate isključivo kolone tipa VARCHAR, razmislite o tome da ih zamenite • Kolona kojoj _je pri~ružen jednokolonski indeks- na primer, ako je u tabeli
kolonama tipa CHAR. To je kompromis,jer podaci tipa CHAR zauzimaju više mesta ~epartments mdekmana kolona departmentiD i treba izvršiti upit sličan slede-
na disku, što je u suprotnosti s prvom preporukom na ovoj listi. cem: SELECT .. . WHERE departmentiD=n.
• Gde god je moguće, deklarišite kolone kao NOT NULL. Ako je priroda vaših • Grupa kolon~ za koju postoji zajednički indeks - na primer, ako za tabelu
podataka takva da su vrednosti NULL sasvim logične i prihvatljive, slobodno ih emplo~ee.ass1gnment postoji indeks za kolone (client ID, employeeiD work-
koristite. Međutim, imajte u vidu da zbog toga gubite malo brzine i prostora, date) 1 treba izvršiti upit sličan sledećem: SELECT .. . WHERE client ID=~ AND
pa zato zadajte odredbu NOT NULL gde god je moguće. employeeiD=y AND workdate=z .
• Birajte tip tabela za svaku tabel u pojedinačno. Tabele koje ne podržavaju transak- • Ko.lon~ ili grupa kolo.na koja je deo višekolonskog indeksa, pod uslovom da je to
cije (na primer, My ISAM) manje opterećuju sistem i zato su brže od tabela koje levz kr~J grupe. mdeks1ramh kolona - na primer, ako za pomenutu tabelu assign-
podržavaju transakcije (InnoDB i BDB). MySQL podržava mešanje više tipova ment Imamo mdeks za kolone (clientiD, employeeiD, workdate) on će biti
tabela u istoj bazi podataka. Izaberite najbrži tip koji je pogodan za određeni upotrebljen u upitima sledeće vrste: '
posao. (Više informacija o pojedinim tipovima tabela naći ćete u poglavlju 9, SELECT ... WHERE clientiD=x
SELECT ... WHERE clientiD=x AND employeeiD=y
"Tipovi tabela u MySQL-u" .)
• Izaberite odgovarajuće indekse. Ovu temu obradićemo detaljno u narednom Ali ne i u upitima nalik na sledeći:
SELECT ... WHERE employeeiD=y AND workdate=z
odeljku.
• U težim slučajevima, razmislite o denormalizovanju tabela da biste smanjili broj Suština cele .~riče je u sledećem: ako predviđate da će se izvršavati veliki broj upita
spojeva koji se uspostavljaju u uobičajenim upitima. Budući da će zbog toga vaša ~ad kolonama 1h grupama kolona koje ne ispunjavaju navedene uslove, trebalo bi da
baza podataka postati noćna mora za održavanje, to se najčešće ne preporučuje. Izdate komandu CREATE INDEX da biste napravili odgovarajući indeks. Imajte u vidu
- r .. · · ··· - - · - ··.J- ---- 1 ---~-H-
Pitanja
da MySQL može da koristi samo po jedan indeks po tabeli u upitu. Nije moguće
automatsko kombinovanje više indeksa.
Pitanja
Ovo pitanje ćemo detaljnije razmotriti u poglavlju 19",0ptimizovanje upita", 1. Koja je od sledećih tvrdnji o indeksima tačna?
kada budemo došli do komande EXPLAIN. a) Indeksi zauzimaju previše prostora na disku i zato ih ne treba koristiti.
b) Ako tabeli nije pridružen nijedan indeks, upit se može izvršavati sporije.
Komanda ANALYZE TABLE e) Trebalo bi da indeksirate što veći broj kolona.
Izdajte komandu ANALYZE TABLE da biste prikazali i snimili raspored ključeva u tabeli. d) Nijedna od prethodnih.
MySQL čuva te podatke i koristi ih pri donošenju odluke o tome kako će spojiti 2. Kada birate tipove podataka za kolone tabele
tabele u upitu. Komanda se izdaje na sledeći način a) trebalo bi da koristite iste tipove u celoj bazi podataka jer tako ona postaje
analyze table imetabele; efikasnija
b) trebalo bi da koristite tipove podataka promenljive dužine gde god je
Komanda OPTIMIZE TABLE moguće jer se tako optimizuje upotreba prostora na disku
N a kraju, moramo pomenuti komandu OPTIMIZE TABLE . Njena vrlo jednostavna e) trebalo bi da koristite tipove podataka fiksne dužine gde god je moguće da
sintaksa izgleda ovako: biste ubrzali pristup podacima
OPTIMIZE TABLE imetabele;
d) nijedno od prethodnog
3. Kada birate tip tabela
To je MySQL-ov ekvivalent komande za defragmentiranje Čvrstog diska. Tokom
upotrebe baze podataka, u datotekama u kojima se čuvaju podaci raste broj praznina a) uvek birajte InnoDB ili BDB zato što podržavaju transakcije
između blokova podataka na mestima gde su ranije bili izbrisani zapisi ili odakle su b) uvek birajte MyiSAM zato što su najbrže
zapisi premešteni zato što su nakon ažuriranja postali veći. Te praznine su uzrok slabije e) koristite mešavinu tipova, u zavisnosti od svrhe tabele
efikasnosti. d) nijedno od prethodnog
Trebalo bi da povremeno upotrebite komandu OPTIMIZE TABLE ukoliko ste izbri- 4. Indeks neće biti upotrebljen ako se u upitu
sali veće količine podataka, ili ako ste dodali, izbrisali ili ažurirali veći broj redova pro-
a) koristi levi kraj grupe indeksiranih kolona
menljive dužine. Tako ćete preurediti podatke u datotekama, ponovo sortirati indekse
i ažurirati statističke podatke o tabeli. b) koriste sve kolone indeksa po redosledu različitom od njihovog redosleda
u indeksu
U vreme pisanja knjige, ova komanda je delovala samo na MyiSAM i BDB tabele.
e) koriste sve kolone indeksa po redosledu jednakom njihovom redosledu
u indeksu
Sažetak d) koristi desni kraj grupe indeksiranih kolona
• Strukturu baze podataka možete optimizovati tako što ćete odabrati tipove poda- 5. Upotrebite komandu OPTIMIZE TABLE
taka manje veličine i fiksne dužine, definisati odgovarajuće indekse i koristiti
a) čim definišete tabelu, da biste poboljšali njenu strukturu
odgovarajuće tipove tabela.
b) kada koristite InnoDB tabele, da biste smanjili opterećenje sistema
• Indeksi omogućavaju brzo pronalaženje zapisa traženih na osnovu vrednosti u
indeksiranim kolonama. e) nakon izvršavanja većeg broja komandi SELECT nad tabelom
• Indeks će biti upotrebljen u upitu kada se u njemu referencira indeksirana kolona d) nakon izvršavanja većeg broja komandi DELETE nad tabelom
ili kolone, ili levi kraj grupe indeksiranih kolona.
• Komanda OPTIMIZE TABLE imetabele obavlja za tabele operaciju sličnu defrag-
mentiranju čvrstog diska.
- .~ ... ~~· --·-··,J ----- 1"" __ _ ...........
Vežbe
U kojem će od sledećih upita u bazi podataka employee biti upotrebljeni indeksi?
(Potražite u poglavlju 4, "Pravljenje baza podataka, tabela i indeksa", tačnu strukturu
baze podataka. Ili, ako ste je instalirali na svoj računar, pogledajte pomoću komande
describe koje su sve kolone indeksirane.)
..
19
a)
select *
from employee
Optimizovanje upita
where departmentiD=128;
b)
select employeeiD
from assignment
where clientiD=l;
e)
select skill, count(skill)
M YSQL OMOGUĆAVA DA ANALIZIRATE upit da biste saznali za koje se vreme
from employeeSkills
izvrši i kako se tačno izvršava nad sadržajem baze podataka. Na osnovu tih podataka
group by skill; i poznavanja načina na koji MySQL pokušava da optimizuje upite, ponekad možete
da poboljšate performanse upita. U ovom poglavlju razmotrićemo sledeće teme:
Ako ovi upiti treba da se često izvršavaju, koje biste dodatne indekse napravili?
• Otkrivanje sporih upita
• Merenje performansi upita
Odgovori • Upotreba dnevnika sporih upita
• Upotreba komande EXPLAIN za prikazivanje načina na koji se upiti izvršavaju
Pitanja
• MySQL-ov ugrađeni mehanizam za optimizovanje upita
l. b
2. e • Saveti o optimizovanju upita
3. e
4. b Otkrivanje sporih upita
S. d Da biste optimizovali određenu aplikaciju, morate najpre utvrditi koji njeni delovi imaju
najveći udeo u ukupnom vremenu izvršavanja. To možete obaviti na nekoliko načina:
Vežbe • Posmatranjem: Često zaključujemo daje neophodno optimizovanje zbog toga što
[ndeks se koristi samo u upitu pod tačkom b). se određeni upit izvršava brzinom premorenog puža.
Trebalo bi indeksirati kolone employee . department ID i employeeSkills. skill. • Merenjem: Testirajte aplikaciju da biste saznali koji se njeni delovi sporije
izvršavaju.
U sledećem poglavlju • Uvidom u dnevnik sporih upita: U ovaj dnevnik beleže se spori upiti, kao što biste
U s ledećem (i poslednjem) poglavlju, "Optimizovanje upita", razmotrićemo kako i očekivali na osnovu njegovog imena.
možete utvrditi da li se određeni upit izvršava brzo ili sporo, i zbog čega, kao i to kako Pošto identifikujete spori upit, pomoću komande EXPLAIN možete saznati kako ga
rešiti problem. MySQL tačno izvršava da biste zatim pokušali da ga optimizujete.
Najčešće nije potrebno da ubrzate baš sve upite koji se koriste u aplikaciji . Obično
samo manji deo koda oduzima najveći deo ukupnog vremena izvršavanja. Ukoliko
vaš sistem nije izuzetno opterećen, besmisleno je da gubite vreme pokušavajući da
ubrzate delove aplikacije čiji je udeo u ukupnom vremenu relativno mali.
upotreoa komande EXPLAIN za prikazivanje načina na koji sc upili l1vr .!Valu
Beleženje sporih upita u dnevnik možete uključiti pomoću opcije --log- slow
Merenje performansi upita -queries=imedatoteke, koju zadate kada pokrećete MySQL, ili u datoteci opcija.
Merenje performansi (engl. benchmarking) korisno je za rešavanje svih vrsta problen:a
Ako uključite i opciju --log-long-format, biće evidentirani i svi upiti pri čijem sc
optimizovanja. Merenje performansi u ovom slučaju znači merenje vremena za koje
izvršavanju ne koristi nijedan indeks. To vam može pomoći da lakše utvrdite čemu
se upit izvrši. Najbolje je da upit izvršite više puta i da zatim izračunate prosečno
treba da f>osvetite najviše pažnje pri optimizovanju.
vreme njegovog izvršavanja. Budući da trajanje jednog izvršavanja upita zavisi od
Zadavanjem vrednosti promenljivoj long_query_time određujete šta je za vas
ukupnog opterećenja sistema, samo jedno merenje može dati neočekivane rezultate.
spor upit. Možete je zadati u konfiguracionoj datoteci ili pomoću komande SET.
Otkrićete i to da bi upit trebalo da se brže izvrši kada ga pokrenete drugi put jer je
Vrednost te promenljive izražava se u sekundama.
smešten u ostavu (keš).
Dnevnik sporih upita možete čitati neposredno jer je to obična tekstualna datoteka.
Razume se, možete koristiti spoljne skriptove ili programe posebno napisane tako
Možda ćete smatrati korisnijim sažet spisak upita koji se sporo izvršavaju. Takav spisak
da isti upit izvršavaju više puta. Ako vas zanima primer takvog programa, preuzmite
možete prikazati pomoću skripta mysqldumpslow (u direktorijumu scripts instalacije
distribuciju MySQL-a sa izvornim kodom i potražite programe za merenje perfor-
MySQL-a). Pošto je to skript napisan na jeziku Perl, ako koristite Windows, morate
mansi u direktorijumu sql-bench.
prethodno instalirati Perl ukoliko gaj oš nemate. (Preuzmite ga sa adrese www. active-
U MySQL-u možete meriti brzinu izračunavanja vrednosti bilo kojeg izraza
state. com.)
(uključujući i upita) pomoću ugrađene funkcije BENCHMARK(). Na primer:
Jedno od tekućih ograničenja MySQL-ajeste to da ne beleži spore upite čije
select benchmark(lOOOOOO, 6*9); izvršavanje traje manje od sekunde. Na sistemima koji obrađuju relativno veliki broj
Ova komanda daje rezultate nalik na sledeće: jednostavnih upita, jedna sekunda "traje" veoma, veoma dugo. Administrator će
+-------------------------+ možda želeti da zna kojim je upitima potrebno više od desetinke ili nekog drugog dela
l benchmark (1000000, 6*9) l sekunde. To će biti obezbeđeno u jednoj od budućih verzija MySQL-a.
+-------- -----------------+
o l
+-------------------------+ Upotreba komande EXPLAIN za prikazivanje načina
row in set sec)
1 (0.25
na koji se upiti izvršavaju
Funkcija prihvata dva parametra: koliko puta treba izračunati vrednost izraza Komanda EXPLAIN nalaže MySQL-u da "objasni" kako namerava da izvrši upit. Kao
(u ovom primeru, milion puta) i izraz koji se izračunava (u ovom primeru, šest puta jednostavan primer, možete zadati sledeće:
deve0. .. explain
Budući da nas pri merenju performansi ne zanima rezultat upita SELECT, funkclJa
select e.name, d.name
BENCHMARK () uvek vraća rezultat nula. Pri merenju nas zaista zanima za koje vreme se from employee e, department d
upit izvršio. Iz navedenog primera rezultata vidi se daje izračunavanje proizvoda 6 x 9 where e.departmentiD = d .departmentiD;
milion puta na mom računaru trajalo četvrtinu sekunde. Kao što vidite, ispred jednog sasvim običnog upita samo smo dodali re č EXPLAIN.
Funkciji BENCHMARK () možete proslediti i tekst upita, na primer: Zbog toga se upit neće izvršiti,jedino će se prikazati podaci o tome kako MySQL pla-
selec t benchmark(lOOOOOOO, nira da izvrši upit. Trebalo bi da se prikažu rezultati nalik na sledeće:
'select employee.name, department.name ... --- +·------------ +-- ---- -+------- -+--------------- +-------- -+-------- -+--------------- -+------ +------ -+
from employee, department 1 id 1 select_type 1 table l type l possible_keys l key l key_len l ref l rows l Extra l
where employee.departmentiD=department.departmentiD'); +---- +------------- +------- +------- -+-------------- -+--- ----- -+- -------- +--------------- -+------ +------ -+
l l l SIMPLE l e l ALL l NULL l NULL l NULL l NULL l 5 l l
l 1 l SIMPLE l d l eq_ref l PRI MARY l PRIMARY l 4 l e. department ID l l l l
+--- -+------ ------ -·------ -+--- ---- -+-------------- -+-------- -+--------- +--------------- -+----- -+------ -+
2 rows in set (O. OO sec)
Upotreba dnevnika sporih upita . v • •
Šta sve ovo tačno znači? Uočljivo je da se u skupu rezultata pojavljuje po jedan red
Pomoću dnevnika sporih upita možete utvrditi koji se upiti presporo IzvrsavaJU. S~nu za svaku tabel u u upitu. Redosled redova je jednak redosledu kojim će tabele biti spo
ddinišete šta je "sporo", ali taj parametar morate izraziti u sekundama, kao celobroJnU jene u upitu.
vrednost.
•••y-'u'--uv uyraaen1 mehamzam optimizovanja upita
Tabela rezultata ima sledeće kolone: Ovo su ostale vrednosti koje se mogu pojaviti u koloni type:
• id Redni broj. Ako jedan upit sadrži više komand1 !.J EI .EC" I' - 11,1 JliiiiH:I, bd.1 • ref Iz tabele će biti učitani svi redovi koji sadrže vrednosti jednake vredno-
je u upit ugrađen podupit- svaka komanda SELECT dobtj.l SV<~J rL·dni broj . stima u indeksu. To je prva slabija opcija od eq_ref i predstavlja situaciju u kojoj
• select type Vrsta komande SELECT koja se izvršava. U ve ć ini s lu čajeva, ova radite s ključevima čije vrednosti nisu jedinstvene .
kolona ~adržaće reč SIMPLE, kao u prethodnom primeru, što zna či daje u pitanju • range Ovaj tip spoja je slabiji od tipa eq_ref , pa ča k i od ref, a znači da će iz
sasvim običan upit SELECT. Ako imate podupite, spoljni upit će biti označen tabele biti učitani svi redovi iz odredenog opsega.
rečju PRIMARY a unutrašnji upiti biće označeni rečima SUBSELECT ili DEPENDENT • index Ovo je bolje od tipa ALL, ali slabije od svih dosad navedenih tipova spo-
SUBSELECT u slučaju koreliranih upita. jeva. Kada se prikaže tip index, to znači da će biti pretražen ceo indeks. To je
• table Ime tabele na koju se red odnosi. bolje od pretraživanja cele tabele, ali daleko je od savršenog.
• type Ovo je najvažnija kolona pri optimizovanju i prikazuje na koji će način Pogledajmo vrednosti u kolonama possible_keys i key. Za tabelu department
tabela biti spojena s drugim tabelama u upitu. prikazana je opcija PRI MARY i ime kolone primarnog ključa, što je kolona ključa koja
• possible_keys Ova kolona pokazuje koji bi se indeksi mogli upotrebiti u će biti upotrebljena. Red tabele employee sadrži vrednost NULL u obe navedene
upitu. Ako nema nijednog upotrebljivog indeksa, u ovoj koloni prikazuje se reč kolone, što znači da nema ključa koji se može upotrebiti i zato neće biti upotrebljen
NULL. nijedan. To je još jedna prilično jasna naznaka da tabeli treba dodati nov indeks!
• key Ova kolona pokazuje koji je indeks izabran za upit. Ako nije izabran nije- Na osnovu tih podataka i pod pretpostavkom da će taj upit biti relativno često
dan, u koloni se prikazuje reč NULL. izvršavan, pa bismo zbog toga želeli da bude brži, napravićemo sledeći indeks:
• key len Dužina indeksa koji je MySQL odlučio da upotrebi. create index ename_did on employee(name, departmentiD);
• ref Vrednost s kojom se poredi sadržaj kolone ključa pri odlučivanju koji se Ako ponovo izdamo komandu EXPLAIN, rezultati izgledaju ovako:
redovi izdvajaju u skup rezultata upita. +--- -+--- --------- -+------ -+---- ---- +-------------- -+---------- -+- ------- -+--- ------------ -+----- -·-------- ---- -·
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
• rows Pro cena broja redova koje će MySQL morati da pročita iz jedne tabele da +--- -·--- ---------- +----- --+-- -- --- -·----- --------- -+-- -------- -+-------- - +------- ------- --+----- -+----- ------- -+
l l l SIMPLE l e l index l NULL l ename_did l 85 1 NULL 1 S l Using index l
bi se dobio rezultat upita. Množenjem vrednosti broja redova možete utvrditi l l l SIMPLE l d l eq_ref l PRIMARY l PRIMARY l 4 l e.departmentiD l l l l
+---- +---- -------- -+--- --- -+--- ---- -+---- ------- -- --+- ----- ---- -+------ -- -+--------------- -+- ---- -+----- ------- -+
koliko će redova biti učitano. Time dobijate red veličine brzine izvršavanja upita. 2 rows in set (0. OO sec)
• Extra Ova kolona može sadržati dodatne podatke. Na primer, komentar Promene su očigledne. U redu tabele employee sada stoji daje tip spoja index jer
using index zači da MySQL može u potpunosti učitati rezultate upita iz jednog postoji indeks koji se može upotrebiti. Novi indeks je naveden kao moguć ključ , ali
neće biti upotrebljen. U koloni Extra stoji da će za tu tabelu biti upotrebljen indeks
od indeksa i nema potrebe da učitava podatke iz tabele.
umesto same tabele, zahvaljujući čemu bi trebalo da upit bude nešto brži.
Dakle, šta nam rezultati govore u ovom primeru? Najčešća upotreba komande EXPLAIN jeste za utvrđivanje da li biste pomoću bolje
Tip spoja ALL za tabelu employee znači da će biti pretraženi svi redovi te tabele. osmišljenih indeksa mogli da ubrzate upite, ali otkrićete da se to može postići i na
Razume se, to će biti spora operacija ako tabela sadrži veliku količinu podataka. U druge načine.
stvari, spoj tipa ALL je najgori mogući rezultat. Njega ćete dobiti kad god tabela nema
nijedan indeks koji bi se mogao upotrebiti u upitu. Očigledna optimizac4ija u tom slu-
čaju jeste da dodate odgovarajući indeks. To je objašnjeno u nastavku ovog poglavlja. MySOL-ov ugrađeni mehanizam optimizovanja upita
U redu koji se odnosi na tabelu department stoji daje spoj tipa eq_ref, što znači da MySQL prim.enjuje na upite više pravila optimizovanja.
će se iz tabele department učitati po jedan red za svaki red iz tabele employee. To je Na osnovu procenjenog broja redova (koji prikazuje komanda EXPLAIN), MySQL
jedan od najboljih tipova spojeva. Jedine bolje vrednosti u koloni type _su system i utvrđuje koji bi bio najbolji redosled spajanja tabela. Ako smatrate da je njegova pro-
cons t, što znači da u tabeli postoji samo jedan red koji odgovara uslov1ma up1ta l da cena pogrešna, odredbom STRAIGHT JOIN izričito zadajte redosled spajanja tabela.
sc zato ta tabela može tretirati u upitu kao konstanta. Tekući tip spoja u upitu prilično Merenjem performansi upita pre i posle te izmene, utvrdićete da li time stvari pobolj
nam odgovara. šavate ili pogoršavate.
Kada bira indeks, MySQL traži odgovarajući indeks koji obuhvata manje od 30"/u
redova tabele. Ako ne uspe da pronađe indeks koji ispunjava te uslove, sekvenCIJalno
pretražuje tabelu. (To je vidljivo iz rezultata komande EXPLAIN za prethodni pttiiH"I
upita, nakon dodavanja novog indeksa.)
18 Poglavlje 19 Optimizovanje upita
Izrazi u odredbama WHERE optimizuju se na način sličan onome na koji mnogi pre- Pitanja
vodioci programskih jezika optimizuju izraze. Na primer, iz izraza se uklanjaju suvišne
1. funkcija BENCHMARK () vraća
zagrade. To je jedan od razloga zbog kojih možete slobodno dodavati zagrade u tekst
upita da bi postao lakše razumljiv. a) rezultat izraza čije izvršav;liiJL' llll'JII• ·
Ako se potpun rezultat upita može dobiti iz podataka sadržanih u indeksima, iz b) vreme potrebno za izvršavanJL' lllollol ~"JI 1111 JilL
tabela se neće u čitati nijedan red. Rezultat funkcije COUNT ( *} takođe se dobija bez e) nulu, bez obzira na ulazne JW .IIIH'IIl'
čitanja i prebrojavanja redova tabele jer su podaci potrebni za tu namenu smešteni d) nijedno od prethodnog
odvojeno od tabele (u indeksu).
2. Izda·li· ste k?mandu EXPLAIN za odredeni up1t 1 11 ~ 11 10111 1 YI' 1, ,j 11 , 1 1 d orl
Budući da se u MySQL-ovoj dokumentaciji nalazi detaljan spisak svih optimizacija dob1h ste t1p spoja ALL. To znači
111 1
koje MySQL obavlja, ovde ga nismo ponovili. Ali čak i taj spisak nije potpun. Ako vas
a) da će iz tabele biti učitan samo jedan IL'd
zanima kako radi optirnizator upita, možete čitati njegov izvorni kod.
b) d~ će ~z tabele biti učitani svi redovi koji sadrže vredu osti JL'd. 111 kt· VH·dnn
st1ma mdeksa
Preporuke za optimizovanje upita e) da će biti sekvencijalno pretražen ceo indeks
Postoje tri najvažnije stvari koje možete uraditi da biste optimizovali svoje upite: d) da će biti sekvencijalno pretražena cela tabela
• Dodajte odgovarajuće indekse. Ako imate upit nad neindeksiranom kolo- 3. Izd~i ste k?man~u EXPLAIN za određeni upit i u koloni type jedne od tabela
nom koji se često izvršava, dodajte indeks za tu kolonu. Više informacija o tome dob1h ste t1p spoja eq ref. To znači
kako MySQL koristi indekse naći ćete u poglavlju 18, "Optimizovanje baze a) da će iz tabele biti u čitan samo jedan red
podataka". Međutim, ne zaboravite sledeće: iako odgovarajući indeks može
ubrzati postupak pronalaženja podataka u tabeli, održavanje indeksa u ažurnom b) d~ Će ~z tabele biti u čitani svi redovi koji sadrže vrednosti jedanke vredno-
stlma mdeksa
stanju produžuje upisivanje podataka. Nemojte dodavati indekse koji se neće
koristiti. e) da će biti sekvencijalno pretražen ceo indeks
• Povremeno izdajte komandu ANALYZE TABLE. (Njena sintaksa je opisana d) da Će biti sekvencijalno pretražena cela tabela
u poglavlju 18.) Time ažurirate podatke o raspodeli vrednosti ključeva koje 4. Izda.li ste k?mandu EXPLAIN za određeni upit i u koloni type jedne od tabela
MySQL čuva. Na osnovu tih podataka, MySQL određuje redosled spajanja dob1h ste t1p spoja index. To znači
tabela u upitu. Ako vam se čini da MySQL spaja tabele čudnim redosledom, a) da će iz tabele biti učitan samo jedan red
pokušajte s komandom ANALYZE TABLE. b) da će ~z tabele biti učitani svi redovi koji sadrže vrednosti jedanke vredno-
• Povremeno izdajte komandu OPTIMIZE TABLE. (Njena sintaksa je opisana u Stlma mdeksa
poglavlju 18.) Time defragmentirate podatke u tabeli, sortirate indekse i ažuri- e) da će biti sekvencijalno pretražen ceo indeks
rate statističke podatke o tabeli koje koristi optimizator upita. d) da će biti sekvencijalno pretražena cela tabela
S. ~ezultati komande EXPLAIN pokazuju da MySQL spaja dve tabele neoptimal-
Sažetak mm redosledom. Zbog toga bi trebalo da
• Otkrijte spore upite pomoću funkcije BENCHMARK (} ili dnevnika sporih upita. a) izdate komandu ANALYZE TABLE za obe tabele
• Pomoću komande EXPLAIN utvrdite kako se upiti izvršavaju b) izričito zadate redosled spajanja pomoću odredbe STRAIGHT JOIN
• Ubrzajte izvršavanje upita dodavanjem indeksa a zatim ih ponovo ispitajte e) ili a) ili b)
pomoću komande EXPLAIN. d) ni a) ni b)
• Komande ANALYZE TABLE i OPTIMIZE TABLE pomoći Će MySQL-ovom optimi-
zatoru upita da dobro obavi svoj posao.
240 Poglavlje 19 Optimizovanje upita
tabele indeksa, 56 datumski tipovi podataka, 54 E lower(), 114 grupnt• luni. t ll•, l J l l
ALTER TABLE, 56 redova iz tabela, 7Q-72 dayname(), funkcija, 119 MATCH,115 grupno ttOHINtlt pn1l11ltt~n,
atribwi, 31 tabele, 56 db, tabela, prava pristupa, 163 max(),122 gubljenjo• (llHiucul.,, l
Ernie Application Cluster, alatka, redunduutuw•t.sunJ• ktn ~~~J
BerkeleyDB (BDB), 50, 135 brisanje redova, komanda DDL (Data Definition Language), md5(),121
42 217 baza pothohol.u, l l
brisanje, 5 6 TRUNCATE, 72 min(), 122
Decimal, tip podataka, 52 encrypt(), funkcija, 121
fimkcioualne zavisnosti, 32 brojevi s pokretnim zarezom, 48 entiteti,definicija,29 mod(),118
gmptw r111ofenje podataka, 73-75 b-stabla, 135 DEFAULT, odredba, komanda
INSERT,69 ENUM, tip podataka, 54 now(),119
numeričke, 117-118
H
HEAP, 50, 138 EXECUTE, pravo, 159
DEFAULT, rezervisana reč, 49
indeksi, 229-230
lmwDB, 50, 134-135
e defragmentiranje MyiSAM tabele, EXISTS, rezervisana reč, 102
EXPLAIN, rezervisana reč, podaci
operatori
aritmetitki, 11 O
Hafmanovo kodirnnjt•,
komprimovanjt.• litlwl1t, l' l
130
ISAM, 50, 128-129 o izvršavanju upita, 235-237 logitki, 112 HAVING, odredba, konmnolu
CASE, funkcija, 113 DELAY KEY WRITE opcija,
ključevi, 31 extra, vrednost, komanda za poredetife vred11osti, 11 Q-112 SELECT, 87
cast, funkcija, 120 optimizovanje tabela, 51
ko/otre, 31, 52-55, 80 ceiling(), funkcija, 118 DELAYED, odredba, komanda EXPLAIN, 236 password(), 121 HEAP, tip tabela, 50, 138
komanda CREATETABLE, INSERT, 68 extract(), funkcija, 119 power(), 118 host, tabela, prava pristupa
celo brojni tipovi podataka, 52
48-52 CHAR, tip podataka, 53 DELETE, komanda, 7Q-72 quote(), 114 kolone za opseg vidljivmu, l (1 ,\
MERCE, 136-137 rand(), 118 kolone za prava, 163
merge, 50
CHECK TABLE, komanda, 196 DELETE, pravo, 159 F replace(), 114
CHECKSUM, opcija, deljenje (/),operator, 110
MylSAM, 50, 129-134 optimizovanje tabela, 51 describe, komanda, 48 RLIKE,115-117
uovi redovi, umeta11je, 65-69 ciklična promena datoteka desni spoj, 98-99
fantomski podaci, nivo round(),118 I
izolovanosti transakcija, 151
n-torke, 31 dnevnika, 183 dinamičke MyiSAM tabele,
FIELDS, odredba, komanda
soundex(), 114
podrfka za tramakcije, 127-128 column_priv, kolona 129-130 sqrt(), 118 id, opcija, komanda EXPLAIN,
LOAD DATA INFILE, 74 236
pod11piti čiji Je rezultat Jedna tabela columns_priv, 164 DISTINCT, odredba, komanda
FILE, pravo, 160,203 std(), 122
vrednost, tao-t 01 tabela tables_priv, 164 SELECT, 84-86 STRCMP,115,117 IDENTIFIED BY, odredba,
filtriranje ulaznih podataka, komanda GRANT, 158
podupiti za izraze logitkog tipa, colum.ns_priv, tabela, prava DML (Data Manipulation bezbednosne preporuke, 204 subdate(), 119
101-103 pristupa, 164 Language), 42, 65 substring(), 114 identifikatori
FLOAT, tip podataka, 53 maksimalan broj znakova, 43
podupiti za izvedme tabele, 1OO COMMENT, komanda dnevnici sum(), 122
float, tip podataka, 48 navodnici, 42
pra"", 161-164 optimizovanje tabela, 51 aktiviranje, 183 floor(), funkcija, 118 timestamp, 119
conv(), funkcija, 114 dnevnik grešaka, 183 razlikovanje malih i velikih slov:1,
prav!ietife, 44-52 FLUSH, komanda, pražnjenje trim(),114
preimeiiOIJ(Itife, 57 convert(), funkcija, 120 log-bin, opcija, podešavanje ugrađene, 109
42
ostava, 182-183
count(), funkcija, 122 MySQL-a, 172 rezervisane reči, 43
redovi, 31 FLUSH PRIVILEGES, komanda, upper(), 114
CREATE, pravo, 159 log-error, opcija, podešavanje 202-203 z.'l rad s datumima i vremen itna,
IF, funkcija, 113
redovi, azurirmife, 72-73
CREATE DATABASE, SQL-ova MySQL-a, 172 IF NOT EXISTS, odredba, 49
redovi, brismife, 7Q-72 FLUSHTABLES, komanda, 137, 119-120
komanda, 43 log-slow-queries, opcija, IGNORE, odredba
redovi, brismife pomoću koma11de 193 za rad sa znakovnim vrednostima
CREATE TABLE, SQL-ova podešavanje MySQL-a, 172 FOREIGN KEY, rezervisana reč, komanda INSERT, 69
TRUNCATE, 72 obrada zuakovuih vreduosti, 114 komanda LOAD DATA IN FILE,
komanda, 44, 48-52 opcije za dnevnike izmena, 50
redovi, drtpliralli, 84-86 CREATE TEMPORARY TABLES,
poredenje ztrakovuih vred11osti,
podešavanje MySQL-a, 173 found rows(), funkcija, 121 74
redovi, učita""tife, 83-84 pravo, 159 115-117 komanda UPDATE, 72
redovi, zameua, 70 prenosni, 21 O fragmentacija, My ISAM tabele, za upravljanje tokom izvrlavanja,
CSV format, 75 sporih upita, 183, 234-235 130 IN, rezervisana reč, 101
redovi rezulltZta upittr,gmpismy·e, curdate(), funkcija, 119 113 indeksi
86-87 u Linuxu, 183 FROM, odredba funkcije za rad s datumima
curtime() funkcija, 119 podupiti, za izvedene tabele, 100 brisanje, 56
spa)m!je, 95-99 upita, 183 i vremenima, 119-120
dnevnik izmena spojevi, 94 izrada, 55-56
stnrktura, metifmife, 56-57 funkcije za upravljanje tokom
jednokolonski, 229
zada""•ife imena u kommrdi D opis, 183 FULLTEXT rezervisana reč, 50 izvršavanja, 113
levi kraj grupe, 229
rep! ikovanje, 21 O funkcije funkcionalne zavisnosti, koncepti
SELECT, 81-82 optimizovanje baze podataka, 227,
data, direktorij um, 20 restauriranje baze podataka, abs(),118 i terminologija, 32
zapisi, 31 229-230
Data Definition Language (DDL), 194-195 addda te(), 119
zadavanje apsolutnih in1ena., optimizovanje upita, 238
42 does, direktorij um, 20 avg(), 122
81-82 G višekolonski, 229
DATA DIRECTORY, opcija, dodeljivanje prava, 157 benchmark(), 121 , 234
BCNF (Boyce-Coddova normalna INDEX, rezervisana reč, 50
forma), 38 optimizovanje tabela, 51 globalna prava, 160 CASE, 113
Data Manipulation Language prava za administratore, 159 cast, 120 glavni serveri, replikovanje, INDEX, pravo, 159
DDB (Berkeley), tip tabela, 50, 135 index, vrednost, komanda
(DML), 42, 65 prava za obične korisnike, 159 ceiling(), 118 podešavanje, 209-212, 215
benchmark(), funkcija, 121, 234 EXPLAIN, 237
datadir, opcija, podešavanje tabele prava, 161 concat(), 114 globalna prava
llcrkeleyDB (BDB), tip tabela, 50, INDEX DIRECTORY, opcija,
135 MySQL-a, 172 za pojedinačne baze podataka, 160 convert(), 114,120 dodeljivanje, 160
zaštita servera, 202 optimizovanje tabela, 51
IIIGINT, celobrojni tip podataka, DATETIME, tip podataka, 55 za pojedinačne kolone, 161 counc(), 122
Google, Web lokacija, 135 InnoDB, konfiguracione opcije,
53 datoteke za replikovanje, 211 curdate(), 119
GRANT, komanda podešavanje MySQL-a,
hin, dlrektorijum, 20 dnevnika, 183 dolar($), znak, 116 curtime(), 119
odredba IDENTIFIED BY, 158 172-173
IIINARY, rezervisana reč, 111 slike stanja, 188 DOUBLE, tip podataka, 53 dayname(), 119 lnnoDB, tip tabela, 50
hir<~ nje datoteke opcija, podešavanje drop database, komanda, 45, 56 encrypc(), 121 odredba ON,158
odredba REQUIRE, 159 dosledno učitavanje bez
b.t7C podataka, komanda use, 43 MySQL-a, 169-171 DROP INDEX, komanda, 56 extract, 11 9 zaključavanja pod1caka, 134
u č itavanje podataka iz redova internacionalizovanje, 174 DROP TABLE, komanda, 56, 191, floor(), 118 odredba TO, 158
odredba WITH, 159 transakcije, 143-146
tn bela, 83-84 konfiguracione opcije za više 194 found rows(), 121
odredba WITH GRANT ACID uskladeuost, 149-/50
DLOB, tip podataka, 54 inst.:llacija na istom računaru, DROP, pravo, 160 grupne, 121-122
173-174 druga normalna forma (2NF), OPTION,159 izolo""11ost tmn<akcij11, 150- 152
Doyce-Coddova normalna forma IF, 113
36-37 grantor, kolona, tabela tables_priv, reZi lli đlltOCOrtllllit, J47- /49
(DCNF),38 mysqld, podešavanje opcija za, last insert id(), 121
hrh<~njc dupli rani redovi, 84-86 164 uslovi licence, 135
171-172 length(), 114
.11tnn11nr11h naloga, 17, 202-203 GROUP BY, odredba, komanda Web lokacij.t, 135
opcije za InnoDB, 172-173 LIKE,115
SELECT, 86-87 zaključavanje pud.t1.t~.1 11,1 IIIVnll
h.".1 p<><b t,,ka, 56 load file, 114
grupisanje redova rezultata upita, rcd.t, 13-1
locate(), 114
86-87
Indeks hill ~
INSERT, komanda pomoću dnevnika izmena, kolone za pravo, 162 L min(), funkcija, 122 opcija --cxtcnd•·d ""'"" • l 'J l
listing, 6S-66 194-19S kolatze za uspostavlj"anje zaftićene množenje (*),operator, 110 opcija --lock- tabl,.,, l 1!2
odredbe, 68-69 razlozi, 1 87 veze, 162 mod(), funkcija, 118 opcija --no- dara, IIJ2
last insert id(), funkcija, 121
opšti oblik, 68 ručno, 193-194 učitavanje podataka iz odredenih My ISAM, tip tabela, SO opcija --opt, 188
length(), funkcija, 114
primer rezultata, 67 skript mysqldump kolona, 80 dinamičke, 129-130 opcija --quick, 191
levi spoj, 98-99
INSERT, pravo, 1S9 nedostaci, 192 znakovni i tekstualni tipovi LIKE, funkcija, 11S komprimovanje, 131 prednosti, 192
INSERT METHOD, opcija, opcija --add-drop-table, 191 podataka LIKE, odredba, 49 poboljšanja u odnosu na ISAM primer rezultata, '188 l 'J l
optirnizovanje tabela, S1 opcija --add-locks, 191 BLOB, 54 LIMIT, odredba tabele, 129 mysqlhotcopy, skript, 192· l 9.1
instaliranje MySQL-a opcija --all-databases, 192 CI-JAR, 53 komanda DELETE, 72 popravljanje, 130 mysqlshow, program, 20
anonimni nalozi, brisanje, 17 opcija --allow-keywords, 192 ENUM, 54 komanda SELECT, 88-89 pregled, 129
lozinka korisnika root, zadavanje, opcija --d, 192 SET, 54 komanda UPDATE, 72 statičke, 129-130
17 opcija --databases, 192 TEXT, 54 LINES, odredba, komanda LOAD tekstualno pretraživanje, 131-134 N
na Linux, 12 opcija --extmded-imert, 191 VARCHAR,54 DATA INFILE, 74 myisamchk, ala tka za komandnu
naOSX,14 opcija --lock-tables, 192 kolone za ograničavanje upotrebe Linux, instaliranje MySQL-a na, 12 liniju, 130 naredbe. Videti i komande
naWindows,12-14 opcija --no-data, 192 resursa, tabela user, 162 listinzi myisamchk, program, 20, 196-197 ALTER TABLE, S6
nalozi, pravljenje za uobič~ene opcija --opt, 18 8 kolone za uspostavljanje zaštićene baza podataka, formiranje tabela, MySQL DROP TABLE, 191
poslove, 17-18 opcija --quick, 191 veze, tabela user, 162 44-4S instaliranje, 9, 11 FL USH PRIVILEGES, 202· ·20.1
podešavanje sistema, 14-16 predtwsti, 192 komande. Videti i naredbe instaliranje MySQL-a, auonimtzi tuzlozi, brisanje, 17 GRANT,1S8-1S9
provera da li sistem radi, 16-17 primer rezultata, 188-191 ALTER TABLE, S7 konfiguracione opcije, lozi11ka korimika root, zadava11je, LOAD DATA INF! LE, 73-7S
instalirane datoteke, zaštita skript mysqlhotcopy, 192-193 ANALYZE TABLE, 230,238 14-16 17 LOCK TABLES, 191
filtriranje podataka, 204 tabele, proveravanje i popravljanje CHECKTABLE,196 izrada rezervnih kopija i Ila U11ux, 12 ON, komanda GRANT, 1S8
ftzička zaštita, 20S komanda CHECKTABLE, 196 COMMIT, transakcije, 147 restauriranje podataka, na OS X, 14 R.EVOK.E, ukidanje prava
preporuke, 203 kommzda REPAIR TABLE, 196 drop database, 4S, S6 skript mysqldump, 188-191 11a Windows, 12-14 pristupa, 161
pristup i prava upotrebe, 204 mogućnosti, 195 DROP INDEX, S6 MERCE tabele, 136-137 nalozi, pravlj"e11je za uobi{ajene SELECT, izraela tabela, S2
provera ulaznih podataka program myisamchk, 196-198 DROPTABLE,S6,194 podešavanje MySQL-a, rešenje s poslove, 17-18 SET, podešavanje promenljivih,
u aplikaciji, 204 program mysqlcheck, 197 EXPLAIN, 23S-237 datotekom opcija, 169-171 podefavo1zje sistema, 14-16 182
SSL (Secure Sockets Layer), 20S zaključavanje tabela, 188 FLUSHTABLES,137, 193 primer komande INSERT, 6S-66 provera da li sistem radi, 16-17 show processlist, niti, 181
internacionalizovanje, podešavanje testiranje kopije, 19S FLUSH, pražnjenje ostava, LOAD DATA INFILE, komanda, izvršive datoteke, 20--21 show variables, 180
MySQL-a,174 izvršive datoteke, MySQL-ove, 182-183 73-7S korisnički interfejsi SQL-ove
ISAM tabele, SO 20-21 LOCKTABLES,148-149,193 load file(), funkcija, 114 MySQL Control Ce11ter, 21 CREATE DATABASE, 43
ograničenja, 129 OPTIMIZE TABLE, 130, 230, locate(), funkcija, 114 MySQL mo11itor, 21-23 CREATETABLE, 44, 48-52
pregled, 128 238 LOCK TABLES, komanda, phpMyAdmi11, 21 DELETE, 7{}-72
izbori pri projektovanju,
optimizovanje baze
J REPAIR TABLE, 130,196 148-149,191,193
LOCK TABLES, pravo, 1S9
podešavanje
I111zoDB, 172-173
INSERT, 68-69
R.ESET, pražnjenje ostava, REPLACE, 70
podataka, 228 jednako (=), operator, 111 182-183 logički operatori, 112 itttemacioualizovanje1 17 4 SELECT, 8{}-89
izolovanost, nivoi (transakcije), jednakovredni spojevi, 97 SET logičko tekstualno pretraživanje, kot!figuraciol!e opcije za vife TRUNCATE, 72
1SO jednokolonski indeksi, 229 aktiviranje datoteka dnev11ika, 133-134 instalacija tUJ istom raluuant UPDATE, 72-73
1
fantomski podaci, 1S1 183 long_query_time, promenljiva 173-174 UNLOCK,191
prljavi podaci, 1S2 režim autocommit, isklj'u{ivmije, (dnevnik sporih upita), 23S mysqld, podefavo1zje opcija za, use, biranje baze podataka, 43
read committed, 1S1 K LOW PRIORITY, odredba 171-172 navodnici, identifikatori, 43
147
read uncommitted, 1S2 komanda DELETE, 72 refetzje s datotekom opcija, nebitne reči, tekstualno
kandidati za ključeve, 31 SHOW,23,180
repeatable read, 1 SO komanda INSERT, 68 169-171 pretraživanje, 132
karet (A), znak, 116 START TRANSACTION, 147
serializable, 1SO komanda LOAD DATA INFlLE, server niti, uništavanje, 182
key, vrednost, komanda UNLOCKTABLES, 148-149
izrada komprimovanje 74 pokretarzje i spuftmzje, 177-17 8 normalizovanje
baze podataka, komanda EXPLAIN, 236 komanda UPDATE, 72
concatQ, funkcija, 114 prikazivanje podataka o procesima Uoyce-Coddova normalna forma
CREATE DATABASE, 43 key_len, vrednost, komanda lower(), funkcija, 114 1