You are on page 1of 131

Pregledan uvod u MySQL-a

- sistema za rad sa bazama podataka


MySQLje sistem za upravljanje relacionim bazama podataka otvorenog
koda, popularnost brzo raste. Poznat po brzini, pouzdanosti i
upotrebe, MySQL se pokazao kao pogodan i za
i L.a iskusne programere jer izradu sofisticiranih Web lokacija
i aplikacija koje rade sa bazama podataka.
za MySQL daje jasan i saet uvod u osnovne koncepte i tehnike
upotrebe MySOL-a,. koji j e u MySOL-u da
pravi i administrirasloene baze podataka koje moe koristiti kod
na poslu ili na Webu.
Bez obzira na to da li ste u oblasti baza podataka ili iskusan
profesionalac koji eli da sazna vie o tome kako radi MySQL,
za MySOL vam efikasno pruiti sve informacije koje su vam potrebne
da biste i brzo savladali MySQL.
Luke Well ing i Laura Thomson, autori popularne knjige PHP i MySOL:
razvoj aplikacija za Web (Mikro knj iga, 2004), predaju programiranje
Web aplikacija, softverske inenjerstvo i elektronsko trgovanje, na RMIT
univerzitetu u Melburnu, Australija. Oni su i poslovni partneri u kompaniji
Tangl ed Web Design, koja je osvojila vie nagrada za svoje projekte dina-
Web lokacija na kojima se koriste PHP i MySQL.
i predaju na konferencijama o softveru otvorenog koda, kao to su MySQL
U er Conference, PHPCon, Linux Tag i O'Reilly Open Source Convention.
My
Press
Izdanja Mikro knjige
donose informacije,
prenose proverena iskustva
i pruaju potrebna znanja.
Obl .t\ 1: l\o11r pndoliolkol
<{
(.)
z
>N
....,
1 1 n/ oo
z


z-,
w

l l
za MySQ
Pregledan uvod u MySQL a
-sistema za rad sa bazama podata ko
MySQL
Rc.ccn1enL
Urednik
ltrd.lktori
urednik
Korektor
Realizacija korica
l'rclom tc Ima i obrada slika

Direktor
Dragan Tanaskoski
Olga Milanka
Aleksandra i Stela
Sanja
Vesna
Vladimir
Sanja
Milica
Mikro knjiga, Beograd
Dragan Tanaskoski
tampa Y G "J. ( Beograd
Ako imate pitanja ili komentare, ili ako elite da dobijete besplatan katalog, piite nam ili se javite:
Mikro knjiga
t:th 20-87
11030 Beograd
tel: o t l /3540-544
pismamikroknjiga . co.yu
Mikro knjiga
Jevrejska bb
78000 Banja Luka
tel: 051/220-960
pismamikroknjiga.ba
Autorizovan prevod sa engleskog jezika knjige MySQL Turorial.
Mikro knjiga
Maksimirska 13
10000 Zagreb
tel: 01/2344-023
pismamikroknjiga . hr
Copyright 2005 Mikro knjiga. Sva prava zadrana. Nije dozvoljeno da nijedan deo ove knjige bude reprodukovan
di rm i tovan na bilo koji elektronski ili fotokopiranje, snimanje ili bilo koji drugi sistem
bdccnje, bez prethodne pismene dozvole
Authorized translation from the English language edition, entitled MYSQL Thtorial, lst Edition byWELLING,
LUKE; THOMSON, LAURA, published by Pearson Education, Inc., publishing as MySQL Press, Copyright 2004.
All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or
nll'chanical, including photocopying, recording or by any information storage retrieval system, without permission from
l'r.mon Education, Inc.
CIP- KaTanorH33l(ltja y ny6nHK3l(ltjH l
IlapoAita 6116mwTeKa Cp6Hje, 6eorpa11
004.655.3(035)
004.652.4(035)
BEJ111Hr, nyK
za MySQL l Luke Welling, Laura
Thomson ; preveo Andon Kartalovski. -
Beograd : Mikro knjiga, 2005 (Beograd :
Publikum). - XI, 251 str. : ilustr. ; 24
cm
Prevod dela: MySQL Tutorial. - O autorima:
str. YI. - Registar.
ISBN 86-7555-271-8
l. TOMCOH, napa
a) nporpaMCKH je3HK "SQL" - b}
Penau.11oue 6aJe noAaTaKa - Ynpaslbaihe -
npHpY'IHlll(H
L COBISS.SR- ID t 22074124 J
MSQL/251/1280412M33010P78S6K54 S 4 3 2 1
KN lio
O autorima
l ul Vlling (Luke Wclling) predaje u koli za nauke i informacione tehno-
l Pl'- 'll' ttniwr;ritct:-t RMIT u Melburnu, Australija. Kad god smatra da je izvodljivo, opre-
tl IJIIJt' Sl' "a softver otvorenog koda i nastoji da objasni prednosti takvog reenja to
"' 111 lllp;u korisnika. Na predavanjima u Australiji, Severnoj Americi i Evropi, obja-
IIJIV.lll .Jl' MySQL, PHP i druge teme iz oblasti softvera otvorenog koda. Studentima
1 11111 llJ .lCIIlla drao je predavanja iz raznih oblasti, ali ua specijalnost mu je Internet.
l '"''Tomson (Laura Thomson) predaje u koli za nauke i informacione
r, llllnlop;Uc univerziteta RMIT u Melburnu,Australija. Predavala je vie predmeta iz
Weba i Jnterneta, a priprema doktorat na temu pretraivanja Weba. na
, 'w 1111 konferencijama irom sveta. Bila je instruktor na kursevima u organizacijama
1 d '' t m kao to su Ericsson i Lonely Planet, a pre toga je radila za firme Telstra
1 l\11\lllll Consulting Group. Diplomirala je inenjering sistema i
l, lt.lltkc. U slobodno vreme bavi se jahanjem, hrani svoju menaeriju ljubi-
ilt.ll 1, .1 ponekad s Lukom i o stvarima sasvim izvan sveta tehnike.
Od istih autora
1'111
1
i MySQL
l l'lrk.tcija zn Web
knjigama o izradi Web aplikacija jem P HP-a
i MySQL-a, ova knjiga ima najbolje ocene na lokacijama
Amazon. com i bn.com. Posebno je dobra druga polovina
knjige, u kojoj su projekti. U udbenicima pro-
gramiranja za Web, primeri su previe jednostavni
za primenu - ova knjiga sadri i jednostavne pri-
mere na kojima se objanjavaju svojstva jezika, ali i nekoliko
gotovih kompletnih aplikacija koje prikazuju kako se prave
veliki projekti .
a dra j
Uvod ........ .
Osnove MYSQL-a
Instaliranje MySQL-a
. 1
. 9
11
lnSLaliranje na Linux .... ..... ......... .... ...... .. ...... .. . . ... 12
Instaliranje na Windows .................... . .. .... ............. 12
l11staliranje na OS X ........................................... 14
Podeavanje sistema .. ......... ... ........... .... .. . ... ..... ... 14
l 'rovera da li sistem radi ........................................ 16
Zadavanje lozinke za nalog root ................. . .. .......... .... 17
ll1 isan je anonimnih naloga .................... .... ............. . 17
l'ravljenje naloga za poslove ............................. 17
Saetak ............................................ .. .. .. .. 18
l Kratak obilazak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Struktura MySQL-ovih direktorijuma ............................ .. 19
Pregled izvrnih datoteka ....................................... 20
Pregled interfejsa .................................... 21
Kratak uvod u MySQL monitor .................................. 22
Saetak .................................................... 23
ll Projektovanje i izrada baza podataka u MySQL-u. 27
Ubrzani kurs projektovanja baza podataka. . . . . . 29
Koncepti i terminologija baza podataka ............................. 29
!>rincipi projektovanja baza podataka ............................... 32
Normalizovanje ............................. ... .. ... . ....... . 34
Saetak ............ . . . ...... . . . . . .... . .... ... .............. 38
Pravljenje baza podataka, tabela i indeksa ............ 41
e malih i velikih slova ........ .. ....................... 42
Jdentifikatori u MySQL-u ................................. . .... 42
Prav ljenje baze podataka ........................................ 43
O iranje baze podataka .......................................... 43
Pravljenje tabela .................................. . ........... 44
Tipovi podataka u kolonama .... . ............. . . .. .. . ... ........ 52
indeksa .......................... , , ,
h 1nktl)t.: za r.1d s d.11111111111 ,1 1 VIti lit 111111.1, .. . ...... ................ ll <J
Brisanje baza podataka, tabela i indeksa ............. , , , , . , .. , . , . , , J' nnktq<.: za IIJHlV.I pod.tt.tka . ........................... 120
Izmena strukture tabele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . %
Saetak ............................................... .... . 58
!>tuge funkcije . . . . . . . . . . . . .. .......... . ...... . ............. 121
l:uktijc za upotrebu u odredbi GltOUP BY ........................ 121
III Upotreba MySQL-a . ............... .
63
S.1iet1k .... ..... ... ... ... .. ..... .... ..... .. . .... .......... 122
5 Umetanje, brisanje i auriranje podataka . . 65
l V Tipovi tabela i transakcije u MySQL-u 125
Komanda INSERT ... .. ..... . ................... ..... ........ 65 Tipovi tabela u MySQL-u . . . . . . . . . 127
Komanda REPLACE ....... .. ............. . ... . .. ... ...... ... . 70 tabele ... ................................... .. ... ... . 128
Komanda DELETE .. .......... ............ .. .... .... . .. ... .. . 70 MyiSAM tabele ............................................. 129
Komanda TRUNCATE ........... . ... . ............. .. .. . ... .. 72 lnnoDB tabele ......... .. .. . . ..... ... .... . . ............ . .... 134
Komanda UPDATE .. .. . ....... . ......... ...... .............. 72 llerkeleyDB (BDB) tabele . . . ...... . . . ......... .. . . ............ 135
Grupno unoenje podataka komande LOAD DAT A INFILE ...... 73 MER.GE tabele .............................. ... ............ 136
Saetak ...... .. .. . ... . . .................................... 75 l l EAP tabele .. ........... .................................. 138
6 upita u MySQL-u ..................... 79
S;tetak ........... . ... .... ........... . . .. ................. 138
Opti oblik komande SELECT . . ... . . ............................ 80 l O Upotreba transakcija u InnoDB tabelama. . . . . . . . . . . . 143
Jednostavni upiti ............ .... . . .. .. .. .. . ...... . ........... 80
podataka iz kolona .... .. .. . .... . .. .. ...... . .. 80
Staje transakcija? ... . ..................... ..... ...... .. ...... 143
Upotreba transakcija u MySQL-u .... ... ... . . .. .. ... ....... ...... 146
Apsolutna imena baza podataka i tabela ............................. 81 Transakcioni model InnoDB .. ....... . . . ... . .... .. .......... ... 149
Alijasi ... . ... .. .. . . . ........ . . . ............ . ... . .. ......... 82
Saetak ............. .... . . .... .. .......................... 152
Upotreba odredbe WHERE za samo redova ...... . .. 83
Uklanjanje dupliranih vrednosti opcije DISTINCT .. . .......... 84
V Administriranje MySQL-a ... 155
Upotreba odredbe GROUP BY ..... .. ... . .. . ... .. . . ............. 86
Izdvajanje grupa podataka opcije HAVING ... ... .. ... 87
Sortiranje rezultata odredbe ORDER BY . . .. . . . ....... 87
broj a redova rezultata odredbe LIMIT ........ .. .. 88
Saetak ......... .... .. ... .. .. . ... .. .............. . ..... ... . 89
ll Upravljanje pravima korisnika 157
l'ravljenje naloga komandi GRANT i REVOKE ... .. 157
Nivoi prava ................................................ 159
ukupnih prava . .. ......... ... .... . ... .... .......... 160
Upotreba komande REVOKE .......... .......... . ............. 161
7 Sloeniji upiti . ............................... 93 Tabele prava .. .. .. .. ..... ....... . ... . . . .................... 161
Upotreba spojeva u upitima koji obuhvataju vie tabela . ... ............. 93 Saetak ........... ... . ........... .... . ........ ......... .. . 165
Vrste spojeva tabela ...... . .. ............... ... ...... . .. . 97
Podupiti ........... ...... .......... . . . ..... . ............... 99
Opcije komande SELECT.: .. ..... .. .... . .. . ........ . .. .... ... 103
Saetak ........... . .. . ....... . ... . ... . .. .. .... . . , ......... 104
12 Podeavanje MySQL-a. . . . . . . . . . . . . . . . . . . . . . . . . 169
Podeavanje MySQL-ovih konfiguracionih opcija ..... .... ... ........ 169
Opcije za InnoDB .... . ........ . ... .. .. . ..... ........ .... .... 172
Konfiguraciane opcije za vie instalacija na istom ....... . .... .. 173
8 Upotreba MySQL-ovih funkcija Internacionalizovanje ......................................... 174
u komandi SELECT ................... ..... 109
Saetak ... .. .. .... ...... .... ...... .... ....... .... ......... 17 4
Operatori ..... . .... . .. .. ... . . .. . .... . .. ........... . ....... 11 O
Funkcije za upravljanje tokom izvravanja komandi ....... ..... .. .. . .. 113
Funkcije za rad sa znakovnim vrednostima ........................ . 114
funkcije ... ........... . .. ...................... .. . 117
13 Administriranje baze podataka . . . . . . . . . . . . . . . . . . . 177
Pokretanj e i sputanje MySQL servera ............................. 177
Prikazivanje podataka o serveru i bazama podataka na njemu .......... .. 178
Podeavanje serverskih promenljivih ......... . .................. . . 182
Unitavanje niti .................................. .. , , . , ... .. 182
Pranjenje ostava ............................................ 182
Datoteke dnevnika ........................................... 183
Saetak ................................... . ............... 184
14 Izrada rezervnih kopija i obnavljanje podataka ........ 187
Izrada rezervnih kopija baze podataka ............. . .. .. ......... .. 187
Testiranje rezervne kopije ... ...... ..... ....................... 195
Proveravanje i popravljanje tabela .. ... ... ........................ 195
Saetak ............. . .............................. .... ... 198
15 Zatita MySQL servera . . . . . . . . . . . . . . . . . . . . . . . . 201
Kako sistem prava korisnika deluje u praksi ......................... 201
Zatita naloga ...................................... 202
Zatita instaliranih datoteka ..................................... 203
Filtriranje podataka koje korisnici alju ............................ 204
Drugi saveti ........................................... ..... 205
Saetak . . . . . . . . . . ......... . ...... .. ....................... 206
16 Replikovanje baze podataka . . . . . . . . . . . . . . . . . . . . . 209
Principi replikovanja ... ...... ................................ 209
Podeavanje sistema za replikovanje ........ . ..................... 211
Sloenije topologije ................. .... .... .. ............... 215
replikovanja ...................... .. ............... 216
Saetak ... . .. . ............................. . ...... ... ..... 217
VI Optimizovanje MySQL-a . ....
17 Optimizovanje MySQL servera.
219
221
i povezivanje koda radi brzine rada ............. 221
Podeavanje parametara servera .. . ....... . ........... . ........... 222
Podeavanje drugih .................................... 224
Saetak ......... ... .. ............................ .... ..... 224
18 Optimizovanje baze podataka . . . . . . . . . . . . . . . . . . . 227
ta usporava MySQL-ove baze podataka .......... ... ....... .. ..... 227
Pravilni izbori pri projektovanju baze podataka .. . ................... 228
Indeksiranje u cilju optimizovanja ......... .... ................... 229
Komanda ANALYZE TABLE .. . .............. . ................ 230
Komanda OPTIMIZE TABLE ... . . ... . ......................... 230
Saetak .. ........................... . ..................... 230
19 Optimizovanje upita . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Otkrivanje sporih upita ..................... . ..... .... ........ 233
Merenje performansi upita ............................ . ........ 234
Upotreba dnevnika sporih upita ...................... ... ........ 234
Upotreba komande EXPLAIN za prikazivanje na koji se
upiti izvravaju .. ............. . ....... . ............ . ...... 235
MySQL-ov mehanizam optimizovanja upita ................. 237
Preporuke za optimizovanje upita ................................ 238
Saetak . . .... . .......................... .. ................ 238
Spisak termina u knjizi .
241
Indeks ................... .
243
Uvod
lill O DOLI U ZA MYSQL. Ova knjiga je ubrzani kurs koji treba da
1111 da brzo uhvatite korak s MySQL-om. MySQL objasniti tako da
1 ptlhliimo i krajnjem korisniku i administratoru sistema.
l J ovom uvodnom delu
biste se opredelili za MySQL
/.ato ba MySQL a ne neka druga baza podataka
!'lt a je u MySQL-u 4.0 i 4.1
Koje nove tek treba da se pojave u verzijama
Kome je ova knjiga namenjena
l<.1ko treba koristiti ovu knjigu
N<lpomena u vezi s licenciranja MySQL-a.
Zbog biste se opredelili za MySOL
1) "'<)L je proizvod iz oblasti baza podataka. Postoji vie razloga zbog kojih
l11 lt ' \l! opredelili da MySQL bude va server baza podataka.
MySQL je brz i stabilan. To je razlog njegove popularnosti. Februara 2002.
!ullltL', eUiek (www. eweek. com) napravio je uporednu studiju nekoliko
tt.qv t/nijih sistema za rad s bazama podataka, koja je obuhvatila Oracle, Microsoftov
1 ll Sl'rvcr, DB2 i MySQL. U toj studiji, MySQL i Oracle 9 dobili su najvie ukupne
H t' Ill' . l'ri tome je upotrebljena alfa verzija MySQL-a 4.0, a MySQL 4.1 je jo bri.
M ySQL je na raspolaganju i kao besplatan i kao komercijalni softver. Ce o MySQL
1111 tZt' st: nabaviti pod uslovima GNU opte javne licence (General Pu blic License,
l .1'1.), .di ukoliko vam je potrebna komercijalna licenca, moete je kupiti.
MySQL prua veliku koje se smatraju vanim u oblasti baza
('ul.ti.lka, a to su transakcije, na nivou redova, spoljni klju-
' l 1, podupiti i tekstualno pretraivanje.Verzija 5.0 na ovaj spisak dodati i uskladi-
l Ill' procedure.
MySQL dobru skalabilnost i koriste ga veoma zahtcvni klijenti kao to
11 Y.dlOo! Finance, Slashdot i US. Census Bureau.
MySQL je opta alatka za baza podataka jer se lako instalira i koristi,
1 Z. lutima malo prostora na disku i troi skromnu memorije.
Ukupno gledano, MySQL je izbor za aplikacije baza podataka.
Zato ba MySQL a ne neka druga baza podataka
Postoji veliki broj baza podataka koje se mogu porediti s MySQL-om u pojedmim
detaljima, ali MySQL nudi kombinaciju performansi, cene i koju bi drugi
sistemi teko nadmaili.
Performanse
MySQL je neosporno brz. Oracle, Microsoft i IBM svaki ponaosob tvrde da prodaju
najbre baze podataka na svetu, to, u zavisnosti od vaeg stepena lakovernosti, samo
dokazuje jednu od dve tvrdnje: programi za testiranje mogu se napisati tako da
rezultati dokazuju ta god programa zahteva, ili da se proizvodi
pokazuju kao savreni u uslovima upotrebe.
Na MySQL-ovj Web lokaciji moete pogledati rezultate per-
formansi MySQL-a i drugih baza podataka. Ti podaci pokazuju da MySQL uglavnom
primctno nadmauje svoje takmace. Iako u rezultate bilo kojeg testiranja treba
prihvata ti "sa zrnom soli", to vai za rezultate testova koje je izvrio proizvo-
baze podataka, svi dokazi na raspolaganju, i nezavisne testove, poka-
zuju da je MySQL jedan od najbrih proizvoda na raspolaganju.
Rezultate testiranja moete videti na Web lokaciji:
www.mysql.com/information/benchmarks.html
a ti podaci su priloeni i uz datoteke izvornog koda koje preuzim.ate, to vam omogu-
da ih uporedite s rezultatima koje dobijete u svom radnom okruenju.
Rezultati testiranja koje je izveo e Week 2002. godine pokazali su da je
MySQL uporediv sa Oracleom kada se koristi kao pozadinska baza podataka za Web
aplikacije napisane na jeziku Java koje rade na Windows s procesora.
Navedena dva proizvoda su nadmaila IBM-ov DB2, Microsoftov SQL Server i Syba-
seov ASE. U nastavku ovog teksta vie o ce nama, ali vredi napomenuti da je
od svih proizvoda tim testovima, jedan od najboljih bio besplatan, dok su
cene drugih bile reda 160.000 dolara (40.000 dolara po procesoru).Vie detalja
o tome na Web adresi www. eweek. com/article2/0, 3959,293, oo. a sp.
Brzina je oduvek bila odlika o kojoj projektanti MySQL-a vode
U MySQL se nove samo ako nisu na tetu performansi. Zbog
toga se ponekad nove dodaju sporije nego to to korisnici ele, ali se time
da MySQL uvek bude veoma brz. S tom tvrdnjom verovatno se i
sami sloiti na osnovu svog iskustva ili testova koje sami izvedete.
Cena
Cena je stavka koja se moda najlake poredi. Za mnoge uslove upotrebe, MySQL je
besplatna aplikacija. Uslovi licence tipa GPL da koristite
softver, da menjate njegov izvorni kod i da MySQL distribuirate drugim ljudima
pod GPL uslovima. U situacijama, npr. kada elite da distribuirate
MySQL kao sastavni deo komercijalnog proizvoda, da kupite komercijalnu
li cencu. Cena licence za jedan server je od 220 do 440 dolara (u pisanja ove
knjige), to zavisi od toga da li koristite tabele tipa InnoDB. Drugim za
MySQL postoje dva sistema licenciranja, gde je besplatna upotreba GPL
uslovima, a komercijalne upotrebe je standardnim sporazumima EULA
(End-User License Agreement - sporazum o licenci s krajnjim korisnikom) ili OEM
(Original Equipment Manufacturer- izvorni opreme). Pravilo kompanije
MySQL AB je "Ako je va proizvod besplatan, i na je; ako se va proizvod
pb -na
Najvaniji konkurenti nude komercijalne licence, uz sloene sisteme
t ena, koje zavise od nameravanog upotrebe, broja procesora po serveru i broja
Istovremenih korisnika koji uspostavljati veze s bazom podataka. Trokovi za Ora-
t leov server, Microsoftov SQL Server, IBM-ov DB2 i Sybaseov server, mogu
desetine hiljada dolara u okruenju sa umerenim pa i stotine hiljada
dolara za server s vie procesora na koji se povezuje broj klijenata.
MySQL se ponekad poredi s drugim bazama podataka otvorenog koda, kao to su
l'ostgreSQL i Firebird. Od svih pomenutih baza podataka otvorenog koda, jedino je
MySQL proizvod iza kojeg stoji jedna kompanija, koja je vlasnik svih prava intelektu.-
,tlne svojine i koja nudi celovite komercijalne licence, koje obuhvataju i odgovornost 1
odtetu u neispravnosti, kao to zahtevaju velike organizacije.
Jo jedna kategorija softvera s kojom se MySQL ponekad poredi jesu jeftine baze
podataka koje nisu namenjene radu u klijent/server okruenju, a ciljna trina grupa
su im korisnici ili male firme. U tu kategoriju spadaju Access i Filemaker Pro.
Mada se interfejs programa iz ove kategorije jednostavno
upotrebljava, njima uglavnom nedostaje vana funkcionalnost i nisu dovoljno stabilni,
skalabilni i brzi da bi bili upotrebljivi za aplikacije od vanosti za firmu.
Stabil nost
Projektanti MySQL-a oduvek su smatrali da je stabilnost od prvorazrednog
Sve verzije MySQL-a izdate u binarnom obliku - i alfa izdanja - moraju
MySQL-ov skup testova stabilnosti. Postupak obuhvata testiranje funkcija i drugih
osobina, kao i ispitivanje rezultata operacija pri kojima su u prolosti otkrivene i ispra-
vljene greke, se da se nikad ponovo ne uvede ispravljena greka.
Ispravljanju greaka projektanti moraju da daju vii prioritet od drugih poslova.
U sutini, projektant prekida posao sve dok se ne otkloni greka koja spada
u njegovu oblast Pravilo nalae da svako izdanje MySQL-a mora biti
od dotad poznatih greaka koje se mogu reprodukovati u poznatim uslovima.
R.azume se, problemi ne mogu se reiti a da pri tom ne pro uzrokuju druge
probleme na drugom mestu. To vai za produkcione verzije u koje ne bi tre-
balo sutinske izmene koje bi mogle da na stabilnost verzije. U takvim
problem se dokumentuje i otklanja u jednoj od narednih verzija.
I najzad, kvalitet softvera MySQL-ovi klijenti i zajednica korisnika.
Preko miliona korisnika irom sveta rade u veoma okruenjima, to
prua jedinstvenu priliku za otkrivanje greaka u fazama razvoja.
da je MySQL-ov sistem za otkrivanje i dokumentovanje greaka javan, svaki korisnik
ima uvid u sve to su drugi korisnici otkrili i moe da dodaje svoje napomene.
upotrebe
Druga odlika MySQL-a jeste upotrebe. Nije potreban sime.: n post upak
podeavanja da biste da radite. MySQL server radi kako treba ga
jete". Standardne vrednosti parametara su takve da minimizuju utroak prostora na
disku i memorije. Razume se, da bi se postigle optimalne performanse
funkcija koje su vane u produkcionom u. kao to je npr. kori-
snika za rad u bazu podataka, potrebno je finije doterivanje tih standardnih vrednosti
radnih parametara MySQL-a. Pri tome vam mogu primeri konfiguracionih
datoteka koje dobijate uz MySQL.

softvera umnogome zavisi od toga koje smatrate
vanim. MySQL prua kao to su tekstualno pretraivanje,
replikovanje i podrka za veoma obimne tabele, kojih u drugim jeftinim proizvodima
uopte nema ili ne rade najbolje. MySQL-u nedostaju neke
kao to su uskladitene procedure i pogledi, koje su standardne u najskupljim proizvo-
dima, a postoje i u nekim jeftinim proizvodima. Neke od tih
nosti (kao to su uskladitene procedure), planirane su za naredne verzije, dok za
druge (kao to su pogledi) biti potrebno vie vremena. Neke MySQL-ove
(na primer, na nivou reda) ne postoje ni u najskupljim sistemima.
Na Web lokaciji MySQL-u nalazi se stranica, h t tp: l /www. mysql. com/
information/features. html, na kojoj uporedni pregled
MySQL-a i dvadesetak konkurenata, da biste videli ta se sve nudi. U nastavku dajemo
kratak spisak koje ne podravaju svi MySQL-ovi konkurenti i spisak
kojih nema u MySQL-u a postoje u drugim proizvodima.
MySQL 4.1 nudi
transakcije u skladu s grupom pravila ACID
podrku za platforme
replikovanje
podrku za obimne tabele i baze podataka
tekstualno pretraivanje
podupite
podrku za sintakse po standardu SQL 92.
MySQL zasad jo ne nudi
poglede
uskladitene procedure

ta je u My -u 4.0 i 4.1
MyS )L 3.23 je dugo hio J111HIIIkt 11111.1 V lii:ij ,l , M.11t.1 2003. godine izdat je MySQL
1 O, 13, kao produkcion.1 Vl'11ij.1 l () All.1 Vl'lli,J.I
1
1.1 11.data je aprila iste godine.
Ako ste koristili veri. lJ ll \ \, 11 Vl' lilJI tl .O izmene:
U standardnu binarnu verziju ugrad ena je maina baze podataka Inn oD B, koja je
bila u neke kasnije verzije 3.23. Maina baze podataka InnoDB
podrava pravila ACID, to da podrava transakcije, spoljne i
na nivou redova tabele.
MySQL sada koristi ostavu (ke) za upite, u koju smeta rezultate upita za kasniju
ponovnu upotrebu, znatno poboljava performanse upita.
Tekstualno pretraivanje i indeksiranje, koji su dodati u verziji 3.23.23, pobolj-
ani su opcije Boolean.
Tabele tipa MERGE sada podravaju komande INSERT i polja AUTO_INCREMENT.
Skupovi rezultata dobijeni upita SELECT sada se mogu spajati
opcije UNION .
Sada moete da br i ete redove iz vie tabela istovremeno jedne komande
DELETE.
Poboljano je e pravima korisnika. Doda to je vie novih vrsta prava, to
finije podeavanje, a odsad moete da i resurse kojima
korisnik ima pristup.
Odsad moete da menj ate konfiguraciju servera bez ponovnog pokretanja servera.
Na raspolaganju je nova biblioteka,libmysqld, napisana na jeziku C, koja omo-
da MySQL u svoje programe.
Replikovanje, koje postoji jo od verzije 3.23.15, poboljano je na vie
uglavnom otklanjanjem greaka. Na primer, sada moete da podesite bazu
prijemnik podataka opcije LOAD DATA FROM MASTER, umesto pomocu
komande mysqldump ili alatke mysqlsnapshot.
Napravljeno je i puno drugih manjih izmena i poboljanja. . .
Verzija 4.1 donosi jo neka dodatna poboljanja. Najvanija izmena Je dodavanJe
pod upita i izvedenih tabela. Odsad imate i podrku za Unicode, za
OpenGIS za skladitenje geografskih podataka i mnogo drugih sitmJih poboljsanJa.
Koje nove tek treba da se pojave
u verzijama
Verzija 5.0 je zasad u predalfa fazi, ali moete preuzeti izvorni kod da biste s njim
ckspcrimentisali. izmena koju donosi verzija 5.0 jeste do.datak
ditenih procedura, to je u predalfa verziju. Planirane su 1 druge
medu kojima su podrka za kursore, RTREE indeksi, pravi tip podataka VARCHAR 1
druga manja poboljanja.
Trebalo bi da verzija 5.1 definisanje spoljnih Ll sv lill Vl st.llll.l
tabela mnogobrojnim drugim novim Pogledi biti podra ni
u j ednoj od verzija S.x.
Kome je ova knjiga namenjena
Ova knjiga je jedinstvena jer se sastoji od niza kratkih i saetih poglavlja, a svako je
na temu i prevashodno opisuje kako se rade poslovi.
Svako poglavlje zavrava se pitanjima i vebama koje se odnose na gradivo poglavlja,
to vam da ispitate da li ste dobro razumeli koncepte izloene u poglavlju.
Ukratko, naa namera je da knjiga bude kratak za pametne ljude. Ova
knjiga nije referentni Ako vam to treba, pogledajte o
MySQL-u na Web lokaciji. Zaista nema potrebe da ponovo pronalazimo
rupu na saksiji.
se na pet oblasti: instalisanje i konfigurisanje
MySQL-a, upotreba MySQL-a, administriranje MySQL-a i optimizovanje MySQL-a.
sva sutinska zarU a koja su neophodna za profesionalnu upotrebu MySQL-a.
Ovu knjigu moete koristiti kad god vam zatreba da uradite posao koji
se upotrebe MySQL-a u novom projektu, ili ste preli na nov posao, ili nemate
dovoljno vremena da "kopate" po drugoj krUizi od hiljadu stranica. Ova knjiga je
napisana tako da vam pomae da uradite posao.
Kako treba koristiti ovu knjigu
Ova knjiga je podeljena na pet delova:
U prvom delu", Osnove MySQL-a", kako da instalirate i podesite MySQL
na svom sistemu, i MySQL na osnovu kratkog opisa.
Drugi deo, "Projektovanje i izrada baza podataka u MySQL-u", vodi vas kroz
postupak projektovanja i izrade baze podataka. koji imaju iskustva u pro-
jektovanju baza podataka dovoljno da samo povrno pogledaju ovaj deo, ali ako
ste u oblasti baza podataka, savetujemo da ga detaljno
U delu",Upotreba MySQL-a", kako da koristite podatke iz
MySQL-a u svakodnevnim poslovima.
deo", Tipovi tabela i transakcije u MySQL-u" opisuje kako se u MySQL-u
koriste pojedine vrste maina baza podataka, sa posebnim osvrtom na mainu 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,
podeavanje, odravarUe baze podataka, izrada rezervnih kopija i restauriranje baze
podataka, zatita baze podataka od pristupa i replikovanje podataka.
esti deo",Optimizovanje MySQL-a", vam da dobijete maksimum od
MySQL-ove baze podataka tako to optimizujete podeavarUa servera, baze podataka
i upite u svojim uslovima.
N,1 kraju svakog poglavlja, nalazi se niz pitanja i vebi u vezi s gradivom
poglavlja, da biste mogli da provebate ono to ste u poglavlju.
Napomena u vezi s licenci ranja MySOL-a
l nmpanij a MySQL AB, kojom upravljaju projektanti i autori MySQL-a, vlasnik je
MySQL-ovog koda i dokumentacije.
delova MySQL-ovog izvornog koda na raspolaganju su pod uslovima GNU
tlptcjavne licence (General Public License, GPL).To da moete slobodno kori-
\111 1, kopirati, distribuirati i menjati izvorni kod MySQL-a. Ako kop irate ili distribui-
l,lll' kod (ili ako kod izmenite pa ga zatim kopirate ili distribuirate), to morate
1 ll liti pod GPL uslovima. Ako distribuirate binarne verzije, morate uz njih distribuirati
, 11vorni kod.
Cco tekst uslova GNU GPL licence za distribuiranje MySQL-a moete
11 lkktronskom obliku u MySQL-ovom referentnom ili na Web lokaciji
l ondacij e za besplatan softver (Free Software Foundation):
hl Lp://www.gnu.org/licenses/
Vie detalja o GNU uslovima na:
http://www.gnu.org/licenses/gpl-faq.html
Ako to ne odgovara vaim namerama- na primer, ako elite da izmenite MySQL
1 d:1 zatim prodajete binarnu verziju napravljenu na osnovu izmenjenog koda, ali bez
pristupa izvornom kodu- onda morate kupiti komercijalnu licencu od firme MySQL
AB. Komercijalnu licencu moete kupiti i ako elite da pomognete razvoj MySQL-a.
Vano je napomenuti da MySQL-ova dokumentacija nije na raspolaganju pod GPL
uslovima, ali se moe slobodno tampati za upotrebu.
l Instaliranje MySQL-a
2 Kratak obilazak
I
Osnove MYSQL-a
1
Instaliranje MySQL-a
t >VOM POGLAVLJU kako se instalira i podeava MySQL za
111 upotrebe. teme:
l11staliranje na Linux
l11staliranje na Windows
l11staliranje na OS X
Podeavanje sistema
lozinke za nalog root
llrisanje anoninmih naloga.
od instaliranja MySQL-a na sistem. Ako imate instaliran primerak
<)L- a 4.1 ili neku stariju verziju, moete tekst do odeljka "Zadavanje
Ito. l! za nalog root".
l'rl'balo bi da najpre preuzmete sa Web lokacije verziju MySQL-a koja je najpogod-
lllj.r 1.1 va sistem. Za sistema postoje verzije MySQL-a koje se distribuiraju u
1!111,11110111 obliku ili kao izvorni kod. Ako tek kako se koristi MySQL,
1 11111 vam da preuzmete binarnu verziju jer se znatno lake instalira. Dodatna prednost
11 1 lo to je binarna verzija MySQL-a podeena za optimalne i stabilne perfom1anse.
l .. t svaku platformu, MySQL postoji u tri varijante: Standard, Max i Debug. Za
(llllllt'IC iz ove knjige, potrebna vam je varijanta Max, u koju su razne kori-
lli kao to su InnoDB tabele koje upotrebu transakcija,
Int' remo vrlo koristiti.
MySQL je na raspolaganju istovremeno u vie verzija: verzija, najnovija ver-
'l' 1 11ekoliko razvojnih verzija iz vie faza razvoja. Ova knjiga je napisana za verziju 4.1.
MySQL moete preuzeti s Web lokacije:
www mysql.com/downloads/index.html
U 11<\Stavku ovog poglavlja opisujemo kako se instaliraju binarne verzije MySQL-a
l'od l inuxom, Windowsom i OS X-om. Postoji MySQL i za nmoge dmge operativne
ali detalje o instaliranja morate potraiti u MySQL-ovoj dokumentaciji.
Instaliranje na Linux
U zav_is.nosti od verzije koju imate i od toga koliko je svea, vrlo je verovatno
da vec J mate neku verZljU MySQL-a instaliranu na svom ali je vrlo
verovatno da to nije najnovija verzija.
da MySQL iz MySQL-ove RPM datoteke, pod uslo-
da vas SJStem podrzava taj format pakovanja. Savetujemo vam da upotrebite ver-
ZljU RPM datoteke koju preuzmete sa MySQL-ove We b lokacije, a ne RPM
datoteku koju vam je vae distribucije Linuxa, ako tek
.MySQL-a. Binarne verzije na MySQL-ovoj Web lokaciji auriraju
se cesc: b1lo kojoj v distribuciji Linuxa, to da su u njih najnovija
poboljsanja J 1spravke gresaka. Osm1 toga, struktura direktorijuma na vaem
podeena kako je opisano u MySQL-ovoj dokumentaciji, to vam za
svakako olakati traenje informacija.
_Jedna distribucija se sastoji od vie RPM datoteka. Da biste mogli da koristite
klljent 1 server verzije MySQL-a, potrebne su vam datoteke MySQL-server-
- VERZljA.i386.rpm, MySQL-Max- VERZljA.i386.rpm i MySQL-client- VER-
ZljA.i386.rpm. VERZijA zamenjena brojem verzije.)
Server i klijent moete instalirati ako u komandnom okruenju otkucate
komandu:
rpm -i MySQL-server-VERZIJA.i386.rpm MySQL-client-VERZIJA.i386 .rpm
. pokrenuti i mysqld, MySQL server, i formirati strukturu
dJ:ektonjuma u /etc/ini t. d/ da bi se server automatski pokretao kada pokrenete
racunar.
Ako elite da instalirate MySQL na neki drugi tj. ne iz RPM datoteka
-potraite detaljnija uputstva u MySQL-ovoj dokumentaciji.
Ivmajte u vidu da postupak instaliranja MySQL-a moe biti sloen i da se
moze. onog koji moda poznajete iz verzija MySQL-a koje ste ranije
mstabrah, 1h od vase verzije Linuxa.
Instaliranje na Windows
biste instalirali MySQL na neku noviju verziju Windowsa, morate se najpre prija-
Vltl na s1stem kao administrator.
Akvo !mate u neku verziju MySQL-a, morate zaustaviti server pre
nego sto pocnete mstal1ra11Je nove verzije. To se radi komande:
mysqladmin -u root -p shutdown
. Ako imate kao Windowsov servis, najpre da uklonite
taj serv1s. To mozete urad1t1 u komandnom okruenju komande:
mysqld --remove
l\\ n/L' bttt polrtbno d.t myoq l cl'/;IIIICililc imenom prvobitne binarne verzije servera
l"111 \lt' imt.1lirali kao Windowsov servis.
Al o vit.: volite da radite s alatkama, servis moete da uklonite i
tl .ql t' Services Manager, koja je na raspolaganju u Control Panelu, u grupi Admini-
1! .111 vc Tools Services, ili na nekim sistemima, u prozoru alatke Microsoft Manage-
litt tll Console.
ltllajte u vidu da postupak instaliranja MySQL-a moe biti sloen i moe
t.tllikovati od onog koji moda poznajete iz verzija MySQL-a koje ste ranije insta-
svojoj verziji Windowsa. instaliranje raspakivanjem .zip datoteke
lt tp 1 ste preuzeli sa We b lokacije.
lJ zavisnosti od trenutka kada ovo budete sadraj te datoteke moe biti druga-
ql. U vreme pisanja ove knjige, MySQL se instalirao pokretanjem datoteke setup.exe.
\ d utim, MySQL AB, kompanija koja je autor MySQL-a, planira MSI verziju instala-
' tnttog programa. Ako umesto datoteke setup.exe, imate .msi datoteku, MySQL
111\t.tl1rati tako to dvaput pritisnete ime MSI datoteke.
Instalacioni program vam ponuditi opciju da instalira MySQL u podrazumevani
l11 d;.torijum (c:\mysql) ili u neki drugi. U ovoj knjizi pretpostavljamo da ga
111\t.llirati u podrazumevani direktorijum.
Poto instalirate MySQL, treba da napravite datoteku s parametrima koji
potetnu konfiguraciju MySQL-a. Trebalo bi da to obavite pre nego to prvi put
pokrenete server. Vie detalja o podeavanju sistema u odeljku "Podeavanje
!'lema", u nastavku ovog poglavlja.
Poto podesite parametre sistema, korisno je da server prvi put pokrenete s
omandne linije. (U nastavku ovog poglavlja kako se MySQL instalira
.10 Windowsov servis, ali pogledajmo prvo da li uopte radi.)
Otvorite prozor komandne linije i u direktorijum u koji ste instalirali
MySQL. Ako imate standardnu instalaciju, to biti c:\mysql\bin.
Otkucajte
mysqld-max --standalone
Trebalo bi da se nakon toga prikae grupa poruka. Ako je dosad sve
u redu, moete instalirati MySQL kao Windowsov servis.
Otkucajte ime izvrive datoteke servera koju nameravate da koristite, a zatim i
opciju --install. Na primer:
mysqld-max --install
U ovoj knjizi izvrivu datoteku mysqld-max.
Da bi vaa instalacija MySQL-a postala potpuno funkcionalna, preostaje vam da
obavite jo jedan, poslednji posao. Poto su neki od programa pridruenih MySQL-u
zapravo skriptovi napisani na jeziku Perl, potrebna vam je i Perl maina da bi ti pro-
grami mogli da rade. Preuzmite i instalirajte ActivePerl sa Web lokacije ActiveState:
www.activestate.com/Products/ActivePerl/
ActivePerl dobijate u obliku MSI datoteke. Preuzmite ActivePerl i instaiii,IJ!t ga
tako to dvaput pritisnete ime te datoteke. Moete prihvatiti sve vrednosti parametara
koje vam instalacioni program ponudi za upotrebu s MySQL-om.
Instaliranje na OS X
MySQL moete instalirati na OS X iz paketa, pod uslovom da imate
OS X 10.2 ili noviji.
Ako imate neku verziju MySQL servera koja je aktivna na vaem
morate je zaustaviti pre nego to instaliranje nove verzije. To moete ura-
diti tako to na komandnoj liniji otkucate komandu:
mysqladmin -u root -p shutdown
Da biste mogli da pokrenete server, potreban vam je nalog je ime
mysql. Ako imate OS X 10.2 ili noviji, taj nalog postoji.
S MySQL-ove Web lokacije treba da preuzmete .dmg datoteku- tj. datoteku slike
diska. Prvo otvorite Finder, a zatim dvaput pritisnite .dmg datoteku.
se sadraj datoteke slike diska. PKG datoteku i dvaput je priti-
snite. Za potrebe ove knjige moete prihvatiti sve vrednosti opcija koje vam instala-
cioni program ponudi.
MySQL moete podesiti tako da se automatski pri podizanju sistema, tako
to dodate Startupitem. To moete uraditi ako dvaput pritisnete datoteku MySQL-
Startupltem.pkg koja bi trebalo da se nalazi u vaoj .dmg datoteci.
Poto izvrite postupak opisan u odeljku "Podeavanje sistema", moete pokrenuti
MySQL server tako to otkucate komandu, pod uslovom da ste instalirali Star-
tup Item:
sudo /Library/Startupitems/MySQL/MySQL start
Ako niste instalirali Startupltem, server moete pokrenuti niza
komandi:
cd /usr/local/mysql
sudo ./bin/mysqld_safe
Pritisnite Ctrl+Z. I najzad, otkucajte komandu:
bg
Ako niste instalirali Startupitem, morate ponoviti ove korake kad god
svoj sistem i elite da koristite MySQL.
Imajte u vidu da postupak instaliranja MySQL-a moe biti sloen i moe
se razlikovati od onog koji moda poznajete iz verzija MySQL-a koje ste ranije insta-
lirali, ili moe biti na vaoj verziji OS X-a.
Podeavanje sistema
konfiguracija MySQL-a takva kakvu ste je instalirali;
neke korisne su standardno a instalacija nije' dovoljno
U ovoj knjizi da izmenite opcije:
ll da koristiti InnoDB tabele, morate obaviti osnovno podeavanje za
upotrebu tog tipa tabela.
da beleenje izmena u dnevnik (engl. binary log) u svim
situacijama. To je veoma korisno u oporavljanja od katastrofalnih greaka.
l da beleenje sporih upita u dnevnik, to vam
da optimizujete svoje aplikacije.
MySQL smeta vrednosti konfiguracionih parametara u datoteku opcija. Ako kori-
lit t Windows, globalnu datoteku opcija moete smesti ti u Windowsov sistemski
oi ill ktor u um i nazvati je my.ini, ili u e: \my.cnf. da koristite my. ini jer
II.IStavak .cnf ponekad koristi za datoteke drugih aplikacija.
U operativnim sistemima iz porodice Unix, globalna datoteka opcija je
.llii'tena u direktorijum /etc/my.cnf. Ako elite da na istom radi vie
r-- lySQL servera, podatke za svaki server moete u zasebnoj datoteci my.cnf
lllt'tenoj u direktorijumu data svakog servera. Osim toga, moete dozvoliti korisni-
' 1111,1 da za svoje naloge imaju individualne opcije, koje bi trebalo da budu smetene u
ol1tntcci -/.my.cnf(obratite panju na ispred imena datoteke).
U zavisnosti od vae instalacije, moda u ni imati datoteku opcija.
t ltvorite tu datoteku u svom editoru za tekst- Notepad sasvim lepo
nh.1viti posao ako koristite Windows- ili je napravite ako ne postoji.
Predlaemo vam datoteku opcija sa opcijama (listing 1.1):
l h ting 1.1 Predloena datoteka opcija
tmysqld]
ll aktiviranje dnevnika izmena i dnevnika sporih upita
tog bin
log-slow-queries
Podeavanje za InnoDB tabele
ll Ovo je osnovna datoteka opcija predloena u dokumentaciji
ll Datoteke za podatke treba da
ll skladitenje podataka i indeksa.
ll Obezbedite dovoljno slobodnog
ll prostora na disku.
innodb_dat a_file_path = ibdatal:lOM:autoextend
ll Podesi te rezerve za bafere na
ll 50-80% mermorije
ll na
rwL-variable = innodb_buffer_pool_size=70M
nPL-variable = innodb_additional_mem_pool_size=lOM
ll Podes ite dnevnika na priblino
ll 25% rezerve za bafere
set-variable innodb_log_file_size=20M
set-variable = innodb_log_buffer_size=BM
# Podesite .. flush_log_at_trx_commit
# na O ako moete da prihvatite gubljenje
# nekoliko poslednjih transakcija
innodb_flush_log_at_trx_commit=1
deo sadraja ove datoteke opcija zasniva se na veoma jednostavnoj konfigura-
cionoj datoteci za upotrebu Inn o DB tabela, koja je predloena u MySQL-ovoj doku-
mentaciji. Ako imate instalaciju u kojoj se koriste InnoDB tabele i dodate
joj ovu datoteku opcija, moda morati da pretvorite u komentar red:
set-variable = innodb_log_file_size=20M
tako to na reda upisati znak#. (Ako imate datoteku dnevnika druge
to moda zbuniti MySQL.)
Ostala podeavanja opisana su u poglavlju 12, "Podeavanje MySQL-a".
Provera da li sistem radi
Poto instalirate MySQL, podesite ga tako da se automatski pri podizanju
Ako je podeen, trebalo bi da bude uspostavljanje veza sa
MySQL serverom.
To moete proveriti komande:
mysql -u root
Moe biti potrebno da zadate punu putanju izvrive datoteke mysql (na primer, na
Windowsu, to je e: \mysql \bin\mysql -u root) ili da izmenite vrednost
sistemske promenljive PATH.
Trebalo bi da se na ovaj uspeno prijavite kao korisnik root (administrator)
MySQL monitoru (tj. MySQL-ovom interfejsu u obliku komandne linije). Na vaem
ekranu trebalo bi da se pojavi uvodna poruka:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4 to server version: 4.1.0-alpha-max-
-debug-log
Type 'help; ' or '\h' for help. Type '\e' to clear the buffer.
mysql>
Na vaem sistemu verovatno biti broj veze (connection id) i broj verzije
servera. Neka vas to ne brine.
Ako se pojavi poruka nalik na
ERROR 2003: Can't connect to MySQL server on 'localhost' (10061)
to da MySQL server ne radi. Pokuajte ponovo da pokrenete sistem da bi se ser-
ver automatski pokrenuo zajedno s njim, ili pokrenite server komande:
mysqld --standalone
na komandnoj liniji. (To najlake uraditi u jednom prozoru, a zatim otvorite
drugi prozor iz kojeg se prijaviti na server.)
Da biste se odjavili iz MySQL monitora, otkucajte
\q
(Obrnuta kosa crta, slovo q i pritisak na taster Enter.) . . .. .
nemojte se jo odjavljivati. (Ako ste to uradth, ponovo se pnjaVJte.) .
Postoji jo nekoliko administrativnih stvari koje treba da obavite da bis.te_ zatsta mogh
da koristite svoju instalaciju MySQL-a. daje to vano, preporucujemo vam da
ovog poglavlja.
Zadavanje lozinke za nalog root .
Kao to ste verovatno ako ste se upravo prijavili na server, moral1 ste da. zadate
une korisnika- root - ali ne i lozinku. U svakoj instalaciji MySQL-a, u pocetku
n:tlog root nema lozinku. Iz bezbednosnih razloga, veoma je vano da tom
ualogu dodelite lozinku. U MySQL monitoru otkucajte
aet password for rootlocalhost=password('lozinka');
Razume se lozinka lozinkom koju ste izabrali za nalog root.
Od javite se' (\q) a zatim se ponovo prijavite. Ovog puta morati da se prijavite
komandom:
mysql -u root -p
MySQL zatraiti da zadate svoju lozinku. Parametar -u ime korisnika,
;
1
parametar -p da se prijavljujete s lozinkom.
Brisanje anonimnih naloga . ..
Pri instaliranju, MySQL automatski pravi nekoliko anonimnih naloga .za koje mje
potrebno zadavanje imena korisnika prilikom prijavljivanja.' vam da te
naloge izbriete. Razlozi zbog kojih treba da to uradtte optsam su u poglavlju 15 .
"Zatita MySQL servera", u odeljku "Brisanje anonimnih naloga". Te naloge mo zete
ukloniti niza komandi:
use mysql;
delete from user where User='';
delete from db where User='';
(lush privileges;
Pravljenje naloga za poslove .. . .
Jz bezbednosnih razloga, korisno je da umesto naloga root, za uobJcajene l svakod-
nevne poslove koristite neki drugi nalog. . . . . V
Ovde je samo ukratko opisano kako se prav1 nov konsmckt Vtse deta.lja
0
tome kako se upravlja nalozima u MySQL-u naCl cete u poglavlju 11,
"Upravljanje pravima korisnika" .
komande napravite nov nalog koji koristiti za svakodnevne
poslove:
grant create, create temporary tables, delete, execute, index,
insert,
lock tables, select, show databases, update
on*.*
to imekorisnika identified by 'lozinka ' ;
Razume se, umesto imekorisnika i lozinka, u tekst komande treba da upiete
svoje ime i lozinku.
Trebalo bi da se sada odjavi te sa servera, pa ponovo prijavite na njega pod imenom
korisnika i lozinkom koje ste zadali. U nekim od zavrnih poglavlja ove knjige mora-
da koristite nalog root da biste obavili poslove, ali poto
nalog koji ste upravo napravili ima manja prava od naloga root, bezbedniji je za sva-
kodnevne poslove.
Saetak
U ovoj f.ni trebalo bi da vaa instalacija MySQL-a bude upotrebljiva a vi spremni da
sledi te gradivo iz preostalog dela knjige. Trebalo bi da ste dosad obavili
Preuzeli najnoviju binarnu verziju MySQL-a za va operativni sistem s Web loka-
cije mysql.com.
Instalirali je- instalacionog programa (na Windowsu ili OS X-u) ili
alatke RPM.
Podesili server tako da se automatski pri podizanju sistema, ako je to u
vaem prihvatljivo.
Napravili datoteku opcija.
Prvi put se prijavili na server i odjavili s njega.
Zadali lozinku za nalog root.
Izbrisali anonimne naloge.
Napravili nov nalog i lozinku za svoje svakodnevne programerske poslove.
Vebe
Instalirajte MySQL na lokalni sistem prema postupku opisanom u ovom poglavlju,
ukoliko jo niste to uradili.
U poglavlju
U poglavlju 2",Kratak obilazak", komponente vae instalacije MySQL-a,
ponovo pogledati interfejse i osnovni upotrebe MySQL-a.
2
Kratak obilazak
u OVOM POGLAVLJU UVODI SE STRUKTURA MySQL-a i alatke koje su mu _Pri-
d1uene. vas u kratak obilazak da biste saznali koje sve postoje u
MySQL-u i koji su klijentski interfejsi. sledece teme:
Strukturu MySQL-ovih direktorijuma
Pregled izvrnih datoteka
Pregled interfejsa
Kratak uvod u MySQL monitor.
truktura MySQL- ovih direktorijuma ..
l J ovom poglavlju da ste instalirali MySQL na standardnu lokaciJU na
vom operativnom sistemu. Ako ste ga instalirali na drugo mesto, osnovna struktura
dlll'ktorijuma ista, ali kerenski direktorijum biti
Ukoliko vam je sistem sa instaliranim
1 1uktura direktorij uma se moda razlikovati. Na primer, ako Imate v .
Hat 9, daje organizacija datoteka izmenjena tako da se u op.s:1
, 1,tcm skladitenja datoteka. Ako ste MySQL instalirali iz RPM koje potJCu
.1 MySQL-ove Web lokacije, trebalo bi da datoteke budu na mestima koje navodimo
tt ovoj knjizi. .. . . v v.. v
lill ajte u vidu i to da struktura direktonJuma b1t1 dru gaCIJa sto zavisi od
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 IZ
blll.lrne distribucije, kao to je u poglavlju 1, u odeljku "InstaliranJe
MySQL-a". . . . ..
Ako imate operativni sistem srodan Unixu, standardm kerenski dJrektonJUm za .
MySQL-ove datoteke je /usr/locallmysql. Ako imate Windows, standardm kerenski
ducktorijumje C:\mysql.
/U
rUylctVIJt: L 1'\.ldldl\. UVIIOLO"
U tom direktorijumu ostalog, poddirektorijume (pod
pretpostavkom da ste instalirali MySQL iz binarne distribucije):
bin: U ovom direktorijumu nalaze se MySQL server, klijentski programi i vie
drugih korisnih programa u prevedenom obliku. Sadraj tog direktorijuma opi-
san je u narednom odeljku ovog poglavlja.
scripts: Ovaj direktorij um sadri grupu skri p tova napisanih na jeziku Perl koji
obavljaju korisne poslove. ih detaljnije u narednom odeljku ovog
poglavlja .
data: Ovo je direktorij um u kojem se vai podaci.
does (Linux) ili Does (Windows): U ovom direktorijumu dokumenta-
ciju o MySQL-u, u HTML formatu.
sql-bench (Linux) ili bench (Windows): U ovom direktorijumu nalaze se pro-
grami za testiranje MySQL-a.
Postoji jo nekoliko drugih direktorij uma u koje korisnik retko zala-
ziti. To su: include (sadri datoteke zaglavlja), lib (biblioteke funkcija koje MySQL
koristi), share (sadri tekst poruka o grekama koje MySQL alje) i example (postoji
samo na Windowsu, sadri primere upotrebe datoteke libmysql.DLL). Ako instalirate
drugi softver (kao to je PHP) koji se povezuje s MySQL-om, moe vam zatrebati da
znate gde se ti direktorijumi nalaze ali malo je verovatno da neto direktno
menjati u njima.
Pregled izvrnih datoteka
MySQL-ove izvrne datoteke nalaze se u direktorijumima bin i scripts. Pogledajmo
najpre direktorijum bin.
U njemu izvrnu datoteku mysqld ili datoteku s nekim drugim imenom,
to zavisi od operativnog sistema koji imate. To je program MySQL servera koji ste u
poglavlju 1 podesili tako da se automatski zajedno sa operativnim sistemom.
Tu i mysql, MySQL monitor. To je osnovni klijentski program sa mter-
fejsom u obliku komandne linije. .
Osim ova dva najvanija programa, i vie drugih. Upotrebu mnogih od
njih u pojedinim poglavljima ove knjige. Ovde navesti samo neke
najkorisnijim:
mysqladmin: Slui za obavljanje administrativnih funkcija.
myisamchk: Slui za proveru i popravljanje MyiSAM tabela.
mysqldump: izradu rezervnih kopija baze podataka.
mysqlbinlog: dnevnika izmena, to je za opora-
vljanje baze u katastrofalne greke.
mysqlshow: Slui za prikazivanje podataka o bazama podataka i njihovim
tabelama.
Pregled interfejsa
Kroz celu ovu knjigu programe mysqld i mysql, a na druge pomenute
programe vrati se u petom delu, "Administriranje MySQL-a".
Pogledajte sadraj direktorijuma scripts. Programi koji se u njemu nalaze su skrip-
tovi koji se interpretiraju, a ne programi u prevedenom obliku, kao u direktorijumu
h111. Upotrebu nekih njima kada vam budu zatrebali u ovoj knjizi.
Najvaniji od onih koje koristiti u ovoj knjizi jeste mysqlhotcopy, koji slui za
111 adu rezervnih kopija baze podataka. (Tu temu razmatramo u poglavlju 14, "Izrada
11'zervnih kopija i obnavljanje podataka".)
Pregled interfejsa
MySQL-u moete pristupati vie interfejsa, ili klijentskih pro-
gl.l!na.Tri najpopularnija interfejsa su: mysql (u obliku komandne linije),
poznat i kao MySQL monitor, MySQL Control Center (ili, MySQLCC)
1 phpMyAdmin.
MySQL monitor je u osnovnu instalaciju MySQL-a, a komande se
:.ulaju preko komandne linije. On uvek postoji u svim instalacijama, jednostavno se
l o listi i radi na svim platformama.
MySQL Control Center (MySQLCC) jeste interfejs. Napisan je
skupa alatki za izradu prozora Qt, koji izradu verzija za
pl.1tforme. U vreme pisanja ove knjige, MySQLCC je na raspolaganju za Unix i Win-
dows, a planirana je i verzija za OS X.
phpMyAdrninje Web interfejs za upotrebu MySQL-a. Veoma je popu-
111 an Internet usluga koji svojim korisnicima stavljaju na raspola-
MySQL radi razvijanja Web aplikacija.
Ako imate instaliran MySQL, imate i MySQL monitor. MySQLCC je
pwizvod za rad s MySQL-om, ali u zavisnosti od verzije MySQL-a koju imate,
111nda morati da ga posebno preuzmete sa adrese:
www.mysql.com/downloads/mysqlcc.html
MySQLCC se izuzetno lako instalira, a uputstva o tome na adresi:
www.mysql.com/products/mysqlcc/install.html
phpMyAdmin moete preuzeti sa adrese:
www.phpmyadmin.net/
Ako elite da sami instalirate phpMyAdmin, morate imati funkcionalan Web ser-
nl 1 instaliran PHP.
Za potrebe ove knjige, nevano je koji interfejs odabrati. Svi nude
Jl'dnaku osnovnu funkcionalnost. Upite unosite u obliku teksta, a rezultati se prika-
:tiJll u obliku teksta, bez obzira na interfejs koji upotrebite.
i>rimeri koje dajemo u ovoj knjizi testirani su MySQL monitora, ali vi
1110ete koristiti ta god vam odgovara- mysql, MySQLCC, phpMy Admin ili koji god
klijentski program na Internetu. Za neke poslove potrebno da
it kn ns n i interfejsa i upotrebite koma n dno okruenje operativnog sistema.
21
22 Poglavlje 2 Kratak obilazak
Kratak uvod u MySQL monitor
Sada ukratko opisati osnovni upotrebe MySQL monitora. Prijavljivanje za
rad u mysql opisali smo u prvom poglavlju. Samo da vas podsetimo, u MySQL moni-
tor prijavljujete se komande:
mysql -u username -p
Ovaj klijentski program ima nekoliko opcija koje mogu biti korisne. Ako usposta-
vljate vezu s MySQL-ovom bazom podataka koja se nalazi na drugom
moete upotrebiti opciju -h da biste zadali ime tog na primer:
mysql -h -u imekorisnika -p
U MySQL-uje zaista korisna opcija --i-am-a-dummy. Isti rezultat postiete i
opcije --safe -update s. Na primer:
mysql --i-am-a-dummy -u root -p
Ova opcija tetu koju biste mogli da zadate komande.
To je korisna opcija (na raspolaganju samo u alatki u kojoj se komande
zadaju na komandnoj liniji) kada se kao malo pribojavate rada u MySQL-u.
Moda bi bilo dobro daje koristite dok ovu knjigu. (Konkretno, ova opcija vas
da aurirate ili izbriete redove u tabelama ako ne zadate vrednost primarnog
tih redova. Ako jo ne znate ta to nemojte brinuti. Sve postati
jasno u delu knjige, "Upotreba MySQL-a".)
Poto se prijavite u MySQL, moete videti koje sve baze podataka postoje, ako
zadate komandu SHOW:
show databases;
Kod u ovoj fazi rezultat ove komande kratak spisak baza poda-
taka. Trebalo bi da se na vaem spisku pojavi baza podataka mysql. To je sistemska
baza podataka u kojoj se podaci o nalozima i njihovim pravima.
Vie o tome u nastavku ove knjige.
Obratite panju na to da se komanda zavrava znakom i zarez.
komandi koje otkucate u MySQL monitoru morate zavriti tim znakom ih
MySQL izvriti. Otkucajte:
show databases
i zatim pritisnite Enter. MySQL samo mirno Ako potom otkucate znak
i zarez i pritisnete taster Enter, komanda biti izvrena. To da sloene
komande raspodelite u vie redova da bi bile Umesto znaka i zarez,
moete upisati \g (obrnuta kosa crta i slovo g), ali koristi i zarez.
Moete izabrati neku bazu podataka sa liste i otkucati komandu:
use imebaze;
(Upiite ime baze kojoj elite da pristupite.)
Time navodite MySQL-u da elite da radite sa baz<?m podataka. Izabe-
rite jednu sa spiska i otkucaj te ovu komandu. (Moda imati prava da pristupite
Saetak
bazi podataka. Ako dobijete poruku o tome, izaberite drugu bazu podataka
p.1 pokuajte ponovo.)
Poto izaberete bazu podataka, moete videti koje se sve tabele nalaze u njoj, ako
111 k ll Cate komand ll:
11 1iow tables;
Podatke o tabeli moete dobiti komande:
til ncri be tablename;
Iz MySQL monitora moete se odjaviti tako to otkucate:
\q
bratite panju na to da se ova komanda ne zavrava znakom i zarez. Postoji
l', illpa komandi koje znakom\ (obrnuta kosa crta). Nijedna od njih ne zavr-
,, va se znakom i zarez. Spisak tih komandi moete dobiti ako otkucate:
\h
(Slovo h od help.)
MySQL-ove i SQL-ove komande moete upisivati direktno ll MySQL monitor.
Ml'tlutim, te komande moete uneti u datoteku koju zatim izvrite jednom
o111andom, kao skript. To raditi u nastavku ove knjige, npr. kada u poglavlju 4,
,. l 'r avljenje baza podataka, tabela i indeksa", budete pravili baze podataka.
Ako ste prijavljeni u MySQL monitor, datoteku koja sadri komande moete izvr-
dir kad otkucate:
""ree imedatoteke
Ukoliko niste prijavljeni u MySQL monitor, datoteku s komandama moete
rr.vriti preusmeravanjem rezultata te datoteke; na primer:
myoql -u imekorisnika -p e imedatoteke
Ovim ste stekli osnove o upotrebe klijentskog programa mysql.
aetak
Najvaniji direktorijumi u instalaciji MySQL-ajesu bin (izvrni programi), data
(podaci iz baze podataka) i does (dokumentacija).
Dva programa koja koristiti jesu mysqld (MySQL server) i mysql,
klijentski program u kojem se komande zadaju preko komandne linije.
Moete birati vie interfejsa, odnosno klijentskih programa.
Pomenuli smo mysql (interfejs u obliku komandne linije) , MySQLCC
interfejs) i phpMyAdmin (Web interfejs).
Program mysql ima vie korisnih opcija koje moete zadati na njegovoj komand-
noj liniji. Pomenuli smo -u (kojom se zadaje ime korisnika), -p (prijavljivanje
s lozinkom), -h (kojom se zad;Ue ime udaljenog i --i-am-a-dummy
(za tete).
24 Poglavlje 2 Kratak obilazak
Poto se prijavite na server, moete izdati komande SHOW DATABASES ili SHOW
TABLES da biste dobili spisak objekata u sistemu, ili komandu DESCRIBE imeta-
bele da biste dobili podatke o tabeli.
Iz MySQL servera moete se odjaviti komande \q.
Komande moete zavravati znakom ; ili znakovima \g da biste ih poslali servem
na izvrenje .
Datoteku koja sadri komande moete izvriti iz klijentskog programa
komande source imedatoteke, ili izvan klijentskog programa- preusmerava-
njem rezultata datoteke.
Pitanja
l. Program MySQL server nalazi se u
a) direktorijumu does ili Does
b) direktorijumu lib
e) direktorijumu scripts
d) direktorijumu bin
2. Dokumentacija o MySQL-u nalazi se u
a) direktorijumu does ili Does
b) direktorijumu lib
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 zavravaju znakom i zarez
b) komande treba da se zavravaju znacima \g
e) moe a) ili b)
d) nita od prethodnog nije
5. Opcija --i-am-a-dummy zadata u programu mysql
a) to to pie
b) me da napravim previe tete dok SQL
e) me da uradim bilo ta osim prijavljivanja i odjavljivanja
d) nita od prethodnog nije
U poglavlju
Vebe
l'r tuznute i instaliraj te neki ili Web interfejs, kao to je MySQLCC.
Vtzbajte prijavljivanje i prikazivanje spiska baza podataka klijent-
programa koji ste izabrali .
Odgovori
fl1lanja
l . d
) a
\. e
l . e
'l . b
U poglavlju
l J poglavlju 3, "Ubrzani kurs projektovanja baza podataka", razmotri opte kon-
' qllt: u vezi s bazama podataka, terminologiju i principe projektovanja, i
rrnrrnalizaciju.Ako niste u oblasti baza podataka, ali ste u MySQL-u,
'" rrtorate detaljno to poglavlje.
II
Projektovanje i izrada
baza podataka u MySQL-u
\ Ubrzani kurs projektovanja baza podataka
l Pravljenje baza podataka, tabela i indeksa
3
Ubrzani kurs projektovanja
baza podataka
U OVOM POGLAVLJU osnovne principe projektovanja i normali-
lu\,lllja baza podataka. U dobro projektovanoj bazi podataka redundantnost (dupli-
' tll)t') podataka svedeno je na minimum, ali bez gubljenja podataka. To da na
'riJ hrt i to manji utroak prostora na disku uz svih veza koje postoje
1'HI.1taka.
teme:
Koncepti i terminologija baza podataka
Principi projektovanja baza podataka
Normalizovanje i normalne forme
Vcbe iz projektovanja baza podataka.
Koncepti i terminologija baza podataka
l 1.1 !liSte razumeli principe koje razmatrati u ovom poglavlju, moramo najpre
othJ.IStliti neke osnovne koncepte i terminologiju.
l ntiteti i relacij e
l hnovni elementi koje pokuati da model ujemo jesu entiteti i relacije. Entiteti su
'' v.11 i" (predmeti, osobe, organizacije itd.) iz stvarnog ivota o kojima podatke
11 h.1:n podataka. Na primer, moemo se opredeliti da evidentiramo podatke o zaposle-
111111.1 i slubama u kojima rade. U tom bi zaposleni bio jedan entitet, a sluba
11 radi- drugi. Relacije su veze koje postoje entiteta. Na primer, zaposleni
t,tdi ll slubi. "Radi u" je relacija (veza) entiteta zaposleni i sluba.
ltdacije mogu biti vrsta. Postoje relacije tipa "jedan prema jedan", ,jedan
ptt'tlla vie" (ili "vie prema jedan", u zavisnosti od toga s koje strane relacije posma-
lt,tlt') 1., vie prema vie". Relacija tipa ,jedan prema jedan" povezuje samo dva entiteta.
JU ruyraVIJI:: J VUILdfll UdLd
Ako bi svaki zaposleni u ovoj organizaciji imao svoju pregradu s stolom, to bi
bila relacija tipa ,jedan prema jedan". U primerima kao to je navedeni, ta veza "radi u"
je tipa "vie prema jedan", tj. vie zaposlenih radi u datoj slubi . Tc dve vrste rela-
cija prikazane su na slici 3.1.
Candy
Istraivanje i razvoj
-Jr________.____",

Nora


Ajay
Slika 3.1 Relacija "nalazi se u" jeste tipa ,jedan prema jedan".
Relacija "radi u" jeste tipa "vie prema jedan".
Imajte u vidu da entiteti, relacije i vrste relacija njima zavise od okruenja i
poslovnih pravila koje pokuavate da modelu jete. Na primer, u nekim firmama jedan
zaposleni moe raditi u vie slubi. U tom bi relacija "radi u" bila tipa "vie
prema vie". Ako vie ljudi deli istu pregradu ili kancelariju, onda relacija "nalazi se u"
nije tipa "jedan prema jedan".
Kada projektujete bazu podataka, morate uzeti u obzir pravila koja vae u sistemu
koji modelujete. Ne postoje dva potpuno jednaka sistema.
Koncepti 1 termrnologiJa oaza podataka
l.tbele
tySQL je sistem za upravljanje relacionim bazama podataka (engl. Relational Database
\ ltiiWgement System, RDBMS), to da podrava baze u kojima postoje relacije
1 111\!du podataka koji se u tabelama (engl. tables). Ako ste ikada koristili neki
za tabelarne svaki njegov radni list ima oblik tabele s podacima.
1
1
111llCr tabele je prikazan na slici 3.2.
emolovee
em loveeiD name ob departmentiD

1 Noro edwards
Ben Smith
1 Programmer
OBA

6651 Ajay Palal Programmer 128
!016 Candy Burnett Systems Administrator 128
Slika 3.2 U tabeli employee (zaposleni) se ifre zaposlenih (employee ID),
imena (name), poslovi kojima se bave Gob) i slube u kojima rade (departmentiD).
Kao to vidite, ova tabela sadri podatke o zaposlenima u jednoj kompaniji. (Nisu
pr1bzani podaci o svim zaposlenima, samo nekoliko primera.)
Kolone ili atributi
l J tabelama baze podataka, svaka kolona ili atribut opisuje podatak koji se
11 .d.tzi u svakom redu tabele. kolona (engl. column) i atribut (obeleje, engl. attri-
/111/r) koriste se kao sinonimi, ali je da je kolona deo tabele, dok se atribut
1ul11osi na entitet iz stvarnog sveta koji tabela modelu je. 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.
B dovi, zapisi i n-torke
ponovo tabel u employee. Svaki red te tabele predstavlja zapis o jednom
t.tposlenom. Moda izraze redovi (engl. rows), slogovi ili zapisi (engl. records)
11i n- torke (engl. tup/es). Svaki red u ovoj tabeli sadri podatke iz svih kolona tabele.

(engl. superkey) je kolona (ili grupa kolona) koja identifikuje red
t.tbele. (engl. key) je minimalni Pogledajte tabel u employee. Da bismo
identifikovali svakog zaposlenog, moemo upotrebiti kombinaciju kolona
t'ntployeeiD i name, ili koristiti kombinaciju svih kolona (employeeiD, name, job,
tkpartmentiD). Obe kombinacije su
da bismo identifikovali svaki red tabele, nisu nam potrebne
sve te kolone, je dovoljna samo jedna (na primer) employeeiD, odnosno mini-
Illa ina grupa kolona koje nedvosmisleno identifikujemo svaki red. Prema
tome, je kolona employeeiD.
Pogledajte ponovo tabelu employee. Jednog zaposlenog moemo identifikovati po
1111enu (name) ili po ifri zaposlenog (employeeiD). Obc kolone su Tc klju
(l'vc o kandidati za k(j11fc1Jl' (engl. candidate kcys) jer su to
1.( J
kojima izabrati primarni (engl. pri mary) Primarni je kolona ili
grupa kolona koje identifikovati pojedine redove tabele.
U ovom za tu namenu kolonu employee ID. To je bolji od
kolone name jer se da dve osobe imaju isto ime i prezime.
Spoijni (engi.Joreign keys) predstavljaju veze tabela. Na slici 3.2 vidite
da kolona departmentiD sadri brojeve koji predstavljaju ifre slubi u kojima rade
zaposleni. To je spoljni skup svih podataka o slubi se u drugoj
tabeli, u kojoj je primarni kolona departmentiD.
Funkcionalne zavisnosti
Izrazjunkcionalna zavisnost (engi.Junctional dependency) koristi se nego drugi koje
smo naveli, ali treba da shvatite njegovo da biste razumeli postupak normali-
zavanja o kojem biti u nastavku ovog poglavlja.
Ako u datoj tabeli postoji funkcionalna zavisnost kolone A i kolone B, koja
se moe napisati kao A -7 B, vrednost u koloni A vrednost u koloni B. Na
primer, u tabeli employee, kolona employeeiD funkcionalno ime zaposlenog
(a u ovom primeru i sve druge atribute).
eme
Izraz ema ili ema baze podataka (engl. database schema) strukturu ili dizajn
baze podataka, odnosno oblik koji baza podataka ima, i ne odnosi se na same podatke.
Da bi vam bilo jasnije, ema je "nacrt strukture" podataka koji se u bazi.
emu jedne tabele u bazi podataka piemo na
employee ( employeeiD, name, j ob,
U ovoj knjizi se pravila da se atributi koji predstavljaju primarne
punom linijom, a atributi koji predstavljaju spoljne - Pri-
marni koji su istovremeno i spoljni, se i punom i linijom.
Principi projektovanja baza podataka
Kada projektujemo bazu podataka, moramo razmotriti dva vana pitanja:
Koje sve podatke treba odnosno o kojim sve stvarima ili entitetima
moramo da podatke?
Koju vrstu pitanja postavljati bazi podataka? (Pitanja bazi podataka zovu se
upiti.)
Kada traimo odgovore na ova pitanja, moramo uzeti u obzir poslovna pravila
organizacije koju pokuavamo da modelujemo, o sve moramo da
podatke i koje su veze tih podataka.
Na osnovu odgovora na ova pitanja moramo da napravimo bazu podataka
struktura biti takva da strukturne probleme kao to su redundantnost (dupli-
ranje) podataka i anomalije podataka.
nmc1p1 pUUtlliiKil
H dundantnost i gubljenje podataka
l Hla projektujemo emu baze podataka, to moramo uraditi tako da redundantnost
Jlndataka bude minimalna, ali da pri tome ne izgubimo nijedan podatak koji namje
111 llphodan. Redundantni podatak u ovom kontekstu da se isti podatak ponavlja
11 1 redovima iste tabele ili u tabelama baze podataka.
Zamislite da umesto dve tabele, employee (zaposleni) i department (slube), imamo
11110 jednu tabelu koja se zove employeeDepartment. To moemo izvesti ako tabeli
IIIJlloyee dodamo kolonu departmentName tako da ema tabele postaje
cmployeeDepartment(employeeiD. name, job, departmentiD, departmentName)
Za svakog zaposlenog koji radi u slubi je ifra 128, Research and Development
(htt.1ivanje i razvoj), moramo da ponovimo podatak "Research and Development"
( Irb 3.3). Isto vai i za sve ostale slube kompanije.
employeeDepartment
employeeiD name ob de artmentiD de artmentName

ora_t:a_war s rogrammar

1 ana Ue\le opment
Ben Smith OBA Fmance
6651 Programmer 128 Research and Development
9006 Candy Burn eU Systems Administrator 128 Research and Development
Slika 3.3 Ova ema dovodi do redundantnosti (ponavljanja) podatka
o nazivu slube.
Ovu emu moemo da izmenimo na
tmployee(employeeiD, name, job,
dcpartment(departmentiD, name)
U ovom se naziv slube na samo jednom mestu, pa se minirnizuje
1111 oak prostora na disku i izbe gavaju problemi .
Obratite panju na to da smo morali da ostavimo kolonu departmentiD u tabeli
111ployee; bez nje bismo izgubili informaciju iz eme, odnosno u ovom bismo
vezu zaposlenog i slube u kojoj radi. Kada poboljavamo emu baze
Jlodntaka, moramo uvek imati u vidu oba cilja, tj. manju redundantnost podataka ali
lll'z gubljenja informacija.
Anomalije
/\11omalije su neto sloeniji koncept. To su problemi koji se pojavljuju poda-
' 1111.1 zbog loe osmiljene strukture baze podataka. Mogu se pojaviti tri vrste anoma-
lq.t, koje opisati na primeru loe osmiljene eme sa slike 3.3.
Anomalije pri dodavanju podataka
Allt111lalije pri dodavanju podataka nastaju kada u tabelu s loe osmiljenom struktu-
llllll pokuate da unesete nove podatke. Zamislite da imamo novog zaposlenog koji
poti nje da radi u kompaniji. Kada njegove podatke unosimo u tabelu, moramo da
1111csemo i ifi-u i naziv slube u kojoj radi. ta se ako unesemo podatke koji se
1,wlrkujr1 od u tabeli, npr. ako upiemo da novi zaposleni radi u slubi
J l' sili .1 42, J evl'lopment? Nakon toga vie biti jasno koji redovi tn bele sadre
1\jli.IVIIl' pod.1tkt 'J(> .k Jll ii1H'I ,\IIOill:llijl' J11 i \IIIOl'IIJll
ll t'll91ilVIJe J uorzant Kurs proJeKwvanJa oaza pooaraKa
Anomalije pri brisanju podataka
Anomalije pri brisanju podataka nastaju kada se podaci briu iz tabele s loe osmilje-
nom strukturom. Zamislite da svi zaposleni iz slube je ifra 128 daju otkaz (moda
zato to im je sve dojadilo). Poto izbriemo sve zapise o tim zaposlenima, vie nemamo
nijedan zapis u kojem se pominje sluba sa ifrom 128, niti njeno ime. To je primer
anomalije pri brisanju.
Anomalije pri auriranju podataka
Anomalije pri auriranju podataka nastaju kada se auriraju podaci u tabeli s loe osmi-
ljenom strukturom. Zamislite da je rukovodstvo donelo odluku da sluba je ifra
128 promeni ime u EmergingTechnologies. U tom moramo izmeniti podatke
za svakog zaposlenog koji radi u toj slubi. Lako se moe dogoditi da nekog
izostavimo.Ako se to desi, anomaliju pri auriranju.
Null vrednosti
Poslednje pravilo dobrog projektovanja baza podataka nalae da treba izbegavati eme
koje dozvoljavaju broj nepopunjenih atributa. Ako elimo da evidentiramo da na
svakih sto ili vie zaposlenih jedan od njih ima posebne kvalifikacije, u tabelu employee
ne bismo dodali novu kolonu za tu vrstu podataka jer bi za 99 drugih zaposlenih ta
kolona sadrala vrednost NULL. Umesto toga napravili bismo novu tabelu u kojoj bi se
ifre i kvalifikacije samo zaposlenih koji ih imaju.
Normalizovanje
Normalizovanje je postupak koji ispravljanje loe osmiljene strukture
baze podataka. U ovom odeljku o normalizovanju opisujemo normalne forme, to su
grupe pravila o tome ta treba i ta ne treba da bude u strukturama tabela. Tokom
postupka normalizovanja, tabele se razbijaju na manje tabele koje bolju strukturu.
Da biste pratili postupak normalizovanja, na strukturu baze podataka
redom sve tri normalne forme. U svakoj nomalnoj formi se polazi od pretpo-
stavke daje ema baze podataka u prethodnoj normalnoj formi. Da bi baza poda-
taka bila u drugoj normalnoj formi, mora prethodno biti dovedena u prvu normalnu
formu a da bi bila u normalnoj formi, mora prethodno biti dovedena u drugu
normalnu formu itd. U svakoj fazi normalizovanja dodajemo nova pravila koja ema
mora da ispuni.
Prva normalna forma
Prva normalna forma, koja se ponekad naziva i l NF, propisuje da svaka vrednost atri-
buta ili kolone mora biti prosta. To da svaki atribut mora sadrati samo jednu
vrednost, a ne kom.binaciju vie vrednosti ili drugi red baze podataka.
Pogledajte tabelu na slici 3.4.
To je nenorm.alizovana verzija tabele employee koju smo razmatrali u prethodnim
odcljcima. Kao to vidite, dodata je nova kolona, skills, u kojoj su navedena
znanja svakog zaposlenog.
NormattzovanJe
employee
employeoiD name ob dopartmentiD skills

Nora Edwards Programmer

1 Java
Ben Smith OBA
6651 ,AJay Palal Programmer 128 VB, Java
9006 Candy Burnett Systems Administrator 128 NT, Linu)(
Slika 3.4 Ova ema nije u prvoj normalnoj formi zato to kolona
skills sadri grupu vrednosti.
Svaka vrednost u toj koloni sastoji se od kombinacije drugih vrednosti, tj. umesto
d.1 sadri prostu vrednost kao to je Java, kolona sadri listu vrednosti, kao to je e,
l ' t l , Java. Time je prekrena pravilo prve normalne forme.
Da bismo ovu emu doveli u prvu normalnu formu, moramo razdvojiti vrednosti
11 koloni skills na proste elemente. To se moe obaviti na vie Prvi i moda naj-
' n tglcdniji prikazan je na slici 3.5.
emclovee
employeeiD Name ob del'_artmentiD skill

IJ\Iora
Nora Edwards
1
Programmar l
7513 Nora Edwards Programmar 12e Java
9642 Ben Smith OBA 42 082
6651 Ajay Patel Programmer 12e VB
6651 Ajay Patel Programmar 128 Java
9006 Candy Burnett Systems Administrator 12e NT
9006 Candy Bumett Systems Administrator 12e Linux
Slika 3.5 Sve vrednosti sada su proste.
U ovom napravili smo jedan red po kvalifikaciji. Ova ema je sada
11 prvoj normalnoj formi.
Razume se, ova organizacija podataka je daleko od savrene jer imamo veliku
za svaku kombinaciju kvalifikacija/zaposleni u tabeli
podatke o zaposlenom.
Bolje reenje i pravilan organizovanja ovih podataka u prvu normalnu formu
prikazano je na slici 3.6.
employee
employeeiD name ob departmentiD

1 Nora Edwards
Ben Smith
1 ':'rogrammer
OBA

6651 Ajay Patel Programmar 12e
9006 Candy Burnett Systems Administrator 12e
employeeSkills
employeeiD skill

lG
Perl
7513 Java
9642 082
6651 VB
6651 Java
9006 NT
9006 Linux
Slika 3.6 Pravilno reenje istog problema je pravljenje
dodatne tabele.
J b t"ogtaVIJe J uorzan1 Kurs proJeKtovanJa oaza poaaiaKa
U ovom primeru, preneli smo kvalifikacije u zasebnu ta belu koja slui
samo da povee ifre zaposlenih s pojedinim kvalifikacijam.a. Time smo reili problem
redundantnosti.
Moda se pitate kako smo doli do drugog reenja. Postoje dva odgovora. Jedan je:
na osnovu iskustva. Do drugog odgovora dolazimo ako nastavimo primenu postupka
normalizovanja na emu sa slike 3.5; u tom na kraju dobijamo emu sa slike
3.6. Prednost iskustva je to to i direktan prelazak na prav1lnu
strukturu, ali sasvim je prihvatljiva i bukvalna prime na postupka.
Druga normalna forma
Poto postavimo emu u drugu normalnu formu, moemo je preneti u naredne nor-
malne forme vieg stepena, koje se neto tee razumeju.
Kae se daje ema u drugoj normalnoj formi (koja se zove 2NF), ako su svi
atributi koji nisu deo primarnog funkcionalno potpuno zavisni od primarnog
i emaje u prvoj normalnoj formi. ta to To da svaki atri-
but koji nije deo primarnog mora biti funkcionalno zavisan od svih delova pri-
marnog tj. ako primarni vie kolona, svi ostali atributi tabele moraju
biti zavisni od kombinacije svih tih kolona.
Pogledajmo primer da bi postalo jasnije.
Pogledajte sliku 3.5. U toj emi, tabela sadri jedan red po zaposlenom i po
kvalifikaciji. Ta tabela je u prvoj normalnoj formi, ali nije u drugoj. Zbog
ta je primarni te tabele? Znamo da primarni mora identifi-
kovati svaki red tabele. U ovom to je samo kombinacije kolona
employeeiD i skills. Ako je sadraj kolone skills kao na slici, kolona employeeiD nije
dovoljna za identifikovanje redova jer, na primer, vrednost em.ployeeiD
7513 postoji u tri reda. poto kombinacija vrednosti u kolonama employeeiD
i skills identifikuje svaki red, je kao primarni Tako
dolazimo do eme:
employee(employeeiD, name, job, skill)
Potom se moramo zapitati: "Koje sve funkcionalne zavisnosti postoje?" U ovom
imamo:
employeeiD, skill -7 name, job, departmentiD
ali i
employeeiD -7 name, job, departmentiD
Drugim dovoljna nam je samo vrednost atributa em.ployeeiD da bismo
odredili vrednosti ostalih atributa, tj. name,job i departmentiD.To da su ti atri-
buti funkcionalno samo zavisni od izabranog primarnog odnosno
vrednosti tih atributa mogu se odrediti samo na osnovu dela tog primarnog a
njegova cela vrednost nije neophodna. Prema tome, ova ema nije u drugoj normalnoj
formi.
pitanje je: "Kako bismo je doveli u drugu normalnu formu?"
Normalizovanjc
'!''::!belu moramo razdvojiti na vie tabela u kojima su svi atributi koji nisu deo pri -
liLl rnog funkcionalno potpuno zavisni od primarnog U ovom je
''' 1glcdno da to moemo ako tabelu razdvojimo na dve tabele:
employee(employeeiD, name, job, departmentiD)
<.'mployeeSkills( employeeiD, skill)
-----------------
'lb je ema prikazana na slici 3.6.
Kao to je opisano, ova ema je u prvoj normalnoj formi zato to su sve vred-
ll osti proste. Ona je u drugoj normalnoj formi zato to svaki atribut koji nije
dl' o primarnog sada je potpuno zavisan od svih delova primarnog
Ir normalna forma
I'1111Ckad nekoga da kae: "Normalizovanje se celog i
t11t1gog osim Druga normalna forma nalae da atributi moraju zavisiti od
1 1 log normalna forma propisuje da atributi zavise samo od
1:ormalno, da bi ema bila u normalnoj formi (3NF), moramo ukloniti sve
li.lllzitivne zavisnosti i ema mora biti u drugoj normalnoj formi. U redu, ali ta je
lidll:titivna zavisnost?
Pogledajte ponovo sliku 3.3. Prikazana je ema:
l'mployeeDepartment( employeeiD, name, job, departmentlD, departmentName)
Ova ema sadri funkcionalne zavisnosti:
l'mployeeiD -7 name, job, departmentlD, departmentName
dcpartmentiD -7 departmentName
Primarni je employeeiD i svi atributi funkcionalno su potpuno zavisni od
"l''ga, to je lako razumljivo jer se primarni sastoji od samo jednog atributa.
vidljivo je i to da imamo:
l'mployeeiD -7 departmentName
l'tnployeeiD -7 departmentiD
dcpartmentiD -7 departmentName
Obratite panju i na to da atribut departmentiD nije
Ovaj odnos da je funkcionalna zavisnost employee ID -7 departmentName
li,lllzitivna zato to postoji (zavisnost departmentiD -7 departmentName) .
Da bismo doli do normalne forme, moramo ukloniti ovu tranzitivnu zavisnost.
Kao i u prethodnim formama, da bismo doli do normalne forme, tabel u raz-
dv.l_J.lmo na vie drugih tabela. U ovom je ta bi trc-
lo.do da uradimo. emu d elimo na dve tabele, employee i department, na
l' mployee(employeeiD, name, job,
d cpartmcnt( d epa rtmen t ID, departmentN ame)
' 18 Poglavlje 3 Ubrzani kurs projektovanja baza podataka
To nas na emu tabele employee prikazanu na slici 3.2. Ona je u nor-
malnoj formi.
Drugi da opiemo normalnu formu jeste da kaemo
ako je ema u normalnoj formi, za svaku funkcionalnu zavisnost u svakoj tabeh,
ispunjen je jedan od dva uslova:
Leva strana funkcionalne zavisnosti je super (tj. koji nije obavezno
minimalan).
ili
Desna strana funkcionalne zavisnosti je deo svakog te tabele.
Drugi uslov se ne pojavljuje ba tako U sve funkcionalne
zavisnosti prvim uslovom.
Boyce-Coddova normalna forma
Poslednja forma koju - ukratko- razmotriti jeste normalna
forma, koja se ponekad naziva i BCNF. U prethodnom odeljku naveh usl.ova.
Da bi tabela bila u BCNF, mora biti u normalnoj formi i mora 1spumt1 prv1 od
dva uslova, tj. sve funkcionalne zavisnosti moraju imati na levoj strani.
Taj uslov je automatski ispunjen i bez pred uzimanja mera, kao u
ovom primeru. Ako imamo zavisnost koja kri ovo pravilo, moramo j OS jednom raz-
dvojiti tabelu da bismo je doveli u l NF, 2NF i 3NF.
Normalne forme vieg stepena ..
Postoje i normalne forme viih stepena peta itd.) ali su one pogodmje za aka-
demske rasprave nego za primenu na projektovanje podataka. 3NF
(ili BCNF) sasvim. je dovoljna da rei te probleme redundantnost1 podataka na koje

Saetak
Za kraj, evo ta smo sve razmotrili u ovom poglavlju.
Koncepti
Entiteti su "stvari", a relacije su veze njih .
Tabele sadre podatke koji se prikazuju u tabelarnom obliku.
Kolone tabela su atributi (obeleja) koji opisuju svaki entitet.
Redovi tabela sadre vrednosti iz svih kolona tabele .
identifikovanje pojedinih redova.
Funkcionalne zavisnosti opisuju koji atributi vrednosti drugih atributa.
eme su "nacrti" baze podataka.
Pitanja
l'rmcipi projektovanja baza podataka
Redundantnost se mora minimizovati, ali bez podataka.
Anomalije pri dodavanju, brisanju i auriranju jesu problemi koji se pojavljuju
kada se u tabelu s loe osmiljenom strukturom podaci dodaju, briu iz nje ili
auriraju .
lzbegavajte strukture koje dovode do velikog broja null vrednosti.
Normalizovanje
Normalizovanje je formalni postupak koji e strukture
baze podataka.
Prva normalna forma (lNF) da kolone ili atributi sadre proste
vrednosti.
Druga normalna forma (2NF) da svi atributi izvan mor;Uu zavisiti od
celog
normalna forma (3NF) da ne sme biti tranzitivnih zavisnosti.
IJoyce-Coddova normalna forma (BCNF) da svi atributi moraju biti funk-
cionalno
Pitanja
je
a) Minimalni
b) Spoljni
e) Grupa atributa koja identifikuje svaki red tabele
d) Minimalna grupa atributa koja identifikuje svaki red tabele
1
Ako je tabela u drugoj normalnoj formi
a) je u prvoj normalnoj formi
b) je u normalnoj formi
e) Ne sadri tranzitivne zavisnosti
d) Sadri atribute koji nisu potpuno funkcionalno zavisni od primarnog
l , Ako je tabela u normalnoj formi
a) je u Boyce-Coddovoj normalnoj formi
b) Sadri atribute koji nisu prosti
e) Ne sadri tranzitivne zavisnosti
d) Sadri atribute koji nisu potpuno funkcionalno zavisni od primarnog
1. Tri vrste anomalija nastaju pri
a) dodavanju, i brisanju podataka
b) dodavanju, i brisanju podataka
e) auriranju i brisanju podataka
3
40 Poglavlje 3 Ubrzani kurs projektovanja baza podataka
5. N-torka je
a) kolona
b) red
e) kandidat za
d) vrsta narodnog kola
e) spoljni
Vebe
1. Normalizujte emu u normalnu formu:
Porudbine(ifraKupea, imeKupea, adresaKupea, brojPorudbine, datumPorud-
bine, ifraRobe, nazivRobe,
2. Pokuajte da osmisli te emu koja je 3NF ali ne i u BC NF.
Odgovori
Pitanja
1. e
2. a
3. e
4. b
5. b (postoji narodno kolo koje se zove estorka)
Vebe
1.
Kupei(ifraKupea, imeKupea, adresaKupea)
Porudbine(brojPorudbine, datumPorudbine,

Roba(ifraRobe, nazivRobe)
2. Postoji puno reenja, proverite samo da vae ne kri pravila
normalizovanja.
U poglavlju
U poglavlju 4, "Prav ljenje baza podataka, tabela i indeksa", emu baze
podataka u stvarne MySQL tabele.
4
Pravljenje baza podataka,
tabela i indeksa
u OVOM POGLAVLJU da pravite osnovne MySQL strukture: baze
1 tlld,nnka, tabele i indekse. teme:
Pravljenje baze podataka
Biranje baze podataka
Pravljenje tabela
Tipovi podataka za MySQL-ove kolone
Pravljenje indeksa
l3risanje tabela, indeksa i baza podataka
lzmena struktura tabela.
/.a rad s primerima u ovom poglavlju jednostavnu bazu podataka: to je
1:,1 podataka employee o kojoj je bilo u prethodnom poglavlju. ema te baze

tmployee(employeeiD, name, job,
t kpa rtment( departmentiD. name)
tmployeeSkills( employeelD, skill)
tli ent(clientiD. name, address, eontaetPerson, eontaetNumber)
workdate, hours)
l >ok gradivo iz ovog poglavlja, moete unositi komande da biste
lt.tpt.lvili ovu bazu podataka u MySQL-u. Razume se, baze podataka, tabele i indekse
11111/l'tc praviti bilo kojeg klijentskog programa za MySQL, ali u ovim primc-
' lllt.l , bazu podataka MySQL monitora. Opredelili smo se za to
11' \l ' llJC dn biste bolje razumeli strukture baze podataka, tabela i indeksa.
42 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa
Trebalo bi da se najpre prijavite u MySQL monitor, na isti na koji ste to
u poglavlju 1, "Instaliranje MySQL-a" i u poglavlju 2, "Kratak obilazak".
U ovom poglavlju koristi za definisanje podataka koje prua jezik
SQL da bismo pravili baze podataka, tabele i indekse. ta to SQL je skra-
od Structured Query Language (strukturirani jezik za upite), to je jezik koji
koristiti za izradu relacionih baza podataka i podataka iz njih. ga
dve odvojene komponente: jezik za definisanje podataka (engl. Data Difini-
tion Language, DDL), koji formiranje struktura baze podataka), i jezik za rad
s podacima (engl. Data Manipulation Language, DML), koji pretraivanje
baze podataka.
U narednim odeljcima kako se u MySQL-u prave baze podataka, tabele
i indeksi.
Razlikovanje malih i velikih slova
Pre nego to upotrebu jezika SQL i definiemo identifikatore MySQL-ovih
objekata, moramo ukratko objasniti razlikovanje malih i velikih slova u MySQL-u.
U rezervisanim jezika SQL ne pravi se razlika malih i velikih slova.
To je standardno u svim sistemima za rad s bazama podataka.
Da li MySQL praviti razliku malih i velikih slova u imenima baza poda-
taka i tabela, zavisi od operativnog sistema pod kojim radite. Razlog je to to
svakoj bazi podataka odgovarati direktorijum, a svaka tabela
smetena u datoteku. Imena tih direktorijuma i datoteka slede
pravila, koja zavise od operativnog sistema.
To da ako koristite Windows, u imenima baza podataka i tabela
se praviti razlika malih i velikih slova, ali suprotno pravilo vaiti ako koristite
neki operativni sistem iz porodice Unix. To moe biti uzrok zbrke, ako je va
operativni sistem OS X, koji moete podesiti tako da ne pravi razliku malih i
velikih slova (HFS+, standardno podeavanje), ili naprotiv, da je uzima u obzir (UFS).
Da biste smanjili zbrke, korisno je da se naviknete da sve identifikatore
tretirate kao da je razlikovanje malih i velikih slova, i pod operativnim
sistemom Windows. To vam da lako na drugu platformu.
Namerna upotreba dva oblika istog identifikatora, npr. Zaposleni i zaposleni,
moe zbuniti ljude koji va kod, pa zato izbegavajte da to radite.
U MySQL-u se u imenima kolona, indeksa i alijasa (o kojima biti u
nastavku teksta) nikad ne pravi razlika malih i velikih slova.
ldentifikatori u MySOL-u
Identifikator je opta koja se odnosi na ime alijasa, baze podataka, tabele, kolone ili
indeksa. To je da se nedvosmisleno identifikuje objekat. Pre nego to
da sami pravite baze podataka i tabele, moramo objasniti i koji su identifika-
tori ispravni u MySQL-u.
Biranje baze podataka
l lgl.tvnom, identifikatori mogu sadrati sve znakove koji postoje, osim
/.nakove navoda, znakove ASCII(O) i ASCII(255).
Imena baza podataka mogu sadrati sve znakove koji su dozvoljeni u imenima
1hrcktorijuma, ali ne i znakove koji imaju posebno u imenima direkto-
1 U u ma (/, \ i . ) , iz razloga.
Imena tabela mogu sadrati sve znakove koji su dozvoljeni u imenima datoteka,
osi m znakova . i l.
identifikatori, osim alijasa, mogu se sastojati od najvie 64 znaka. Imena alijasa
su u poglavlju 7 ",Sloeniji upiti") mogu sadrati najvie 255 znakova.
jtdno pravilo u MySQL-u glasi da moete koristiti rezervisane kao
lo tlllflkatore, pod uslovom da ih piete navodnika. Na primer, moete imati
l ''" lu je ime TABLE. Razume se, ako je neto dozvoljeno, to ne da to morate
'd .t vezno i raditi, a u ovom navedenu praksu bolje je izbegavati. i ako se
t 11 tome dobro snalazite dok radite s MySQL-om, to moe zbuniti program mysql-
d11111p, koji se koristi za izradu rezervnih kopija baze podataka.
!'ostoji kratak spisak rezervisanih koje MySQL prihvata kao identifikatore bez
tt.tvodnika. To je suprotno ANSI standardu za jezik SQL, ali je u
' tkodnevnim poslovima. primeri na koje nailaziti su upotreba rezervi-
litt h DATE i TIMESTAMP za imena kolona.
Pravljenje baze podataka
projektovanja strukture baze podataka, naredni korak je, savim da
"l' t semo MySQL-u da elimo da napravimo novu bazu podataka. To se radi
'><>L-ove komande CREATE DATABASE, na
database employee;
Da li je ova komanda uspeno izvrena, moete proveriti ako izdate komandu:
rhow databases;
Trebalo bi da se ime nove baze podataka, employee, pojavi na spisku baza podataka
11,1 vaem
Sada imate praznu bazu podataka koja da u njoj napravite nekoliko tabela.
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 naoj novoj bazi
podataka. To se radi komande use, na
noe employee;
Sada je izabrana (otvorena) baza podataka employee; za sve akcije koje izvrimo od
s.tda pa nadalje, se da se odnose na tu bazu podataka.
44 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa
Pravlj enje tabela
Tabele u bazi podataka employee SQL-ove komande CREATE
TABLE. oblik te komande je
create table imetabele ( definicije kolona tabele ) [type=tip_tabele];
Kao to vidite, komanda create table, iza kojih sledi ime tabele
koju bismo eleli da napravimo, a zatim dolazi grupa definicija svih kolona tabele. Na
kraju komande moete po potrebi zadati tip maine baze podataka koji biste eleli da
se koristi.
Primer izrade tabele
Postupak ilustrovati primerom izrade tabele. U listingu 4.1 prikazana je grupa
SQL-ovih komandi koja formira bazu podataka employee. Unesite ih ili preuz-
mite datoteku (zajedno s neto pro bnih podataka za bazu) sa Web lokacije
ovoj knjizi.
Li sting 4. 1 SQL-ove komande koje formiraju bazu podataka employee
drop database if exists employee;
create database employee;
use employee;
create table department
(
departmentiD int not null auto increment primary key,
name varchar(30)
type=InnoDB;
create table employee
employeeiD int not null auto increment primary key,
name varchar(BO),
job varchar (30),
departmentiD int not null references department(departmentiD)
type=InnoDB;
create table employeeSkills
employeeiD int not null references employee(employeeiD),
skill varchar(l5) not null,
primary key (employeeiD, skill)
type=InnoDB;
create table client
client ID int not null auto increment pri mary key' ,
name varchar(40),
address varchar(lOO),
ultactPerson varchar ( 80) ,
t'lmtactNumber char(l2)
ype= InnoDB;
tle table assignment
1 l lentiD int not null references client (clientiD),
111ployeeiD int not null references employee (employeeiD),
WtJrkdate date not null,
liours float,
p t i mary key (clientiD, employeeiD, workdate)
lype=InnoDB;
Pogledajmo jednu po jednu SQL-ove komande u ovoj datoteci.
od:
ol t op database if exists employee;
t' raviJenJe tiltlcla
()va komanda ispituje da li postoji baza podataka je ime employee; ako
l'" ' toji, ona se brie, to vam "priprema teren", ako se tako moe To nije ba
11 1 ophodno i moe biti i opasno, ali ovde smo to uradili da bismo obezbedili da
1 11" '1 skript za izradu baze podataka uvek bude delotvoran, i ako ste ranije neto
l ' pcrim.entisali s bazom podataka employee.
Ukoliko MySQL koristite u okruenju niste vlasnik, moe se dogoditi da kom-
l'.llliJJ koja iznajmljuje prostor na svojim serverima zabrani upotrebu komande drop
1.11 , base. U tom uklonite taj red iz skripta (ali proverite da ne postoji baza
pnd.ltaka je ime employee) .
Zatim fonniramo bazu podataka i otvaramo je (biramo da je koristimo), kao to ste
1 1111j c radili:
11 c1te database employee;
11 w employee;
Sada izradu tabela unutar te baze podataka. Najpre pravimo tabelu
'it'partment, na
1" 1 .a te table department
(
departmentiD int not null auto increment primary key,
name varchar(20)
Lype=InnoDB;
Ova tabela ima dve kolone, departmentiD (ifra slube), koja je primarni
1 tl.lmc (naziv slube). Kolone tabele deklariemo tako to zadamo listu deklaracija
kolona razdvojenih zarezima, a lista je uokvirena zagradama. Atribute kolone ne
111nratc razdvojiti zarezima- oni su obavezni samo za deklaracije kolona.
Ovo je naa prva SQL komanda koja se rasprostire u vie redova. da su
ll.il'ziku SQL razmaci nebitni, komande moemo pisati u obliku koji nam najbolje
odgovara. je da se stavke komande CREATE piu svaka u svom redu, da bi
l l' l,l komanda bila Interpretator jezika QL pokuati da valt
46 !'oglavlJe 4 l'raviJCnJe oaza podataKa, tabela 1 mdeKsa
komandu dok ne otkucate zavrni znak i zarez (;) i pritisnete taster Enter.
(Moete se opredeliti i da komande zavravate znacima \g, ali se znak i zarez
znatno koristi.)
U ovoj tabeli deklariemo dve kolone. Svaka deklaracija kolone imenom
kolone, za slede podaci koji opisuju tip te kolone. Pogledajte najpre drugu
kolonu ovog primera jer se neto lake razume. Deklaracija
name varchar(20)
opisuje da je ime kolone name a njen tip je varchar (2 o) .Tip podataka varchar
daje u pitanju znakovna vrednost promenljive duine, koja u ovom moe
sadrati najvie 20 znakova. Mogli smo da zadamo i tip char, to je znakovna vrednost
fiksne duine. Bez obzira na to da li zadate varchar ili char, rada s tim poda-
cima se razlikovati, jedina razlika je u obliku u kojem se ti podaci smeta ju u
memoriju. Podatak tipa varchar ( 2 o) zauzima onoliko prostora koliko je potrebno za
skladitenje stvarnog broja znakova, dok podatak tipa ch ar ( 2 o) uvek zauzima 20 zna-
kova, bez obzira na to da lije u njega smetena bilo kakva vrednost.Vie o relativnim
prednostima i nedostacima ovih tipova podataka odeljku "Tipovi podataka u
kolonama", u nastavku ovog poglavlja.
Pogledajmo sada definiciju prve kolone, koja izgleda ovako:
departmentiD int not null auto_increment primary key,
Ime ove kolone je department ID, a njen tip je int (integer). To je jedinstven broj
(ne ponavlja se) koji koristiti za identifikovanje pojedinih slubi i odeljaka
kompanije.
Deklaraciji tipa podataka kolone slede dodatni podaci o koloni.
Prvo smo zadali da je ta kolona tipa not null - drugim u svakom redu
tabele, ta kolona mora sadrati neku vrednost.
Drugo, zadali smo daje ta kolona tipa auto_increment. To je veoma
korisna MySQL-a. Kada unesemo nov red u tu tabel u, ako ne zadamo
ifru slube, MySQL sam do deli ti jedinstven broj koji biti po redosledu
auto_increment sekvence (niza). To vam olakati ivot.
Na kraju, odredba primary key da ta kolona biti primarni tabele.
Ako se primarni sastoji od samo jedne kolone, moe se zadati u ovom obliku. Za
primarne sastavljene od vie kolona mora se upotrebiti drugi oblik komande,
koji razmotriti u nastavku ovog poglavlja.
Time se zavrava definicija tabele department. A sada, pogledajte sam kraj SQL-ove
komande. Iza zavrne zagrade nalazi se red:
type=InnoDB
Time se zadaje da tabela treba da koristi mainu baze podataka InnoDB.Ako palji-
vije pogledate definicije tabela, da smo sve tabele deklarisali kao InnoDB
tabele.
l'raviJenje tabela
ta to MySQL podrava razne maine baze podataka, koje detalj
nije razmotriti u poglavlju 9, "Tipovi tabela u MySQL-u". Standardni tip je My ISAM.
Ako elite da koristite My ISAM tabele, nije neophodno da na kraj komande create
database dodate odredbu type.
U ovom potrebne su nam InnoDB tabele zato to u nekoliko primera
koristiti spoljne Maina baze podataka InnoDB podrava spoljne i
lra nsakcije, to nije na raspolaganju u tabelanu tipa MyiSAM. MyiSAM tabele
Hl bre od InnoDB tabela. Za svaku tabelu morate razmotriti koji je tip najprikladniji .
Mogli smo da zadamo tabele tipova i da imamo, na primer, nekoliko
lnnoDB tabela i nekoliko MyiSAM tabela (pa i tabele jo nekih drugih tipova,
ukoliko je potrebno), ali jednostavnosti radi, u ovom primeru koristi
lnnoDB tabele.
Pogledajmo drugu komandu create table:
create table employee
employeeiD int not null auto_increment primary key,
name varchar(BO),
job varchar ( 15) ,
departmentiD int not null references department(departmentiD)
t ype=InnoDB;
U ovoj komandi samo je jedan deo sintakse nov. Posle dn ja kolona tabele employee
JL' ifra slube (departmentiD) u kojoj zaposleni radi. To je spoljni U definiciji
t.1bele to se deklarie odredbe references, na
departmentiD int not null references department(departmentiD)
Ovom odredbom smo zadali da kolona departmentiD tabele employee referencira
kolonu (povezana je s kolonom) department ID tabele department.
Imajte u vidu da sintaksu za spoljni moemo koristiti zato to je tabela
employee tipa InnoDB. Kada koristite My ISAM tabele, upotreba spoljnih
nij e Prema planu razvoja, trebalo bi da spoljni u MyiSAM tabelama
hudu podrani i jednoj od verzija MySQL-a, verovatno u verziji 5.1.
Pogledajte sada komandu create table:
create table employeeSkills
employeeiD int not null references employee(employeeiD),
s kill varchar(15) not null,
primary key (employeeiD, skill)
type=InnoDB;
U ovoj tabeli imamo spoljni to je kolona employee ID. Zanimljivo u
vezi s definicijom ove tabele jeste to da ona ima primarni koji se sastoji od dve
kolone. Kao to vidite, deklarisane su dve kolone tabele, employeeiD i skill, a zatim
JC rasebno deklarisan primarni u redu:
pt l.mary key (employeeiD, skill)
48
Poglavlje 4 Pravljenje baza podataka, tabela i indeksa
da u sintaksi definicija drugih tabela nema novog, ih detaljno
objanjavati. Obratite panju na to da smo u tabeli assignment upotrebili nekoliko
novih tipova podataka: kolona hours (broj radnih sati) je tipa float, tj. broj s pokret-
nim zarezom, a kolona workdate (radni dan) je datumskog tipa, date. U nastavku
ovog poglavlja vie o tim tipovim kolona.
komande moete proveriti da li su tabele na vaem sistemu
podeene:
show tables;
Trebalo bi da dobijete rezultate:
+-------- ------------+
l Tables_in_employee l
+--------------------+
assignment
client
department
employee
employeeSkills
+--------------------+
Detaljnije podatke o strukturi svake tabele moete dobiti komande des-
cribe; na primer:
describe department;
Trebalo bi da na svom ekranu dobijete rezultate nalik na
+--------------+-------------+-------------------+------+-----+---------+----------------+
1 Field l Type l Collation l Null l Key l Default l Extra l
+--------------+-------------+-------------------+------+-----+---------+----------------+
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
+--------------+-------------+-------------------+------+-----+---------+----------------+
U ovoj fazi korisno bi bilo da proverite i ostale tabele.
Komanda CREATE TABLE
Poto ste videli primer, moemo na opis cele sintakse komande CREATE TABLE.
U MySQL-ovoj dokumentaciji stoji da komanda ima opti oblik:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ime tabele
[ (definicija_kolone, ... ) l
[ope i j e_ za_ tabel u] [komanda_ se l e ct l
ili
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ime tabele LIKE
izvorna_ tabela;
definicija_kolone:
ime_kolone tip_podataka [NOT NULL l NULL] [DEFAULT
podrazumevana_vrednost ] [AUTO_INCREMENT]
[PRIMARY KEY] [definicija_reference]
ili PRIMARY KEY (ime_indeksirane_kolone, .. . )
"Uli ld ll Ud \..nCJ-\ lC l J-\ DLC
ili KEY [ime_indeksa] (ime_indeksirane_kolone, .. . )
ili INDEX [ime_indeksa] (ime_indeksirane_kolone, ... )
ili UNIQUE [INDEX] [ime_indeksirane_kolone, ... )
ili FULLTEXT [INDEX] [ime_indeksa] (ime_indeksirane_kolone, ... )
ili [CONSTRAINT simbol] FOREIGN KEY [ime_indeksa]
(ime_indeksirane_kolone , ... )
[definicija_reference]
ili CHECK (izraz)
Pogledajmo detaljnije opcije koje postoje u optoj definiciji.
Rezervisana TEMPORARY izradu privremene tabele koja biti
dosegljiva samo u sesiji, a kada se veza s bazom podataka zatvori, tabela se
automatski brie.
Odredbu IF NOT EXISTS moete upotrebiti da biste napravili novu tabelu samo
ako ne postoji tabela s imenom koje ste zadali.
odredbe LIKE izvorna_ tabela moete napraviti novu tabelu koja ima
istu emu kao izvorna tabela.
U komandi CREATE TABLE deklariemo unutar zagrada kolone koje nam trebaju,
njihove tipove podataka i druge informacije koje se strukture tabele. Najjednostav-
nija definicija kolone sastoji se samo od imena kolone i tipa podataka u koloni. U nared-
nom odeljku ovog poglavlja tipove podataka za kolone tabele.
Svaku deklaraciju kolone moemo, po potrebi, proiriti opcijama:
Svaku kolonu moemo deklarisati kao NOT NULL ili NULL, to da ne dozvo-
ljavamo da kolona sadri vrednost NULL (opcija NOT NULL) ili da prihvatamo vred-
nost NULL (opcija NULL). Podrazumeva se daje vrednost NULL prihvatljiva.
rezervisane DEFAULT iza koje sledi neka vrednost moete zadati
podrazumevanu vrednost za kolonu.
Rezervisana AUTO_INCREMENT generisanje rednog broja, kao to
smo to u prethodnom primeru.Ta vrednost, koja se automatski generie
za jedan od vrednosti iz tabele. Prvi red podataka koji
un este u tabel u redni broj l. Tabela moe sadrati samo jednu kolonu tipa
AUTO_INCREMENT, koja mora biti indeksirana. Obratite panju na to da u prethod-
nim primerima nismo napravili nijedan indeks; neki su ipak bili
automatski napravljeni. Indeksi se automatski prave za kolone koje deklariete kao
primarne (PRIMARY KEY), a u ovom primeru to su sve kolone koje smo
deklarisali kao AUTO INCREMENT.
Pojedine kolone moemo deklarisati kao primarne (odredba PRIMARY
KEY).
Pojedine kolone moemo deklarisati kao spoljne opcije REFE-
RENCES, kao u ovom primeru.
.. rldVIJCIIJC UdLd fJUUdldl\d0 ldUCid l IIIUCI\)d
Osim imena kolona i tipova podataka u njima, u ovom delu komande CREATE
TABLE moemo zadati i dodatne podatke:
Moemo zadati primarni koji se sastoji od vie kolona, kao u ovom pri-
meru, tako to iza opcije PRIMARY KEY navedemo imena kolona koje pri-
marni Na taj moe se zadati i primarni koji se sastoji od samo
jedne kolone. Kolona deklarisana kao PRI MARY KEY moe sadrati samo jedin-
stvene (neduplirane) vrednosti, za nju se automatski formira indeks i ne moe
sadrati vrednost null.
Opcije INDEX i KEY su sinonimi i da zadata kolona (ili kolone) biti
indeksirana. Imajte vidu da u MySQL-u takve kolone ne moraju da sadre
jedinstvene vrednosti.
opcije UNIQUE zadaje se da kolona moe sadrati samo jedinst-
vene vrednosti. Kolone deklarisane kao UNIQUE se automatski indeksiraju.
opcije FULLTEXT zadajete da se formiraju indeksi za tekstualno pre-
traivanje kolona tipa TEXT, CHAR ili VARCHAR. Indekse za tekstualno pretraivanje
moete koristiti samo s MyiSAM tabelama. Primer se nalazi u poglavlju 9.
Opcija FOREIGN KEY da deklariete spoljne na isti kao
primarne
Iza zagrade moete zadati opcije koje se tabele. Dosad
smo videli da to moe biti tip tabele. Tipovi tabela detaljnije su opisani u poglavlju 9.
Ako ne zadate tip tabele, podrazumeva se MyiSAM. Ukratko, tip tabele moe biti jedan
od
My ISAM, koji se podrazumeva, veoma je brz i podrava indekse za tekstualno
pretraivanje; zamenjuje nekadanji podrazumevani tip ISAM.
ISAM je stariji tip tabela. je tipu My ISAM ali prua manje
zbog bi trebalo da umesto njega uvek koristite MyiSAM.
InnoDB je maina baze podataka s grupom pravila ACID koja
podrava transakcije, spoljne i podataka na nivou pojedi-
reda tabele.
BDB (Berkeley DB) je maina baze podataka koja podrava transakcije i zaklju-
podataka na nivou stranice tabele.
Ceo sadraj tabela tipa HEAP se u memoriji i nikad se ne upisuje na disk;
tome, te tabele su veoma brze, ali im je i podaci
iz njih se ne mogu restaurirati ukoliko se sistem pokvari.
Tabele tipa MERGE kombinovanje vie tabela tipa MyiSAM koje
imaju istu strukturu, tako da se podaci iz njih kao da radimo s jednom tabe-
lom.To se moe iskoristiti kada operativni sistem maksimalnu
datoteka - pa zbog toga i tabela.
1\.UIIIdllUd \..nC/"\1 C IMOLI:.
Moemo zadati jo nekoliko drugih opcija za tabel u, koje nisu obavezne ali dopri-
''"w pre svega optimizaciji. Neke njima u poglavlju 18",0ptimi-
"v.tnje baze podataka" . To su opcij e:
AUTO_INCREMENT = # da u koloni tipa auto_increment zadate
vrednost od 1.
AVG_ROW_LENGTH = # da zadate duinu reda da biste
"pomogli" maini baze podataka.
CHECKSUM = l da kontrolnog zbira u redo-
vima tabele, to moe biti korisno kada reavate problem sadraja
tabele. Zadajte vrednost 1 da biste Ova opcija je stan-
dardno a upotrebljiva je samo za My ISAM tabele.
COMMENT = "tekst" da tabeli pridruite neku napomenu.
MAX ROWS = # Ovom opcijom se zadaje maksimalan broj redova koji se moe
uneti u tabelu.
MIN ROWS = # Ovom opcijom se zadaje minimalan broj redova koji tabela
moe sadrati.
PACK_KEYS = {O l l l DEFAULT} MySQL standardno pakuje (komprimuje)
sadraj indeksa znakovnog tipa- a to su CHAR, VARCHAR i TEXT. Ako zadate
vrednost 1, svi indeksi se pakovati; ako zadate vrednost o, nijedan indeks se
pakovati.
PASSWORD = "tekst U standardnoj verziji MySQL-a ova opcija na radi ba
nita.
DELAY_KEY_WRITE = {o l l} da odloite auriranje indeksa dok
ne zatvorite tabel u. Upotrebljiva je samo za My ISAM tabele.
ROW_FORMAT= {default l dynamic l fixed l compressed }
da zadate format u kojem se skladite podaci u redovima tabele. Upotrebljiva je
samo za MyiSAM tabele.
RAID_TYPE= {l l STRIPED l RAIDO } RAID_CHUNKS=# RAID_CHUNKSIZE=#
da u cilju optimizovanja servera zadate tip RAID grupe diskova koji
imate.
UNION= (ime_tabele, [ime_tabele ])
tabelama tipa MERGE, da zadate tabele koje grupu MERGE.
INSERT_METHOD= {NO l FIRST l LAST } Ova opcija je upotrebljiva
za tabele tipa MERGE i slui da se zada tabela u koju se podaci
DATA DIRECTORY="apsolutna putanja ove opcije moete
zadati direktorijum u koji elite da se smetaju podaci tabele.
INDEX DIRECTORY="apsolutna putanja" ove opcije moete
zadati direktorijum u koji elite da se smeta sadraj indeksa tabele.
""t rldVIJ'CIIJ'C UdLd JJUUdldl\d, lciU'Cicl l IIIU\..1\.>cl
I najzad, ako ponovo pogledate opti oblik komande CREATE TABLE, da
komandu CREATE TABLE moete zavriti komandom SELECT. SELECT je SQL-ova
komanda koja redova iz jedne ili vie tabela. (Podrobnije je
opisana u poglavljima 6, 7 i 8 ove knjige.) tc opcije moete napuniti novu
tabelu podacima koje zadata komanda select.
Tipovi podataka u kolonama
U MySQL-u postoje tri osnovna tipa kolona: znakovni ili tekstualni
i datumsko/vremenski. ih jedan po jedan u narednim odcljcima.
tipovi podataka
tipovi se koriste za skladitenje brojeva. U naem primeru, upotrebili smo
tipove int (celo brojne vrednosti) i float (vrednosti s pokretnim zarezom). To su dva
primera podtipova tipova: tipovi i aproksimirani (pri-
blini) tipovi.
Za tipove moete zadati ukupan broj cifara koji sc prikazuje (irina, M)
i, za tipove s pokretnim zarezom, broj decimalnih mesta, D.Vrednosti tih parametara
zadaju se iza deklaracije tipa podatka; na primer:
plata decimal(lO, 2)
Ova komanda prikazivanje vrednosti sa ukupno 12 cifara i dva deci-
malna mesta.
Moete se opredeliti da ne zadate nijedan od ovih parametara, ili moete zadati
samo ukupnu irinu za prikazivanje, ili i irinu i broj decimala.
Uz tipove moete zadati rezervisane UNSIGNED i/ili ZEROFILL.
Rezervisana UNSIGNED da kolona moe sadrati samo nule ili pozitivne
vrednosti. Rezervisana ZEROFILL da se vrednosti iz kolone prikazivati
s nulama.
tipovi opisani su u nastavku teksta.
Tip NUMERIC ili DECIMAL
O be potpuno isti tip podataka, a DECIMAL se moe skratiti na DEC. Ovi
tipovi vrednosti s pokretnim zarezom i se koriste
za rad s vrednostima. Opseg vrednosti jednak je kao za brojeve
s pokretnim zarezom dvostruke preciznosti.
Tip INTEGER i varijante
Ovaj tip se moe skratiti na INT. To je standardni tp za celo brojne vrednosti, koje se
smctaju u bajta, to daje 2
32
vrednosti. Tip INT ima nekoliko varijanti:
TINYINT zauzima jedan bajt (2
8
vrednosti). Rezervisane BIT i BOOL
su sinonimi za TINYINT.
SMALLINT zauzima dva bajta (2
16
vrednosti).
Tipovi podataka u kolonama
MEDIUMINT zauzima tri bajta (2
24
vrednosti).
BIGINT zauzima osam bajtova (2
64
vrednosti).
Aproksirnirani tipovi opisani su u nastavku teksta.
Tip FLOAT
Ovaj tip je namenjen za rad s brojevima s pokretnim zarezomjednostruke preciznosti.
Moe predstavljati pozitivan broj u opsegu od 1.18 x 10-
38
do 3.40 x 10
38
i opseg
11egativnih brojeva.
Tip DOUBLE
Ovaj tip je namenjen brojevima s pokretnim zarezom dvostruke preciznosti. Sinonimi
'la DOUBLE SU REAL i DOUBLE PRECISION. Mogu predstavljati pozitivan broj u opsegu
od 2.23 x 10-
308
do 1.80 x 10
308
i opseg negativnih brojeva.
Znakovni i tekstualni tipovi podataka
MySQL podrava vie znakovnih i tekstualnih tipova podataka. Osnovni tekstualni
tipovi SU CHAR, VARCHAR, TEXT, BLOB, ENUM i SET. ih jedan po jedan u
11astavku teksta.
Tip CHAR
l'ip CHAR skladitenje znakovnih vrednosti fiksne duine. Kao u primeru
haze podataka employee, rezervisanoj CHAR sledi duina (broj znakova) zna-
kovne vrednosti, na primer CHAR ( 2 o) .Ako ne zadate duinu, podrazumeva se CHAR ( 1) .
Maksimalna duina podatka tipa CHAR je 255 znakova. Kada se podatak tipa CHAR upie
ll u ta?ele, on uvek ima duinu koju ste zadali u definiciji kolone. To se postie
u koloni razmacima. Ti razmaci se automatski uklanjanju pri
liCJtavanJU podatka IZ kolone tipa CHAR.
je da podaci tipa CHAR zauzimaju vie prostora na disku od ekviva-
promenljive duine. Prednost im je to to se podaci bre
1z tabele CIJe su sve kolone fiksne irine (tj. CHAR, ili date).
ll da je brzina podataka vanija od prostora koji oni zauzimaju
na disku, moda se opredeli ti da tekstualna polja u kojima se vrednosti ne razli-
k LUU mnogo po duini deklariete kao CHAR da biste (malo) optimizovali sistem.
Ispred deklaracija oba tipa, CHAR i VARCHAR, moete dodati rezervisanu NATIO-
NAL, to da elite da sadraj na standardni skup znakova. Poto se ova
opcija podrazumeva u MySQL-u, korisna je samo ako vam je potrebna kompatibil-
llOSt platformi.
Deklaracijama tipova CHAR i VARCHAR moe slediti rezervisana BINARY to
d.t sc pri znakovnih vrednosti pravi razlika malih i velikih slova.
Podrazumevani je da se ta razlika ne pravi.
54
Poglavlje 4 Pravljenje baza podataka, tabela i indeksa
Tip VARCHAR .. v v
Tip VARCHAR skladitenje znakovnih nizova promenljlVe duzme. Duzma
podataka zadaje se zagrada iza imena tipa, na primer, VARCHAR (l o l . Opseg
vrednosti je od O do 255.
Tipovi TEXT, BLOB i njihove varijante
Tipovi TEXT skladitenje tekstualnih podataka duih od ono.g to m?.e
da stane u tipove CHAR i VARCHAR. BLOB je za Binary Large OBject (vehki
binarni objekat). Ovi tipovi se ni po ne razlikuju, jedino je BLOB
namenjen binarnih a ne tekstualnih podataka. Pri podataka tipa
BLOB pravi se razlika malih i velikih slova, dok se to ne pri
taka tipa TEXT. Oba tipa su promenljive duine i za oba postoje varijante razmh velicma:
Tip TINYTEXT ili TINYBLOB moe sadrati najvie 255 (to je 2
8
-1) znakova ili
ba j tova.
Tip TEXT ili BLOB moe sadrati najvie 65,535 (i
6
-1) znakova ili bajtova (64 KB).
Tip MEDIUMTEXT ili MEDIUMBLOB moe sadrati najvie 16,777,215 (2
24
-1) znakova
ili bajtova (16 MB).
Tip LONGTEXT ili LONGBLOB moe sadrati najvie 4,294,967,295 (2
32
-1) znakova
ili bajtova (4 GB).
Tip ENUM . ,. . v
Ovaj tip podataka da zadate hstu moguClh vrednost1. Kolona tabele
sadrati jednu vrednost iz nabroj anog skupa Tip podataka ENUM deklanse se
na
pol enum('m', '')
Poto vrednost tipa ENUM moe biti i NULL, vrednosti kolone pol su m,
, NULL ili error.
Tip SET v .
Tip SET je tipu ENUM s tom razlikom to kolone u redovima tabele mogu sadrzat1
i vie vrednosti iz nabrojanog skupa
Datumski i vremenski tipovi podataka
MySQL podrava vie tipova za rad s datumima i vremenima, koji su opisani u nared-
nim odeljcima.
Tip DATE
Tip date skladitenje datuma. MySQL da datum bude u ISO
redosledu godina-mesec-dan, se izbegavaju problemi usled formata
datuma s o be strane Atlantika. Datumi se prikazuju u formatu GGGG-MM-DD.
Pravljenje indeksa
fip TIME
Ovaj tip skladitenje podataka koji predstavljaju vreme, koje se prikazuje u
lormatu CC:MM:SS.
Tip DATETIME
Ovaj tip je kombinacija dva prethodna. Format je GGGG-MM-DD
fip TIMESTAMP
<)vo je koristan tip podataka za kolone tabele. Ako u redu ne zada te vred-
IIOSt za kolonu ovog tipa, ili zada te NULL, u kolonu se upisuje vreme kada je red dodat
t.tbcli ili kada je poslednji put izmenjen sadraj reda.
Kada podatak tipa timestamp, prikazuje se u istom formatu kao tip DATE-
'1' IME. To je razlika MySQL-ovih verzija 4.0 i 4.1. Ranije ste u dekla-
' .t ciji kolone tipa TIMESTAMP mogli da zadate irinu na kojoj se prikazuju podaci iz
ll' kolone .
rip YEAR
()vaj tip skladitenje podataka koji predstavljaju godine. Kada deklariete
onu ovog tipa, moete zadati YEAR ( 2) ili YEAR ( 4) da biste zadali broj cifara. Podra-
t umeva se YEAR (4 l. YEAR (2 l predstavlja opseg godina od 1970. do 2069.
Pravljenje indeksa
Sve indekse koji vam trebaju praviti automatski kada pravite tabele. Za
W;tku kolonu koju deklariete sa opcijom PRIMARY KEY, KEY, UNIQUE ili INDEX, auto-
lll.ltski se formira i indeks.
Ponekad ustanoviti da koristite broj upita koji obuhvataju kolonu za koju
11i stc definisali indeks; u takvim moete dodati nov indeks
de CREATE INDEX.
Zanimljivo je to da se, pre izvravanja, komanda CREATE INDEX preslikava u
komandu ALTER TABLE. Komanda ALTER TABLE moe se upotrebiti i za mnoge druge
11.11ncne, koje opisati u poslednjem odeljku ovog poglavlja.
Na primer, tabeli employee moemo dodati nov indeks na
<' l' ate index name on employee (name) ;
Ova komanda pravi indeks je ime name nad kolonom name tabele employee.
Komanda create index nema puno opcija. Ispred index moete dodati
liN J QUE ako elite indeks s jedinstvenim vrednostima. Osim toga, ispred index
111octe navesti rezervisanu FULLTEXT da biste napravili indeks za tekstualno pre-
MyiSAM tabele. (Vie detalja o tome u poglavlju 9.)
56 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa
Indeksi definisani nad kolonama tipa char i varchar mogu se na prvih
nekoliko znakova u polju. To uraditi tako to iza imena indeksirane kolone zada te
zagrada broj znakova koji elite da se indeksira, na primer:
create index part_name on employee(name(S));
Poto indeksi nad kolonama tekstualnog tipa nisu tako efikasni kao indeksi nad
kolonama, indeksiranje samo nekoliko znakova poboljava
performanse.
Brisanje baza podataka, tabela i indeksa
Poto sada znate kako se prave baze podataka, tabele i indeksi, korisno je da
i da ih briete. Rezervisana re koja vam treba za tu namenu jeste DROP.
Celu bazu podataka, zajedno s njenim sadrajem, briete komande
(nemojte je jo zadati!):
drop database employee;
Ispred imena baze podataka moete dodati neobaveznu opciju IF EXISTS. Ako se
vratite na listing 4.1, da je u njemu upotrebljena ba ova verzija komande
DROP DATABASE.
Tabelu moete izbrisati komande DROP TABLE, na primer:
drop table assignment;
Opti oblik komande DROP TABLE izgleda ovako:
DROP [TEMPORARY] TABLE [IF EXISTS] ime_tabele [, ime tabele, ... ]
Ako elite da izbriete privremenu tabelu, upotrebite rezervisanu TEMPORARY
Istom komandom moete izbrisati vie tabela ako zadate listu njihovih imena razdvo-
jenih zarezima. Neobavezna opcija IF EXISTS deluje na isti kao u komandi
DROP DATABASE.
Indeks briete komande DROP INDEX, na primer:
drop index part_name on employee;
Kao to vidite, da biste izbrisali indeks, morate zadati i ime tabele kojoj je pridruen.
lzmena strukture tabele
Osim izrade novih tabela i brisanja vam zatrebati da izmenite
strukturu tabele. To se moe uraditi komande ALTER TABLE- ona
ima veliki broj varijanti koje se mogu upotrebiti za menjanje struktura tabela.
Na primer, indeks nad ta belom employee mogli smo da napravimo na
alter table employee
add index name (name) ;
tzmena struKture postoJece t110e1e
ll da komanda ALTER TABLE prua veliki broj ima i veliki broj
lj H 'Ja . Opti oblik te komande, kako je opisano u MySQL-ovoj dokumentaciji
ovako:
/l.' i'I>R [IGNORE] TABLE ime tabele vrsta_izmene [, vrsta_izmene ... ]
t a_izmene:
il l
lli
l l i
l l i
l l i
ll i
l l i
l 1 i
11 i
l ll
l J i
ADD
ADD
ADD
ADD
ADD
ADD
ADD
[COLUMN] definicija_kolone [FIRST l AFTER ime kolone
[COLUMN] (definicija_kolone, definicija ... )
INDEX [ime_indeksa] (ime_indeksirane_kolone, .. . )
PRIMARY KEY (ime indeksirane kolone, ... )
UNIQUE [ime_indeksa] (ime indeksirane kolone, . . . )
FULLTEXT [ime_indeksa] (i;e indeksira;e kolone, ... )
[CONSTRAINT simbol] FOREIGN-KEY [ime_indeksa]
(ime_indeksirane_kolone, ... )
[definicija_reference]
ALTER [COLUMN] ime_kolone {SET DEFAULT literal l DROP DEFAULT}
CHANGE [COLUMN] staro_ime_kolone definicija kolone
[FIRST l AFTER ime_kolone] -
MODIFY [COLUMN] definicija_kolone [FIRST l AFTER ime_kolone]
DROP [COLUMN] ime_kolone
DROP PRIMARY KEY
l l i DROP INDEX ime_indeksa
l l i DISABLE KEYS
1 l i ENABLE KEYS
lli RENAME [TO] novo_ime tabele
l l i ORDER BY ime kolone
ll i opcije_za_tabelu
ovih opcija razumljive su same po sebi ili odgovaraju opcijama u komandi
' 'll EA TE TABLE, kao to je ADD PRI MARY KEY ukratko one koje moda nisu
t1.1[j asnije.
pcije CHANGE i MODIFY zapravo su jedna te ista opcija i izmenu defi-
lltnj e kolone ili njenog mesta u tabeli.
Opcija DROP COLUMN brie kolonu iz tabele, dok opcije DROP PRIMARY KEY i DROP
1 NDEX briu samo indeks pridruen koloni.
Opcija DISABLE KEYS nalae MySQL-u da ne aurira sadraj indeksa, ali upotre-
i>lpva je samo za My ISAM tabele. Opcija ENABLE KEYS auriranje indeksa.
Opcija RENAME promenu imena tabele.
Opcija ORDER BY zadatim redosledom redove tabele na koju je prime-
IIJCI1a, opciji ORDER BY u komandi SELECT, koju razmatrati u poglavlju 6,
.. upita u MySQL-u". Taj red o sled biti kada se kasnije unesu
Ilovi podaci u tabelu.
Opcija opcije_za_tabelu da na kraj komande zadate iste opcije za
t.ll>elu kao u komandi CREATE TABLE- vie detalja o tome u prethodnom
dl'lu ovog poglavlja.
58 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa
Saetak
U ovom poglavlju, ste da pravite i briete baze podataka, tabele i indekse, i da
izmenite strukturu tabele.
ldentifikatori i razlikovanje malih i velikih slova
Za imena baza podataka vae ista pravila razlikovanja malih i velikih slova kao u
direktorij urnima vaeg operativnog sistema. Za imena tabela vae ista pravila kao
za imena datoteka. U imenima svih ostalih identifkatora ne pravi se razlika
malih i velikih slova.
Svi identifikatori, osim alijasa, mogu sadrati najvie 64 znaka. Duina alijasa
moe biti najvie 255 znakova.
Identifikatori mogu da sadre znakova, ali imena baze podataka
ne mogu sadrati znakove l, \ i . a imena tabela ne mogu sadrati znakove . i l.
Rezervisane moete koristiti kao identifikatore, pod uslovom da ih piete
navodnika.
Pravljenje baze podataka
create database ime_baze; pravi novu bazu podataka.
use database ime_baze; bira (otvara) bazu podataka za upotrebu.
Pravljenje tabela
Tome slui komanda create table, opti oblik izgleda ovako:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ime tabele
[ (definicija_kolone, ... ) l
[opcije_za_tabelu] [komanda_select]
ili
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ime tabele LIKE

definicija_kolone:
ime_kolone tip_podataka [NOT NULL J NULL) [DEFAULT
podrazumevana_vrednost] [AUTO_INCREMENT]
[PRIMARY KEY] [definicija_reference]
ili PRIMARY KEY (ime_indeksirane_kolone, .. . )
ili KEY [ime_indeksa] (ime_indeksirane_kolone, .. . )
ili INDEX [ime_indeksa] (ime_indeksirane_kolone, .. . )
ili UNIQUE [INDEX] [ime_indeksa] (ime_indeksirane_kolone, ... )
ili FULLTEXT [INDEX] [ime_indeksa] (ime_indeksirane_kolone, .. . )
ili [CONSTRAINT simbol] FOREIGN KEY [ime_indeksa]
(ime_indeksirane_kolone, ... )
[definicija_reference]
ili CHECK (izraz)
;:,azetaK
l ipovi podataka za kolone
tipovi SU TINYINT, SMALLINT, INT, MEDIUMINT, BIG INT, NUMERIC
i DECIMAL.
Aproksimirani tipovi su FLOAT i DOUBLE.
Znakovni tipovi SU CHAR, VARCHAR, TEXT i BLOB .
Za rad S datumima i vremenima slue tipovi DATE, TIME, DATETIME, TIMESTAMP
i YEAR.
Za navedena imena tipova podataka postoji i vie alijasa (sinonima).
Brisanje baza podataka, tabela i indeksa
Bazu podataka briete komande
drop database ime_baze;
Tabelu briete komande
drop table ime_tabele;
Indeks briete komande
drop index ime_indeksa on ime_tabele;
lzmena strukture tabele
Strukturu tabele menjate komande ALTER TABLE, opti oblik
izgleda ovako:
ALTER [IGNORE) TABLE ime_tabele vrsta izmene [, vrsta_izmene ... ]
vrsta izmene:
ADD
ili ADD
ili ADD
ili ADD
ili ADD
ili ADD
ili ADD
[COLUMN] definicija_kolone [FIRST l AFTER ime kolone
[COLUMN] (definicija_kolone, definicija_kolo;e, ... )
INDEX [ime_indeksa] (ime_indeksirane_kolone, .. . )
PRIMARY KEY (ime_indeksirane_kolone, .. . )
UNIQUE [ime_indeksa] (ime_indeksirane_kolone, .. . )
FULLTEXT [ime_indeksa] (ime indeksirane kolone, ... )
[CONSTRAINT simbol] FOREIGN-KEY [ime_indeksa]
(ime_indeksirane_kolone, ... )
[definicija_reference]
ili ALTER [COLUMN] ime_kolone {SET DEFAULT literal l
DROP DEFAULT}
ili CHANGE [COLUMN] definicija kolone
[FIRST l AFTER ime_kolone] -
ili MODIFY [COLUMN) definicija_kolone [FIRST l AFTER ime kolone]
ili DROP [COLUMN] ime_kolone
ili DROP PRIMARY KEY
ili DROP INDEX ime_indeksa
ili DISABLE KEYS
ili ENABLE KEYS
ili RENAME [TO] novo_ime tabele
ili ORDER BY ime_kolone
ili opcije_za_tabelu
bU roglaVIJe 4 rraVIJenJe oaza poaataKa, taoe1a 1 maeKsa
Pitanja
1. ta od nije ispravno ime tabele u MySQL-u?
a) employee
b) select
e) employee.skill
d) employeeSkills
2. Od tvrdnji o tipovima podataka CHAR i VARCHAR, koje su
a) Kolona tipa CHAR uvek zauzima isti prostor na disku, bez obzira na sadraj.
b) Podatak u koloni tipa VARCHAR uvek se dopunjava razmacima pri upisi-
vanju na disk.
e) Kolona tipa CHAR, u proseku, zauzima manje prostora na disku od ekviva-
lentne kolone tipa VARCHAR.
d) Kolona tipa VARCHAR uvek zauzima isti prostor na disku, bez obzira na
sadraj.
3. Pre nego to da pravimo tabele u bazi podataka, moramo prvo
a) napraviti indekse tabela
b) napraviti bazu podataka
e) napraviti bazu podataka i otvoriti je za upotrebu
d) napraviti sve kolone tabela
4. Od komandi CREATE TABLE, koja je sintaksno ispravna?
a)
create table department
department ID int not null auto
-
inc remen t pri mary
name varchar(20}
type=InnoDB;
b)
create table department type=InnoDB
(
department ID int not null auto inc remen t pri mary
name varchar ( 2 o}
} ;
e)
create department
department ID int not null auto
-
increment pri mary
name varchar(20}
type=InnoDB;
d)
create table department
(
department ID int not null auto
-
inc remen t pri mary
name varchar(20}
type=InnoDB;
key,
key,
key,
key,

5. Da biste izbrisali bazu podataka je ime dbname) i ceo njen sadraj, zadali biste
a) drop all tables on dbname;
b) drop database dbname;
e) drop dbname;
d) delete database dbname;
Vebe
1. Napiite SQL komande koje formiraju bazu podataka porudzbine je ema

kupac(kupaciD, kupaclme, kupacAdresa)
porudzbina(porudzbinaiD, porudzbinaDatum, l_c_t.lP!l.cJQ)
. robaKolicina)
roba(robaiD, robaN aziv)
Moete izabrati proizvoljne tipove podataka.
Testirajte komande u MySQL-u, a zatim pregledajte tabele
komandi SHOW i DESCRIBE.
2. Svakoj porudbini u tabeli porudzbine elimo da dodamo novo polje nazvano
napomena, koje biti tipa TEXT. Obavite to komande
ALTER TABLE, a zatim proverite rezultat komande DESCRIBE.
3. Izbriite bazu podataka porudzbine.
Odgovori
Pitanja
1. e
2. a
3. e
4. d
5. b
Vebe
create database porudzbine;
use porudzbine;
create table kupac
(
kupaciD int not null auto increment primary key,
kupacime varchar(20},
kupacAdre sa varchar(BO}
t ype I nnoDB ;
b.l roglaVIJe 4 rraVIJenJe oaza pooaiaKa, Iaoe1a 1 moeKsa
create table porudzbine
(
porudzbinaiD int not null auto increment primary key,
porudzbinaDatum date,
kupaciD int not null references kupac(kupaciD)
type = InnoDB;
create table roba
robaiD int not null auto_increment primary key,
robaNaziv varchar(20)
type = InnoDB;
create table porudzbinaStavka
porudzbinaiD int not null references porudzbine(porudzbinaiD),
robaiD int not null references roba(robaiD),
robaKolicina int,
primary key (porudzbinaiD, robaiD)
type = InnoDB;
alter table porudzbine
add column napomena text;
drop database porudzbine;
U poglavlju
U poglavlju S",Umetanje, brisanje i auriranje podataka", podatke
u bazu podataka employee.
III
Upotreba MySQL-a
5 Umetanje, brisanje i auriranje podataka
6 upita u MySQL-u
7 Sloeniji upiti
8 Upotreba MySQL-ovih funkcija u komandi SELECT
5
Umetanje, brisanje
i auriranje podataka
u OVOM POGLAVLJU kako se komande INSERT, DELETE
1 UPDATE i auriraju podaci u MySQL-ovoj bazi podataka.
teme:
Komanda INSERT
Komanda DELETE
Komanda UPDATE
podataka komande LOAD DATA INFILE
Proirenja: komande REPLACE i TRUNCATE.
Sada smo preli na komponentu DML (Data Manipulation Language, jezik za rad s
podacima) jezika SQL. Poto kako da nove podatke u bazu podataka,
11arcdnih nekoliko poglavlja mnogobrojne za
podataka iz baze.
Komanda INSERT
"iQL-ova komanda INSERT slui za umetanje novih redova u tabele.
najpre jedan primer. U ovom komande moete zadavati direktno u
MySQL monitoru ili pisati u datoteku, ili moete preuzeti datoteku s Web lokacije
ovoj knjizi.
U listingu 5.1 prikazano je nekoliko primera komande insert.
Listing 5.1 employee_data.sql
use employee;
d lete from department;
insert into department values
(42 l 'Finance') l
(128 1 'Rs arch and Development') 1
(Nur.r, l 'll n R a out ces' ) l
...... --(NlJI,Io, l M II')U l __ l r_H __ , _' _) _;
t'oglaVIJe o umetanJe, onsanJe 1 azumanJe podataka
delete from employee;
insert into employee values
(7513, 'Nora Edwards', 'Programmer',l28),
(9842, 'Ben Smith', 'OBA', 42),
(6651, 'Ajay Patel', 'Programmer', 128),
(9006, candy Burnett, systems Administrator', 128);
delete from employeeSkills;
insert into employeeSkills values
(7513, e)'
(7513, Perl'),
(7513, 'Java'),
(9842, 'DB2'),
(6651, 'VB'),
(6651, 'Java'),
(9006, 'NT'),
(9006, 'Linux');
delete from client;
insert into client values
(NULL, 'Telco Inc', 'l Collins St Melbourne', 'Fred Smith',
l 95551234 l) '
(NULL, 'The Bank', '100 Bourke St Melbourne', 'Jan Tristan',
l 95559876 l) ;
delete from assignment;
insert into assignment values
(l, 7513, '2003-01-20'' 8.5);
Obratite panju na to da pre nego to dodamo nove podatke u tabelu, izvravamo
komandu DELETE- ni u ovom to nije neophodno, ali tako ukloniti iz
tabele probne podatke koje ste moda ranije uneli. U narednom odeljku se
na komandu DELETE.
Osim toga, obratite panju i na to da smo uneli probne podatke koji odgovaraju
primerima iz poglavlja 3, "Ubrzani kurs projektovanja baza podataka", a dodali smo i
nekoliko dopunskih redova.
Sve navedene komande INSERT su veoma Pogledajmo prvu da
biste shvatili kako deluju:
insert into department values
(42, 'Finance'),
(128, 'Research and Development'),
(NULL, 'Human Resources'),
(NULL, 'Marketing');
U prvom redu zadali smo ime tabele u koju elimo da unesemo podatke - u ovom
to je tabela department, u koju unosimo reda s podacima. Moda se
da tabela department ima dve kolone, departmentiD i name. (U to se moete
uveriti ako izdate komandu describe department.)
Komanda INSERT
U prva dva reda smo zadali vrednosti za kolonu departmentiD. Pogle-
dajmo ponovo definiciju kolone departmentiD. Verovatno se iz prethodnog
poglavlja da deklaracija te kolone izgleda ovako:
departmentiD int not null auto_increment primary key
daje u pitanju kolona tipa auto_increment, moemo zadati
vrednost za nju, ili prepustiti MySQL-u da sam generie neku vrednost. (Pri upotrebi
kolona tog tipa se preputa MySQL-u da sam vrednost, ali postoje
i kao to je ovaj, gde imati vrednost koju eleti da
upotrebite.)
U redovima s podacima o slubama Human Resources i Marketing, u koloni
department ID zadato je NULL. To aktivira "magiju" mehanizma auto_increment
koji novu vrednost. Pogledajmo ta dobiti s tom komandom
lNSERT.
Ako paljivije pogledate pojedine komande INSERT, da su podaci koji se
u kolone tipa string ili date uokvireni polunavodnicima, na primer, 'Rese-
arch and Development'. Polunavodnici se ne koriste za tipove.
Ukoliko se podaci uokviruju polunavodnicima, ta treba uraditi kada podatak
sadri polunavodnike? Odgovor je da se polunavodnici moraju preslikati (engl. escape).
Jednostavnije ispred svakog polunavodnika treba dodati obrnutu kosu crtu
(\), na primer, 'o\'Leary'.
ta treba uraditi ako elimo da obrnuta kosa crta bude ba obrnuta kosa crta, bez
ikakvog posebnog U tom morate na isti preslikati i obrnutu
kosu- zamenite je s dve obrnute kose crte (\ \).
Podatke iz baze komande SELECT. Tu komandu veoma
detaljno razmotriti u narednih nekoliko poglavlja. Zasad je dovoljno znati da se,
ako zadate:
select * from ime_tabele;
svi podaci koji se nalaze u tabeli.
Ako zadate:
select * from department;
trebalo bi da na ekranu dobijete rezultate nalik na
----- ---------+----------------------+
l departmentiD l name
!---------------+----------------------+
42 Finance
128 Research and Develop
129 Human Resources
130 Marketing
----------- --+----------------------+
rows in set (0.01 sec)
Trebalo bi da bude vidljivo da je rezultat upotrebe kolone tipa auto_increment
vrtdnost koja je za jedan od vrednosti u koloni.
GB Poglavlje 5 Umetanj e, brisanj e i auri ranj e podataka
U MySQL-ovoj dokumentaciji stoji da komanda INSERT ima opti oblik:
INSERT [LOW_PRIORITY l DELAYED] [IGNORE]
[INTO] ime_ tabele [ (ime_kolone, ... ) J
VALUES ((izraz l DEFAULT), ... ),( .. . ), ...
[ ON DUPLICATE KEY UPDATE ime_kolone=izraz, ... J
ili INSERT [LOW_PRIORITY l DELAYED] [IGNORE]
[INTO] ime tabele [ (ime_kolone, ... ) J
SELECT ...
ili INSERT [LOW_PRIORITY l DELAYED] [IGNORE]
[INTO] ime_tabele
SET ime_kolone=(izraz l DEFAULT), ...
[ ON DUPLICATE KEY UPDATE ime_kolone=izraz, . . . J
U prime rima koje smo dosad videli, upotrebljen je prvi oblik komande. Obratite
panju na to da rezervisana INTO nije obavezna. Mogli smo je izostaviti i
upit s insert employee values, ali smatramo da INTO doprinosi razumljivosti
upita.
Kada koristite prvi oblik komande INSERT, za svaki novi red tabele morate zadati
listu vrednosti poredanih istim redosledom kao ciljne kolone tabele.
U ovom primeru, morali smo prvo da zadamo vrednost za kolonu department ID,
a zatim i za kolonu name jer je takva struktura tabele. Iz primera se vidi da ovaj oblik
da se jednom komandom INSERT umetne vie novih redova u tabel u.
Drugi oblik komande INSERT zavrava se komandom SELECT. Um.esto da vredno-
sti ovaj oblik da podatke te iz jedne ili vie tabela
baze podataka i da ih zatim umetnete u ciljnu tabelu.
oblik komande INSERT da zadate kolone u koje treba
umetnuti podatke. Primer upotrebe ovog oblika komande INSERT:
insert into department
set name='Asset Management';
Ovaj oblik da umetnete samo jedan red po komandi, ali ne morate da
zadate vrednosti za sve kolone. U ovom primeru, zadajemo vrednost samo za kolonu
name. Sve ostale kolone preuzeti podrazumevane vrednosti (u kolonama u kojima su
takve vrednosti definisane) ili vrednost NULL. U ovom koloni department ID
se vrednost NULL, usled se aktivira mehanizam auto_increment koji
generie novu vrednost u toj koloni. (U to se moete uveriti ako ponovo izdate
komandu select * from department.)
Komanda INSERT ima nekoliko neobaveznih odredaba. Pogledajmo ukratko kako
one deluju:
Moete zadati da se komanda INSERT izvrava s niskim prioriteom (opcija LOW
PRIORITY), ili da se izvravanje odloi (opcija DELAYED). Obe opcije da se
umetanje podataka u tabelu odloi dok vie ne bude nijednog klijenta koji poku-
ava da podatke iz tabele. Razlika ove dve opcije je u tome to
Komanda INSERT
opcija LOW PRIORITY blokira klijentski program koji podatke, dok opcija
DELAYED to ne Ukoliko izdate komandu za umetanje podataka s opcijom
LOW PRIORITY, moda morati da pre nego to budete mogli da
nastavite izvravanje upita iz svog klijentskog progran1a. Ako upotrebite opciju
DELAYED, vam dozvoljeno da izvravanje drugog upita, ali onda
morate imati u vidu da vai podaci biti upisani u tabelu dok ona ne bude
potpuno slobodna.
Opcija IGNORE je korisna prvenstveno kada vie redova istovremeno.
Standardno ponaanje je takvo da ukoliko jedan od redova koji pokuavate da
umetnete izazove greku tipa dupliran primarni ili duplirana vrednost u
koloni koja prihvata samo jedinstvene vrednosti, dolazi do greke a operacija
umetanja se ponitava. Ako upotrebite opciju IGNORE, greka se zanemaruje a
postupak umetanja se nastavlja s podacima iz reda.
Moete zadati da kolona treba da preuzme svoju podrazumevanu vred-
nost ako umesto vrednosti za kolonu zadate opciju DEFAULT.
Opcija ON DUPLICATE KEY UPDATE prua elegantno reenje problema duplira-
nog primam og ili duplirane jedinstvene vrednosti. Iza ove opcije sledi
komanda update koja menja vrednost primarnog ili
jedinstvenu vrednost u koloni tako da se ona vie "ne sudara" s podacima iz
novog reda.
Naredni kratak primer ilustruje upotrebe opcije ON DUPLICATE
J,Y UPDATE:
t' teate table warning
(
employeeiD int primary key not null references employee(employ-
' t I D),
count int default l
) t ype =InnoDB;
insert into warning (employeeiD)
values (6651)
on duplicate key update count=count+l;
Ova opcija je korisna u kada ne samo to elite da unesete jedinstvene
vrednosti, i da izvrite neku akciju, npr. da kada
w pojavi duplirana vrednost. Svaka vrsta evidentiranja takvog je korisna.
s primerom baze podataka employee, zaposlene kojima je dupliran pri-
IILlrni evidentirali bismo u tabeli warning (upozorenje).
Da biste evidentirali upozorenje koje se zaposlenog, izvrite ovu
komandu INSERT. da kolona count ima podrazumevanu vrednost 1 i za nju
111stc zadali drugu vrednost u komandi INSERT, u polje employeeiD upisana
vrtdnost 1 svaki put kada umetnete red u tabelu. Svaki naredni red koji u kolonu
mployeeiD istu vrednost (l) aktivira odredbu ON DUPLICATE KEY UPDATE
ko1.1 povcbva
70
Poglavlje 5 Umetanje, brisanje i auriranje podataka
Komanda REPLACE
Komanda REPLACE deluje komandi INSERT, s tom razlikom to ako do
dupliranja novi red koji zamenjuje , . v
U MySQL-ovoj dokumentaciji stoji da komanda REPLACE Ima sledeCI opsti obhk:
REPLACE [LOW PRIORITY l DELAYED]
ili
[INTO] ime_ tabele [ (ime_kolone, ... l l
VALUES (izraz, ... ), ( ... ), ...
REPLACE [LOW PRIORITY l DELAYED]
[INTO] tabele [ (ime_kolone, ... l l
SELECT ...
ili
REPLACE [LOW_PRIORITY l DELAYED]
[INTO] ime tabele
SET ime_kolone:izraz, ime_kolone:izraz, ...
Verovatno ste i sami s komandom INSERT.
Komanda DELETE
SQL-ova komanda DELETE brisanje redova iz tabele. U listingu 5.1 prika-
zano je nekoliko primera komandi delete, kao to je
delete from department;
U ovom obliku, komanda delete brie sve redove iz tabele department.
opcije WHERE moete zadati redove koji se briu, na primer:
delete from department where name:Asset Management';
Ova komanda brie samo redove koji ispunjavaju uslove zadate u odredbi where.
U ovom primeru, izbrisani samo redovi koji u koloni name sadre vrednost
Asset Management.
Nije da se briu ba svi redove. poto je to oblik
komande delete, moe vam se dogoditi daje grekom zadate bez odredbe WHERE.
Moete potedeti sebe te glavobolje ako na komandnoj liniji klijentskog programa .
mysql zadate opciju --safe-updates ili --i-am-a-dummy, kako je opisano
2 Kratak obilazak". Te opcije vas da izbriete redove (Ih da Izmemte nJihov
ako odredbe WHERE ne zadate uslov za tj. morate zadati da elite
da izbriete samo redove koji sadre vrednosti
U MySQL-ovoj dokumentaciji stoji da komanda DELETE ima opti oblik:
DELETE [LOW_PRIORITY] [QUICK] FROM ime tabele
[WHERE uslov]
[ORDER BY ... ]
[LIMIT broj_redova]
Komanda DELETE
ili
IlE LETE [LOW _PRIORITY] [QUICK] ime tabele [. *] [, ime tabele [. *] ... ]
FROM reference na tabele
[WHERE uslov]
.il i
DELETE [LOW_PRIORITY] [QUICK]
FROM ime_tabele[.*] [, ime tabele[.*] ... ]
USING reference na tabele
[WHERE uslov]
Prvi oblik smo upotrebili u dosadanjim primerima.
Druga dva oblika brisanje redova iz jedne ili vie tabela uz referenci-
l anje drugih tabela. Na primer:
delete employee, employeeSkills
t r om employee, employeeSkills, department
where employee.employeeiD : employeeSkills.employeeiD
nd employee.departmentiD : department.departmentiD
nd department.name:'Finance;
Ovaj primer brie sve zaposlene koji rade u slubi Finance i sve zapise o njihovim
kvalifikacijama. Obratite panju na to da se redovi briu samo iz tabela
employee i employeeSkills Uer su navedene u odredbi delete), ali ne iz tabele depart-
ment U er je navedena samo u odredbi from).
Redovi biti izbrisani iz tabela navedenih u odredbi delete, dok tabele
navedene u odredbi from biti pretraene ali se redovi iz njih brisati, osim ako su
navedene i u odredbi delete.
Obratite panju na to da je ovaj primer sloen jer obuhvata tri tabele!
Za ilustrovanje ovog primera potrebne su nam tri tabele. vam savetujemo da
ovaj primer i opciju WHERE ponovo poto odeljak o spajanju tabela
ll poglavlju 7, "Sloeniji upiti".
U ovoj odredbi where upotrebili smo nekoliko novina: operator AND i notaciju
tabela. kolona. operatora AND spojili smo vie uslova. To je primer jedno-
stavnog AND. Upotrebili smo i notaciju employee. employee ID. Ta notacija
"kolona employeeiD tabele employee". U naredna dva poglavlja detaljnije
objasniti te koncepte.
oblik komande DELETE je drugom obliku, s tom razlikom to u ovom
briemo redove samo iz tabela navedenih u odredbi FROM dok referenciramo
tabele u opciji USING. Na primer:
de lete from employee, employeeSkills
\! s ing employee, employeeSkills, department
where employee.employeeiD : employeeSkills.employeeiD
tnd employee.departmentiD: department.departmentiD
,md department. name: ' Finance' ;
72
Poglavlje 5 Umetanje, brisanje i auriranje podataka
Ova komanda je ekvivalentna komandi iz prethodnog pr imera, jedina razlika je
sintaksa.
Opti oblik komande DELETE prihvata i druge neobavezne odredbe:
Odredba LOW_PRIORITY deluje na isti kao U komandi INSERT.
Odredba QUICK moe ubrzati komandu DELETE jer nalae MySQL-u da odloi
neke od poslova odravanja indeksa dok brie podatke iz tabele.
Odredba ORDER BY redosled brisanja redova. Najkorisnija je u kombi-
naciji sa opcijom LIMIT - na primer, kada elite da izbriete iz tabele samo n
najstarijih redova.
Odredba LIMIT maksimalan broj redova koji komanda DELETE srne da
izbrie. Korisna je u kombinaciji sa odredbom ORDER BY ili kada elite da sp re-
brisanje prevelikog broja redova.
Komanda TRUNCATE
Komanda TRUNCATE brie sve redove iz tabele. Na primer:
TRUNCATE TABLE employee;
Ovaj upit brie sve zaposlene iz tabele employee. Bri je od komande DELETE jer
radi tako to najpre uklanja celu tabelu a zatim pravi istu takvu ali praznu.
Vodite o tome da komanda TRUNCATE nije u transakcionu obradu.
Komanda UPDATE
SQL-ova komanda UPDATE auriranje redova u tabelama baze
podataka. Na primer, pretpostavimo da je jedan od zaposlenih preao na drugo radno
mesto:
update employee
set job='DBA'
where employeeiD='6651';
Ova komanda menja vednost u koloni j ob za zaposlenog je ifra 6651.
U MySQL-ovoj dokumentaciji stoji da komanda UPDATE ima oblik:
UPDATE [LOW_PRIORITY) [IGNORE) ime_tabele
ili
SET ime kolonel=izrazl [, ime kolone2=izraz2 ... )
[WHERE uslov]
[ORDER BY ... )
[LIMIT broj_redova]
UPDATE [LOW_PRIORITY) [IGNORE) ime_tabele [, ime_tabele ... )
SET ime_kolonel=izrazl [, ime_kolone2=izraz2 ... )
[WHERE uslov]
Komanda UPDATE je po mnogo komandi DELETE.
Grupno unoenje podataka komande LOAD DATA INFILE
Moete dodati neobavezno opciju WHERE da biste aurirali samo redove,
1 d o je izosta vite, sve redove tabele. U ovom moe vam se
,1, ,Koditi da zaboravite opciju WHERE- se kad je jedan moj povrni kolega zadao
111 liO nalik na
1 ul te user
l password='test';
Ovaj primer jo jednom korist od opcije -- i-am-a-dummy programa mysql,
kada imate posla s neznalicama.
Druga navedena verzija komande UPDATE auriranje vie tabela jednom
lnluandom. Postupak je brisanju podataka iz vie tabela istovremeno, koje smo
"hJ.ISnili u prethodnom odeljku. Imajte u vidu da biti aurirane samo kolone koje
1 111.-ito navedete u odredbi SET.
Sve ostale odredbe komande UPDATE opisali smo ranije. Odredbe LOW_PRIORITY i
IIINORE deluju na isti kao U komandi INSERT. Odredbe ORDER BY i LIMIT deluju
11.1 1sti kao u komandi DELETE.
rupno unoenje podataka komande
LOAD DATA INFILE
l omanda LOAD DATA INFILE grupno prenoenje podataka iz tekstualne
d.tloteke u tabelu, bez potrebe da piete komande INSERT. ovu tehniku,
1110gli smo da napunimo podacima tabelu department na opisan u nastavku ovog
11kljka. U listingu 5.2 prikazan je sadraj datoteke s podacima o nazivima slubi koje
lll'ba uneti u tabelu department.
l bli ng 5.2 department_infile.txt
l
128
IWLL
NULL
Finance
Research and Development
Human Resources
Marketing
Ova datoteka je u standardnom formatu za komandu LOAD DATA INFILE, to
d.1 sc svaki red podataka nalazi u zasebnom redu datoteke, a kolone su razdvojene zna-
' una za tabulator. (To se moe podesiti i to opisati u nastavku.)
Podatke moete uneti u tabelu department komande LOAD DATA
INFILE:
lo d data local infile 'department infile.txt'
Into table department; -
Ova je korisna kada treba u podatke iz formata neke
1li ugc baze podataka, iz tabele programa za tabelarne ili iz CSV (comma-
\l'parated values) datoteke.
lli Pn1JI;1vlj b Umetanje, brisanje i auriranje podataka
Komanda LOAD DATA INFILE zahteva da korisnik ima pravo FILE- detaljnije
infom1acije o tome potraite u poglavlju ll, "Upravljanje pravima korisnika",
ako imate problema pri izvravanju ove komande. Pravo izvravanja ove komande
je iz ozbiljnih bezbednosnih razloga- na primer, da biste
korisnike da bilo ta unesu u /etc/passwd.
Opti oblik komande LOAD DATA INFILE izgleda ovako:
LOAD DATA [LOW_PRIORITY l CONCURRENT] [LOCAL] INFILE
'imeDatoteke.txt'
[REPLACE l IGNORE]
INTO TABLE ime_tabele
[FIELDS
[TERMINATED BY ' \t' ]
[[OPTIONALLY] ENCLOSED BY '']
[ESCAPED BY '\\' ]
[LINES TERMINATED BY '\n']
[IGNORE broj LINES]
[ (ime_kolone, ... ) l
Komanda LOAD DATA INFILE ima odredbe:
Odredba LOW PRIORITY deluje na isti kao u komandi INSERT, tj. da
drugi klijentski programi zavre podataka iz tabele. Odredba CONCUR-
RENT, s druge strane, drugim klijentskim programima da
podatke iz tabele dok je vi punite podacima komande LOAD DATA
INF ILE .
U navedenom primeru zadali smo neobaveznu rezervisanu LOCAL, koja
da se datoteka s podacima nalazi na klijentskom (lokalnom) Ako ne
zadate ovu odredbu, MySQL traiti datoteku na serveru.
Ako se pri punjenju tabele podacima dupliraju, odredbe REPLACE i
IGNORE pruaju dve reavanja tog problema. Opcija REPLACE nalae
MySQL-u da red zameni novim redom, dok opcija IGNORE nalae
MySQL-u da zadri red.
Odredbe FIELDS i LINES opisuju strukturu datoteke s podacima. U optem
obliku komande LOAD DATA INFILE navedene su podrazumevane vrednosti ovih
opcija - svaki red s podacima smeten je u zaseban red datoteke, a vrednosti
kolona razdvojene su zarezima.Vrednosti kolona moete navodnicima,
a obrnute kose crte moete preslikati svaki znak (kao to je polunavod-
nik) koji bi MySQL moda pogreno .
Odredba IGNORE broj LINES nalae MySQL-u da zanemari prvih
broj redova.
Poslcdnjom odredbom zadajete da elite da popunite podacima samo navedene
kolone tabele.
Saetak
Za prenoenje podataka iz jednog formata u drugi, se koristi CSV format
(e omma-separated values- vrednosti razdvojene zarezima). Mnogi programi i
pesu datoteke u tom formatu, a jedan od najpoznatijih je Microsoftov Excel. U listingu
1. ) prikazana je kratka CSV datoteka dobijena iz Excela.
11\ting 5.3 new_programmers.csv
tMme, Job, DepartmentiD
.Julia Lenin,Programmer,128
1 louglas Srni th, Programmer, 12 8
'l' i m O' Le ary, Programmer, 128
Ove podatke moete preneti u tabelu employee upita:
load data infile 'e:\\new_programmers.csv'
Into table employee
l ields terminated by ,
lines terminated by '\n'
lgnore 2 lines
(name, job, departmentiD);
Kao to vidite, za prenoenje ovih podataka naveli smo vie opcija nego kada su
podaci u podrazumevanom formatu za komandu LOAD DATA INFILE. Vredno je

da smo putanju datoteke zadali u formatu u Windowsu/
DOS-u, pu tanja sadri obrnutu kosu crtu, morali smo da je preslikamo
dodatne kose crte. Zbog toga je putanja zada ta u obliku
'e:\ \new_programmers. csv'.
Verovatno podrazumevate da su polja u CSV datoteci razdvojena zarezima, ali se
to ipak mora zadati u komandi .
Nije neophodno da zadate da se redovi zavravaju znakom za nov red, ali
mi smo se opredelili da to ipak
Poto su prva dva reda u datoteci zapravo zaglavlje, oni ne sadre podatke i treba
ih izostaviti pri podataka iz datoteke.
Poto datoteka ne sadri ifre zaposlenih (kolona employeeiD), da bismo preneli
tri kolone podataka u kolone tabele, da navedemo ciljne kolone
(i njihov redosled) u koje se podaci prenose. U ovom primeru, to su (name,
job, departmentiD).
Saetak
U ovom poglavlju razmatrali smo umetanja, brisanja i auriranja podataka u
tabelama baze podataka.
76
Poglavlje 5 Umetanje, brisanje i auriranje podataka
Umetanje podataka
Vrednosti znakovnog tipa treba da budu navodnicima. Polunavodnike
ili obrnute kose crte unutar vrednosti treba preslikati obrnute kose crte.
Komanda INSERT umetanje podataka u tabelu:
INSERT [LOW PRIORITY l DELAYED] [IGNORE]
[INTO] ime_ tabele [ (ime_kolone, ... ) l
VALUES ((izraz l DEFAULT), ... ),( ... ), ...
[ ON DUPLICATE KEY UPDATE ime_kolone=izraz, ... ]
ili INSERT [LOW_PRIORITY l DELAYED] [IGNORE]
[INTO] ime_tabele [(ime_kolone, .. . )]
SELECT ...
ili INSERT [LOW_PRIORITY l DELAYED] [IGNORE]
[INTO] ime_tabele
SET ime kolone=(izraz l DEFAULT), ...
[ ON DUPLICATE KEY UPDATE ime_kolone=izraz, . . . l
Komanda REPLACE deluje na isti kao komanda INSERT, s tom razlikom to u
dupliranja zamenjuje redove. Ako se to dogodi u komandi
INSERT, komanda se ne izvrava ili aktivira odredbu ON DUPLICATE KEY UPDATE.
Brisanje podataka
Izbegnite katastrofu opcije --i-am-a-dummy.
Komanda DELETE brie podatke iz atebele:
DELETE [LOW_PRIORITY] [QUICK] FROM ime tabele
[WHERE uslov]
[ORDER BY ... ]
[LIMIT redova]
ili DELETE [LOW_PRIORITY] [QUICK] ime tabele [. *]
[,ime tabele[.*] ... ]
- FROM reference_na_tabele
[WHERE uslov]
ili DELETE [LOW_PRIORITY] [QUICK]
FROM ime_tabele[.*] [, ime_tabele[.*] ... ]
USING reference_na_tabele
[WHERE uslov]
Komanda TRUNCATE TABLE brie sve redove tabele.
Auriranje podataka
Podatke u tabelama aurirate komande UPDATE TABLE:
UPDATE [LOW_PRIORITY] [IGNORE] ime_tabele
SET ime_kolonel=izrazl [, ime kolone2=izraz2 ... ]
[WHERE uslov]
[ORDER BY ... ]
[LIMIT redova]
ili UPDATE [LOW_PRIORITY] [IGNORE] ime_tabele [, ime_tabele ... ]
SET ime_kolonelizrazl [, ime kolone2 izraz2 ... ]
[WIIERE us 1 ov]
LOAD DATA INFILE
Komanda LOAD DATA INFILE prenoenje sadraja tekstualne dato-
teke u tabelu:
LOAD DATA [LOW_PRIORITY l CONCURRENT] [LOCAL] INFILE
ime_datoteke.txt
[REPLACE l IGNORE]
INTO TABLE ime tabele
[FIELDS
[TERMINATED BY '\t']
[ [OPTIONALLY] ENCLOSED BY ' ']
[ESCAPED BY '\\' ]
[LINES TERMINATED BY \n']
[IGNORE broj LINES]
[ (ime_kolone, ... ) l
Pitanja
1. Koja od narednih komandi uspeno nov red u tabelu employee?
a)
b)
e)
d)
insert into employee values
set employeeiD=NULL, name='Laura Thomson',
job='Programmer', departmentiD=128;
insert employee values
(NULL, 'Laura Thomson', 'Programmer', 128);
insert into employee values
(NULL, Laura Thomson, Programmer, 128);
insert employee values
(NULL, 'Laura O'Leary', 'Programmer', 128);
2. Komanda REPLACE
a) je komandi INSERT, s tom razlikom to se u dupliranja vred-
nosti red zamenjuje novim redom
b) je komandi INSERT, s tom razlikom to se u dupliranja vred-
nosti red zadrava a novi zanemaruje
e) je komandi UPDATE, s tom razlikom to se u dupliranja vred-
nosti red zamenjuje novim redom
d) je komandi UPDATE, s tom razlikom to se u dupliranja vred-
nosti red zadrava a novi zanemaruje
3. Opcija --i-am-a-dummy zadata u klijentskom programu mysql
a) unoenje podataka
b) auriranje podataka ako ni rc vrednost
78 Poglavlje 5 UmetanJe, bnsanJe 1 azumanJe pooataKa
e) brisanje podataka ako nije zadata vrednost
d) i b) i e)
4. U standardnom formatu datoteke koj u zadate u komandi LOAD DATA INFILE
podaci su razdvojeni
a) zareztma
b) razmacima
e) znakovima za tabulator
d) znakovima vertikalna crta
5. Neobavezna opcija LOCAL U komandi LOAD DATA INFILE
a) zadaje da klijent i server rade na istom
b) zadaje da se datoteka s podacima nalazi na serveru
e) zadaje da se datoteka s podacima nalazi na klijentskom
d) zadaje da serverski program radi na lokalnom
Vebe
1. Napiite grupu komandi INSERT kojih napuniti podacima tabele
u svojoj bazi podataka porudzbine.
2. Izbriite podatke iz svojih tabela.
3. Napravite datoteku koja sadri iste podatke koje ste uneli u l i prenesite ih
u svoju bazu podataka porudzbine komande LOAD DATA INFILE.
Odgovori
Pitanja
l. b
2. a
3. d
4. e
5. e
Vebe
Ne postoji jedno reenj e vebi iz ovog poglavlj a. Potrudite se samo da ih sve
uradite do kraja.
U poglavlju
U poglavlju 6, upita u MySQL-u", da se bavimo SQL-ovom
"dcvojkom za sve", tj. komandom SELECT i njenim brojnim varijantama.
6
upita u MySQL-u
D o sAD SMO OBJASNILI PROJEKTOVANJE, izradu i punjenje podacima MySQL-ove
haze podataka. U ovom i u dva naredna poglavlja drugu stranu
postupka: podataka iz baze.
U ovom poglavlju detaljnije objasniti SQL-ovu komandu SELECT. To je
wrovatno najvanija komanda jezika SQL, koja redova iz
wdne ili vie tabela baze podataka.
U ovom poglavlju kako se redovi iz jedne tabele baze poda-
Lika. teme:
Opti oblik komande SELECT
Jednostavni upiti
podataka samo iz kolona
Alijasi kolona
Upotreba odredbe WHERE za samo redova
Upotreba odredbe GROUP BY
grupa podataka odredbe HAVING
Sortiranje rezultata upita opcije ORDER BY
broj a redova rezultata opcij e LIMIT
U poglavlju 7, "Sloeniji upiti" , se sloenijim upitima, a upi-
tima koji obuhvataju vie tabela, te podupitima i raznim vrstama spoj eva
tabela.
U poglavlju 8, "Upotreba MySQL- ovih funkcija u komandi SELECT",
brojne funkcij e koj e postoj e u MySQL- u da bi vam pomogle pri upo-
trebi upita.
Najpre pogledati opti oblik komande SELECT.
HU roglaVIJe b K.OnscenJe up1ta u My:>uL-u
Opti oblik komande SELECT
Komanda SELECT ima opti oblik:
SELECT kolone
FROM tabele
[WHERE uslovi]
[GROUP BY grupe
[HAVING uslovi_za_grupe]]
[ORDER BY kolone_za_sortiranje]
[LIMIT broj] ;
Ovo nije potpuna sintaksa- je u narednom poglavlju- ali ilustruje
opti oblik komande. Odredbe koje su ovde navedene u ovom poglavlju.
Komanda SELECT ima veliki broj neobaveznih odredaba. Ne morate ih uvek navo-
diti, ali ako ih upotrebite, morate ih zadati redosledom koji je prikazan u opte m
obliku komande.
Jednostavni upiti
Primer najjednostavnijeg oblika komande SELECT izgleda ovako:
select * from department;
Ako ovaj upit izvrite s podacima koji postoje u bazi podataka employee, trebalo bi
da dobijete rezultate nalik na
+---------------+--------------------------+
l departmentiD l name l
+---------------+--------------------------+
42 Finance l
128 Research and Development l
129 Human Resources l
130 Marketing l
+---------------+--------------------------+
4 rows in set (0.00 sec)
Ovaj upit je u sve podatke iz zadate tabele - tj. sve redove i sve kolone iz
tabele department.
Postupak moete isprobati i na nekoj drugoj tabeli- na primer, sve redove
i sve kolone iz tabele employeeSkills.
Razume se, sutina relacione baze podataka svakako nije u tome da vam daje sve
podatke koje ste u nju uneli, da vam da podatke.
podataka iz kolona
U narednom koraku kolone iz kojih podatke. Znak * u
prethodnom primeru upita (select * from department) "sve kolone tabele" .
Umesto zvezdice, moete zadati samo kolone iz kojih vam trebaju podaci. To moe
biti samo jedna kolona, nekoliko kolona tabele, ili sve kolone tabele
Apsolutna 1mena oaza pooataka 1 tabel;
rcdosledom koji vam treba. Imena kolona treba da zadate u obliku liste vrednosti
r:tzdvojenih zarezima.
upit samo vrednosti iz polja employeeiD i name tabele employee:
aelect name, employeeiD from employee;
Ako ovaj upit izvrite u bazi podataka employee, trebalo bi da dobijete rezultate
nalik na
---------------+-------------+
l name l employeeiD
---- -----------+-------------+
Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith
6651
7513
9006
9842
---- ---------+---------------+
rows in set (0.00 sec)
Kao to vidite, prikazane su samo vrednosti iz kolona koje smo zadali u upitu.
Obratite panju na to da su kolone prikazane redosledom koji smo zadali u upitu, a ne
rcdosledom kojim su definisane u emi baze podataka.
Apsolutna imena baza podataka i tabela
Dodatan oblik notacije koji bi trebalo da imate u vidu zadavanje apsolut-
nih imena baze podataka i tabele s kojom elite da radite. Kolonu name tabele
employee moemo navesti u upitu kao employee. name.
select employee.name
from employee;
Trebalo bi da rezultati ovog upita budu nalik na
---------------+
l name
t---------------+
Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith
--------- --- ---+
4 rows in set (0.41 sec)
tome, moete zadati koju tabelu u kojoj bazi podataka imate na umu,
nn primer:
select name
irom employee.employee;
(Trebalo bi da ovog upita dobijete isti rezultat kao prethodnog
upita.)
t"OglaVIJe O 1\0riSCenJe UflllCI U IVIY.:>UL-U
U ovom primeru, navodimo da elimo podatke iz tabele employee koja se
nalazi u bazi podataka employee. Notacija u ovom je baza_podataka . tabela.
Ako je potrebno, moete zadati kojoj bazi podataka i tabeli pripada kolona.
Isti primer moe se napisati sintakse baza _podataka. tabela . . kolona u sle-
obliku:
select employee.employee.name
from employee;
Ova sintaksa nije korisna za ovakve jednostavne upite, ali kad budete
preli na sloenije upite, ona vam da na nedvosmislen zadajete
podatke koji su vam potrebni.
Alijasi
Sada bi trebalo da objasnimo koncept alijasa kolona i tabela.
Kolonama i izrazima u komandi SELECT moete dodeliti imena, koja
se prikazivati u rezultatima. Na primer, moemo upotrebiti upit:
select name as employeeName
from employee;
U ovom upitu preimenovali smo kolonu name u employeeName, ali samo u kon-
tekstu ovog upita. Rezultati izvravanja ovog upita u bazi podataka employee izgle-
daju ovako:
+---------------+
l employeeName
+---------------+
Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith
+---------------+
4 rows in set (0.01 sec)
Kao to vidite, sadraj kolone name sada je prikazan ispod zaglavlja employeeName.
Identifikator employeeName poznat je kao a/ijas (engl. alias). Postoje pra-
vila o tome ta se moe a ta se ne moe raditi sa alijasima, koja objasniti kad
na tu temu.
Navedeni primer alijasa nije koristan. pravu alijasa shva-
kad da piete sloenije upite i upite u kojima se neto
Alijasi se mogu zadavati i za tabele, kao u primeru:
select e.name
from employee as e;
Trebalo bi da rezultati ovog upita budu isti kao da smo ga napisali bez upotrebe ali-
j asa. Ovaj notacije koristan kada u narednom poglavlju da
izvravate upite koji obuhvataju vie tabela.
upuucuct uurcuuc vvncnc Let ucnctVCifiJC uurcucr1111 rt:uuvd
U poslednja dva primera rezervisana AS nije bila neophodna. Upit smo mogli
da napiemo i u obliku:
oelect name employeeName
Lrom employee;
ili
select e.name
from employee e;
Upite moete pisati u obliku koji smatrate najpogodnijim. To je pitanje
stila programiranja. Kao to videti u ovom poglavlju i na mnogim drugim
mestima u knjizi, isti upit moe se napisati na vie Kao i u drugim
programskim jezicima, stil svakog programera na SQL-u razlikuje se od ostalih.
Upotreba odredbe WHERE za
samo redova
Dosad smo razmatrali svih podataka sadranih u tabeli i svih
podataka samo iz kolona. Sada na samo
redova. To je korisno jer treba da iz jedne ili vie tabela te samo zapise koji
ispunjavaju uslove. Ta postaje jo vanija kada je potrebno
tati samo nekoliko traenih redova iz veoma obinme tabele.
To se moe obaviti odredbe WHERE komande SELECT. Jednostavan primer
bio bi
select employeeiD, name
from employee
where job='Programmer';
(Uzgred, imajte u vidu da se tekst upita moe rasporediti u vie redova. Svaki upit
se zavrava znakom i zarez. (;). Upite piemo na taj da bi bili
Rezultati izvravanja ovog upita u bazi podataka employee izgledaju ovako:
+- --- - --------+--------------+
l employeeiD l name
+--- ----------+--------------+
6651 l Ajay Patel l
7513 l Nora Edwards l
+- ------------+--------------+
2 rows in set (0.42 sec)
U odredbi WHERE zadali smo uslov zbog kojeg se izdvajaju samo redovi tabele koji
ga ispunjavaju - u ovom primeru, to su zaposleni koji rade kao programeri .
Obratite panju na to da smo u upitu kombinovali uslov s kolonama koje nam tre-
baju (employeeiD i name) da bismo samo podatke koji su nas zanimali .
U ovom primeru, u odredbi WHERE zadali smo ispitivanje jednakosti. Obratite
panju na to da u SQL-u znak = slui za ispitivanje jednakosti. To je od mn -
gi b drugih programskih jezika, u kojima se za tu namenu koristi == ili eq.
84 PoglavlJe o KonscenJe up1ta u My:;>UL-u
Postoji veliki broj funkcija koje se mogu zadati u odredbi WHERE i koje detaljno
objasniti u poglavlju 8. Zasad navesti samo operatore koji se koriste:
Jednakost, ili=, to smo koristili.
Nejednakost koja se pie kao ! = ili <>.
Sve kombinacije > od), < (manje od), >= Uednako ili od), i <= Ued-
nako ili manje od).
IS NULL i IS NOT NULL, kojih se ispituje da li vrednost jeste
ili nije NULL. To ne moete izraza nekavrednost=NULL. (Zbog
to ne moe, u poglavlju 8.)
operatori koje biste i koji se koriste
u kombinaciji s operatorima za Na primer, moete ispitati da li je
nekavrednost > nekadrugavrednost*lO.
Standardni operatori AND, OR i NOT, koji se koriste za povezivanje vie
uslova. da imaju nii prioritet od operatora za na primer,
izraz plata > 30000 AND plata < 50000 se kako biste i
Osim operatora, u nekim primerima i funkcije. Funkcija count (l
prebrojavanje redova koje je upit Na primer:
select count(*) from employee;
Ovaj upit pokazuje koliko redova sadri tabela employee.
I najzad, standardni redosled prioriteta delova izraza moete menjati
tako to ih grupiete zagrada.
primer je neto sloeniji upit u kojem je zada ta odredba WHERE:
select * from assignment
where employeeiD=6651 and hours > 8;
Ovaj upit iz kolone assignment sve poslove na kojima je zaposleni je
ifra employeeiD 6651 (Ajay Pate!) radio vie od osam
Vano je da u odredbi WHERE nije dozvoljena upotreba alijasa za kolone
tabela, morate navesti izvorno ime kolone. To je ANSI standarda za
jezik SQL. Razlog je to to vrednost kolone predstavljene alijasom moda biti
poznata u trenutku ispitivanja uslova zadatih u odredbi WHERE.
Uklanjanje dupliranih vrednosti
opcije DISTINCT
rezervisane DISTINCT navodite da u rezultatima upita ne elite da vidite
duplirane vrednosti. Na primer, upit:
select job
from employee;
d.IJ C ove podatke:
--- ------------------+
job
--- ------------------+
Programmer
Programmer
Systems Administrator
OBA
-- -------------------+
rows in set (0 . 01 sec)
Uklanj anje dupli ran ih vrednosti opcije DISTINCT
Obratite panju na to da se podatak Programmer pojavljuje dvaput jer postoji
ll dva reda tabele. Upit je u listu svih vrednosti iz kolone job tabele employee.
A sada, pogledaj te upit:
lect distinct job
It om employee;
Ovaj upit daje rezultate:
-- -------------------+
job
--- -------- - ---------+
Programmer
Systems Administrator l
OBA 1
- --------------------+
l rows in set (0.04 sec)
U ovom primeru duplikati se ne pojavljuju.
U ovom razlika ne izgleda tako - naravno, drugi skup rezultata je
tlt' to uredniji, ali poboljanje i nije tako veliko. Bilo bi primetnije kada biste imali
opsenu tabelu s velikim brojem podataka koji se ponavljaju, a ipak biste dobili
podatke.
S druge strane, pogledajte upit:
mysql> select count(job) from employee;
--- -------+
count (job) 1
-- --------+
4 l
-- --------+
row in set (0 . 01 sec)
Prema rezultatima ovog upita, kolona j ob sadri vrednosti . To navodi na
jer nije da u toj koloni postoje vrednosti. Ako
pogledate podatke u tabeli, da kolona j ob sadri samo tri vrednosti .
Lako vam se moe dogoditi da grekom zadate prethodni upit kada ste imali na
11111u upit:
l ct count(distinct job) from employee;
86
Poglavlje 6 upita u MySQL-u
On daje rezultat:
+---------------------+
l count(distinct job) l
+---------------------+
3 l
+---------------------+
1 row in set (0.05 sec)
Ovaj rezultat pokazuje koliko se razli{itih vrednosti nalazi u koloni job, to je koris-
niji podatak.
Upotreba odredbe GROUP BY . , . . V
odredba koju razmotriti jeste GROUP BY koJa omogucava gruptsanJe u ct-
tanih redova. Ona je zaista korisna samo kada je upotrebite u kombinaciji s funkcijama
koje deluju na grupe redova. Jedina takva funkcija koju smo dosad pomenuli jeste
count (), ali u poglavlju 8 vie drugih.
Pogledajte upit:
select count(*), job
from employee
group by job;
Ovaj upit prebrojava zaposlene po radnom mestu- tj. broj zaposlenih. po
svakom radnom mestu. Ako izvrite ovaj upit u bazi podataka employee, trebalo bt da
dobijete rezultat nalik na
+----------+-----------------------+
l count(*) l job l
+----------+---------------- - ------+
l l DBA l
2 l Programmer l
1 l Systems Administrator l
+----------+----------------- - -----+
3 rows in set (0.04 sec)
Postoje dve razlike na koji odredba GROUP BY radi u MySQL-u
i u standardnom ANSI SQL-u.
U ANSI SQL-u, u odredbi GROUP BY morate navesti sve kolone koje ste zadali
u odredbi SELECT. MySQL dozvoljava da u odredbi GROUP BY zadate i dodatna polja
kojih nema u odredbi SELECT. .
MySQL da izaberete redosled grupa kojim se prikazuju rezultati. Podra-
zumeva se redosled. Ako elimo da ponovimo poslednji upit, ali tako da se
rezultati prikau redosledom, moemo upotrebiti upit:
select count(*), job
from employee
group by job dese;
Sortiranje rezultata odredbe ORDER BY
ltlzultati biti nalik na
-- ---+---------------------- -+
ount (*) l job l
--- ---+-----------------------+
l l Systems Administrator l
2 l Programmer l
l l DBA l
-- ----+-----------------------+
oows in set (0 . 04 sec)
)(Jo to vidite, nazivi radnih mesta sada su prikazani abecednim redo-
lo dom. Moete da zadate opciju ASC (od engl. ascending, redosled), ali poto se
1 q tlclosled podrazumeva, nema potrebe da ga zadajete.
l/dvajanje grupa podataka
opcije HAVING
odredba komande SELECT jeste odredba HAVING. Odredba GROUP BY kojoj je
ol odata odredba HAVING deluje na kao komanda SELECT kojoj je dodata
ou lc cdba WHERE. Na primer:
1 ct count(*), job
l e om employee
11 oup by job
lt.,ving count (*l =l;
Ovaj upit sva radna mesta u firmi na kojima je zaposlen samo po jedan slu-
: hl' nik. Trebalo bi da rezultati budu nalik na
---- ----+-----------------------+
count(*) l job l
----- -- -+-----------------------+
l l DBA l
l l Systems Administrator l
-- ------+---------------------- -+
' rows in set (0.05 sec)
Prema naem dosadanjem iskustvu, u jeziku SQL brkaju odredbe
WII ERE i HAVING. Odredbu WHERE moete upotrebiti U gotovo svakom upitu koji snu-
\li tc da biste zadali uslove koji se odnose na redove. Odredbu HAVING
ori stite kada uslov treba da vai za celu grupu.
Sortiranje rezultata odredbe ORDER BY
odredba komande SELECT jeste odredba ORDER BY koja sortiranje
redova po jednoj ili vie kolona. Redosled sortiranja moe biti to
st' sa ASC, ili to se sa DESC. Na primer:
' 1 ct *
l t om employee
otd r by j ob a se , n me d sc ;
BB Poglavlje 6 upita u MySQL-u
Ovaj upit sve redove i kolone iz tabele .. R:zul.tati. sortirani
po abecednom redosledu sadraja kolone job, a .ako dvoje 1h v1se ljudl 1s.to radno
mesto, oni biti sortirani abecedmm redosledom po unemma l prezl-
menima. Rezultati upita izgledaju ovako:
+ --------------+-----------------------+--------------+
+------------ - 1 b l departmentiD l
1 employeeiD l name JO --------------+
+------------+---------------+-----------------------i 42 l
l 9842 l Ben Smith DBA l 128 l
l 7513 l Nora Edwards Programmer l 128 l
1 6651 1 Ajay Patel Programmer
l
9006 1 candy Burnett Systems Administrator l 128 l
+------------+---------------+-----------------------+--------------+
4 rows in set (0.02 sec)
Ako za kolonu zadate odredbu ORDER BY bez opcije ASC ili DESC, se
ASC. Ukoliko ne zadate odredbu ORDER BY, nita se ne moe pretpostav1t1 o redosledu
redova u skupu rezultata.
broja redova rezultata
odredbe LIMIT . . .
Poslednja odredba komande SELECT koju razmotriti u ovom poglavlju jeste
odredba LIMIT. . . . le-
Odredba LIMIT broj redova rezultata koje up1t daje. Na pnmer, pog
dajte upit:
select *
from employeeSkills
limit 5;
Ovaj upit daje samo prvih pet redova koji zadati uslov. U ovom slu-
to je prvih pet redova uz tabele, kao sto je pnkazano:
+------------+-------+
1 employeeiD l skill l
+------------+-------+
6651 l Java l
6651 l VB l
7513 l e l
7513 l Java l
7513 l Perl l
+----------- -+-- --- --+
5 rows in set (0.44 sec)
Moete zadati i da elite podskup redova od prvih n. Ako p:e-
thodnog upita da redove od 6 do 8, to uraditi na sledeCl nacm:
select *
from employeeSkills
limit 5, 3;
Saetak
Kada u odredbi LIMIT za damo dva parametra, prvi je relativni pomak (red od
kojeg a drugi je maksimalni broj redova koji elimo da se
Uporedite to s prethodnim kada zadamo samo jedan parametar, on predsta-
vlja maksimalni broj redova koji elimo da se
Kada zadajemo pomak, on od O (kao to se vidi u prethodnom primeru-
za esti red zadali smo pomak 5). Prvi navedeni primer upotrebe odredbe LIMIT
redove od O do 4, a drugi primer redove od 5 do 7.
Ako kao vrednost drugog parametra zadate -1, upit redove od pomaka
do kraja tabele.
Odreba LIMIT se koristi u kombinaciji sa odredbom ORDER BY da bi rede-
sled redova u rezultatima upita imao smisao. Imajte u vidu da bez odredbe
ORDER BY, redosled redova rezultata nije predvidljiv.
Ova odredba je korisna u We b ili GUI aplikacijama koje koriste MySQL
jer jednostavan mehanizam podele rezultata na stranice.
Saetak
Komanda SELECT ima opti oblik:
SELECT kolone
FROM tabele
[WHERE uslovi]
[GROUP BY grupa
[HAVING uslovi_ za_grupe]]
[ORDER BY kolone_za_sortiranje]
[LIMIT broj] ;
Odredba select * sve kolone; select ime kolone samo nave-
denu kolonu.
Tabele moemo navoditi kao baza_podataka. tabela a kolone kao tabe-
la. kolona ili baza_poda taka. tabela. kolona da bismo izbegli dvosmislenost.
Alijasi su alternativna imena za tabele i kolone, a zadaju se na
select kolona as alijas_kolone
from tabela as alijas_tabele;
Odredba WHERE slui za redova koji ispunjavaju zadate uslove.
Rezervisana DISTINCT uklanja duplirane podatke iz skupa rezultata.
Odredba GROUP BY redove rezultata grupu po grupu. Koristi se prven-
stveno u kombinaciji s funkcijama koje deluju na grupe redova, kao to je funk-
cija count () .
Odredba HAVING deluje odredbi WHERE, ali na grupe.
Odredba ORDER BY sortira redove rezultata prema sadraju kolona koje navedete.
Odredba LIMIT koji redovi biti iz skupa rezultata.
Maksimalni broj redova zadaje se u obliku pomaka od kojeg
90
Poglavlje 6 upita u MySQL-u
Pitanja
1. Koji od narednih upita sve podatke iz tabele client?
a)
b)
e)
d)
select *
from client
where clientiD=2;
select clientiD, name, address, contactPerson, contactNumber
from client;
select * from client
limit l;
select all from client;
2. Koji od upita sve programere iz tabele employee?
a)
b)
e)
d)
select *
from employee
where job='Programmer';
select *
from employee
having job='Programmer';
select *
from employee
where job='Programmer'
group by job
having job='Programmer';
select job
from employee;
3. Koji od upita ne daje ukupan broj zaposlenih evidentiranih u tabeli
employee?
a)
select count(employeeiD) from employee;
b)
select count(employeeiD) as total from employee;
e)
select count(distinct employeeiD) from employee;
d)
select count(employeeiD) from employee group by employeeiD;
4. Gde se alijas ne moe zadati?
a) za kolone
b) za tabele
e) U odredbi WHERE
d) U odredbi SELECT
Ud g ovon
S. Ako nam iz rezultata upita trebaju redovi od lS do 20, odredba
LIMIT je
a) LIMIT lS, 20
b) LIMIT 14, 19
e) LIMIT 14, s
d) LIMIT lS, s
Vebe
1. Napiite upit koji daje sve podatke o zaposlenima u slubi (tabela department)
je ifra 128.
2. Napiite upit koji iz kolone employeeiD sve ifre zaposlenih koji su radili
za klijenta je ifra l.
3. Napiite upit koji za svaku kvalifikaciju evidentiranu u tabeli employee-
Skills daje ukupan broj zaposlenih koji je imaju.
Odgovori
Pitanja
l. b
2. a
3. d
4. e
S. e
Vebe
1.
2.
3.
select *
from employee
where departmentiD=128;
select employeeiD
from assignment
where clientiD=l;
s l cL skill , count(skill)
f 1om mploy Skills
CJI Oll Jl IJy ll k { ) J ;
92 Poglavlje 6 upita u
U poglavlju
U poglavlju, "Sloeniji upiti", upite koji obuhvataju vie
tabela i druge detalje komande SELECT. 7
Sloeniji upiti
u OVOM POGLAVLJU SE sloenijim upitima. prven-
stveno kako se mogu izvravati upiti koji obuhvataju vie tabela istovremeno. Zbog
toga morati da savladate koncept spajanja tabela, tj. na koji se tabele mogu
povezati.
teme:
Izvravanje upita koji obuhvataju vie tabela primenom vrsta spojeva:
Prirodnih, unutranjih i unakrsnih spojeva
Jednakovrednih spojeva
Levih i desnih spojeva
Podupiti
Upotreba opcija komande SELECT
Upotreba spojeva u upitima koji obuhvataju vie tabela
Svi upiti iz poglavlja 6, upita u MySQL-u", su podatke iz samo
jedne tabele. da smo se potrudili da do normalizovane strukture baze
podataka u kojoj su podaci razmeteni u vie tabela, korist od iz
samo jedne tabele je Ono to je zaista zanimljivo u relacionim
bazama podataka jesu relacije, odnosno veze koje postoje pojedinih tabela. Kada
sc podaci iz vie tabela istovremeno, te veze se nazivaju spojevi (engl.joins).
Pogledajmo prvo upite koji povezuju dve tabele.
Spajanje dve tabele
Pogledajte upit:
select employee.name, department.name
trom employee, department
where employee.departmentiD = department.departmentiD;
rogtaVIJC l :>IOZCniJI Upili
Kao to vidite, u odredbi FROM zadali smo dve tabele umesto samo jedne. U ovom
elimo da imena zaposlenih i nazive slubi u kojima rade. Rezultati
ovog upita izgledaju ovako:
+---------------+--------------------------+
l name l name
+---------------+--------------------------+
Ben Smith Finance
Ajay Patel Research and Development
Nora Edwards
Candy Burnett
Research and Development
Research and Development
+---------------+--------------------------+
4 rows in set (0.42 sec)
Kako smo dobili ove rezultate? Prvo, zadali smo kolone koje postoje u
tabelama. (Obratite panju na to da smo upotrebili notaciju s kako je opisano
u poglavlju 6, da bismo razlikovali kolonu name iz tabele employee od istoimene
kolone koja postoji i u tabeli department.) Da bi to moglo da radi, morali smo da
navedemo imena obeju tabela u odredbi FROM.
Najzanimljiviji deo ovog upita jeste odredba WHERE. Ako ovaj upit izvrite bez
odredbe WHERE, u obliku:
select employee.name, department.name
from employee, department;
rezultate:
+-- -- -----------+--------------------------+
l name l name
+---------------+--------------------------+
Ajay Patel Finance
Nora Edwards
Candy Burnett
Ben Smith
Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith
Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith
Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith
Finance
Finance
Finance
Research and Development
Research and Development
Research and Development
Research and Development
Human Resources
Human Resources
Human Resources
Human Resources
Marketing
Marketing
Marketing
Marketing
+- - -------------+--------------------------+
1 6 rows in set (0.01 sec)
Prvi upit, kojem je pridruena odredba WHERE, prikazuje zaposlene s poda-
cima o slubama u kojima rade, a drugi upit prikazuje sve kombinacije zaposlenih i
slubi , pri nij e utvrditi koji redovi rezultata sadre ta pod.11 k l a koji
upotreoa spoJeva u up1t1ma KOJI oounvataJu v1se taoela
' " podaci besmisleni! Ovaj skup rezultata, koji se sastoji od svih kombinacija
lt'dova iz dve tabele, zove se Dekartov proizvod (engl. Cartesian product) dveju tabela.
Sasvim je da je odredba WHERE za dobijanje rezultata koji nam
li l!baju. Kada u upitu spajamo dve tabele, uslov ili grupa uslova kojih pove-
t ujemo tabele zove se spojni uslov. U ovom uslov je employee. department ID
department. department ID, to je veza tabela koju smo definisali preko
\poljnih jo u emi baze podataka.
Kada elite da istovremeno te podatke koji se nalaze u vie tabela, morate upo-
trebiti veze tih tabela da biste pronali podatke koje traite. Ponekad to
da morate put od podataka koje znate do podataka koje traite. U narednom
odeljku opirnije objasniti tu ideju.
U prethodnom primeru rezultata obratite panju i na to da u zaglavljima obe
kolone stoji natpis"name"jerje to ime svake kolone u kontekstu tabele kojoj pripada.
ltezultati biti razumljiviji ako upotrebite alijase, na primer:
sel ect employee.name as employeeName, department.name as department-
Name
Jrom employee, department
where employee . departmentiD
Ovaj upit daje rezultate:
department.departmentiD;
1---- -----------+--------------------------+
l employeeName l departmentName
1--- ------------+--------------------------+
Ben Smith Finance
Ajay Patel Research and Development
Nora Edwards Research and Development
Candy Burnett Research and Development
--- ------------+--------------------------+
1 rows in set (0.55 sec)
Sadraj ovog skupa rezultata je razumljiviji nego prethodni .
Spajanje vie od dve tabele
Spaj anje vie tabela ne razlikuje se od spajanja samo dve tabele.
Recimo da treba utvrditi iz koje su slube zaposleni koji su radili za klijenta je
ime Tele o Inc. Kako da do tih podataka?
Poto znamo ime klijenta, u koloni clientiD tabele client moemo njegovu
i fru. tog podatka u tabeli assignment poslove obavljene za tog
klijenta i ifre zaposlenih (kolona employee ID) koji su ih obavili. S tim podacima
moemo zatim u tabeli employee ifre slubi u kojima rade ti zaposleni. I najzad,
tih podataka u tabeli department nazive slubi!
Poto smo osmislili putanju traenja kroz sve tabele, preostaje nam da tu
logiku preslikamo u upit, to daje
select department.name
irom cl ient, assignment, employee, department
wh re client . name= 'Telco Inc '
l ::IIUZeniJI Ufllll
and client.clientiD = assignment.clientiD
and assignment.employeeiD = employee.employeeiD
and employee.departmentiD = department.departmentiD;
Nakon izvravanja upita, dobijamo ove rezultate:
+--------------------------+
l name
+--------------------------+
l Research and Development l
+--------------------------+
l row in set (0.00 sec)
U upitu koji smo napisali da smo morali navesti sve tabele u putanji koju
smo sJedili i zadati spojne uslove koji povezuju jednu tabelu s drugom. U ovom
imamo jedan uslov- client. name = 'Tel co Inc' - i vie spojnih uslova.
Obratite panju na to da smo spojili tabele tri spojna uslova.
Primenom ovog pravila moete proveriti da li ste zadali sve potrebne uslove. Kada
spajate n tabela, u vam po jedna veza svakog para tabela,
to da imati n-1 spojnih uslova. Spojevi definisani u ovom primeru prikazani
su na slici 7.1.Jasno se vidi zbog je za tabele potrebno tri (n-1) spoja.
assignment.employeeiD=employee.employeeiD
assignment.departmentiD=department.departmentiD
Slika 7.1 Za povezivanje tabele potrebna su tri spoja.
Spajanje tabele same sa sobom - samospoj
Kao to jednu tabelu spajamo s drugom, isto tako moemo je spojiti i sa samom sobom.
Zato bismo to uradili? Ponekad traiti veze redova u istoj tabeli. Pretpo-
stavimo da elimo da saznamo imena svih zaposlenih koji rade u istoj slubi kao Nora
Edwards. Da bismo doli do tih podataka, prvo moramo u tabeli employee ifru
slube (kolona department ID) u kojoj radi Nora, a zatim u tabeli employee
potra7iti i sve ostale zaposlene koji rade u toj slubi.
To moemo obaviti upita:
select e2.name
from employee el, employee e2
where el.name = 'Nora Edwards'
and el.departmentiD = e2.departmentiD;
Vrste spoJeva 1zmeau tall' 1:1
Kao to vidite, u ovom upitu deklarisali smo dva alijasa za tabelu employee.
Time smo opisali MySQL-u da raditi kao da imamo dve zasebne tabele, el i e2,
koje sadre iste podatke. Zatim smo te tabele spojili, na isti kao to
bismo to uradili s bilo kojim drugim dvema tabelama. Najpre smo u tabeli el potraili
red s Norinim podacima (u kojem je ispunjen uslov el. name=' Nora Edwards'), a
zatim smo u tabeli e2 potraili redove koji u koloni departmentiD sadre istu ifru
slube kao ona u kojoj radi Nora (el. department ID = e2. department ID).
Moda vam trebati malo vremena da se naviknete, ali ako moete da zamislite da
radite s dve tabele, ne bi trebalo da imate
Ovo su rezultati prethodnog upita:
+--------- ------+
l name l
+---------------+
Ajay Patel
l Nora Edwards
l Candy Burnett
l
l
l
+------ ---------+
3 rows in set (0.00 sec)
Prikazani su svi zaposleni koji rade u istoj slubi kao Nora. Kao to se vidi, na listi se
nalazi i Nora. Upitu moemo lako dodati nov uslov koji je is skupa rezultata:
select e2.name
from employee el, employee e2
where el.name = 'Nora Edwards'
and el.departmentiD = e2.departmentiD
and e2.name != 'Nora Edwards';
Vrste spojeva tabela
Postoji vie vrsta spojeva koji se mogu uspostaviti MySQL-ovih tabela.
Osnovni spoj
U prethodnom odeljku, pomenuli smo koncept Dekartovog proizvoda. On se ponekad
naziva punim spojem (engl. full join) ili unakrsnim spojem (engl. cross join), ali bez obzira
na ime, sastoji se od skupa svih kombinacija redova tabela. Kada tom spoju
dodamo uslov (kao to je employee. department ID = department. de-
partmentro), dobijamo neto to se ponekad nazivajednakovredni spoj (engl. equij"oin),
koji broj redova u skupu rezultata.
ruyli:IVIJt: l .:>IULt:nljl Upili
Dosad smo u odredbi FROM zadavali listu tabela razdvojenih operatorom zarez. Time
se dobija unakrsni spoj, kao to je opisano, koji se pretvara u jednakovredni spoj kada
mu dodamo odredbu WHERE. MySQL podrava vie oblika sintakse za ou vrstu spoja.
Pogledajmo izvorni upit:
select employee.name, department . name
from employee, department
where employee.departmentiD ; department.departmentiD;
Umesto zareza, moe se zadati neobavezna rezervisana JOIN:
select employee.name, department.name
from employee join department
where employee.departmentiD ; department.departmentiD;
Osim JOIN, moete zadati i CROSS JOIN ili INNER JOIN.
Kada zadate ovu vrstu spoja, MySQL pretrauje sve tabele koje ste zadali i pokuava
da najefikasniji spajanja, pri ne spaja tabele obavezno redosledom
koji ste naveli. se i to da upit ne bude uvek najbolje optimizovan, to
detaljnije razmatrati u poglavlju 19,"0ptimizovanje upita" .Ako elite da zanemarite
rezultate optimizatora i naloite MySQL-u da spoji tabele ba redosledom koji ste
naveli, zamenite JOIN STRAIGHT JOIN.
Levi i desni spoj
Kada smo u prethodnom odeljku zadavali jednakovredne spojeve, navodili smo rezer-
visane JOIN, CROSS JOIN, INNER JOIN ili moda STRAIGHT JOIN, i traili pove-
zane redove u dve ili vie tabela. ta ako elimo da sve redove u jednoj
tabeli za koje ne postoje redovi u drugoj tabeli?
Razmotrimo u kojem elimo da zaposlene koji jo nisu radili na
poslovima za spoljne klijente kompanije, tj. zaposlene ifre (vrednosti u koloni
employeeiD) ne postoje u tabeli assignment . To se moe uraditi levog spoja,
odnosno operatora LEFT JOIN, na
select employee . name
from employee left join assignment
on employee.employeeiD; assignment.employeeiD
where clientiD is null;
Ovaj upit daje rezultate:
+- - -------------+
l name l
+--- ------------+
l Ajay Patel l
l Candy Burnett l
l Ben Smith l
+-- -------------+
3 rows in set (0.49 sec)
Ako pogledate sadraj tabela, lako se uveriti da su rezultati ali kako smo
do njih doli ?
Podu piti
Levi spoj radi tako to za sve redove tabele na levoj strani spoja (u ovom primeru to
ll' tabela employee) trai redove u tabeli na desnoj strani spoja.
1 dovi se postavljaju pored leve tabele. Za svaki red iz leve tabele koji nema parnjaka u
desnoj tabeli, operator LEFT JOIN dodaje red vrednosti NULL. Redove iz leve tabele bez
parnj aka u desnoj moete ako zadate uslov daje vrednost u desnoj tabeli
NULL.
Pogledajte ponovo primer. U ovom spoju, za svakog zaposlenog koji je radio za
nekog spoljnog klijenta, red s podacima o zaposlenom i o poslu koji je
obavio. Kada za nekog zaposlenog ne postoji red u tabeli assignment, levi
spoj generie "prazan red" u kojem sve kolone sadre vrednost NULL. Te prazne redove
moemo tako to potraimo sve zaposlene koji su neto radili za spoljnog
klijenta ifra (kolona clientiD) sadri vrednost NULL. (Ne bi trebalo da takav
postoji u tabeli assignment daje clientiD polje
U verzijama MySQL-a pre 4.1, ta tehnika se koristila jer nije bilo podu pita.
Podupiti su objanjeni u nastavku ovog poglavlja.
U ovom primeru upotrebili smo operator LEFT JOIN, ali isto tako smo mogli da
upotrebimo i operator RIGHT JOIN, koji deluje na isti s tom razlikom to je
desna tabela osnova, a redovi iz tabele na levoj strani dopunjuju se vred-
nostima NULL.
Pod upiti
Podupit (engl. subquery) jeste upit unutar drugog upita, odnosno upit se rezultat
koristi u drugom upitu. Ponekad se nazivaju i upitima (engl. nested queries).
Pod upiti su novina uvedena u MySQL-u 4.1. Tu korisnici su due
vreme zahtevali. Podupiti ne dodaju novu funkcionalnost, ali su upiti lake razu-
nlljivi kada se, umesto sloenih spojeva tabela, upotrebe podupiti .
ste videli primer podupita a da toga niste ni bili svesni. Upiti za brisanje i auri-
ranj e redova u vie tabela istovremeno koje smo razmatrali u poglavlju 5, "Umetanje,
brisanje i auriranje podataka" ,jedna su vrsta specijalizovanog pod upita.
U ovom poglavlju upotrebu podupita u komandama SELECT.
MySQL-u su dodate dve osnovne vrste podupita:
Podupiti za izvedene tabele
Podupiti za izraze.
Podupiti za izraze zadaju se u odredbi WHERE komande SELECT. Oni se dele na dve
podvrste:
Pod upite je rezultat jedna vrednost ili red
Podupite za izraze tipa
redom po jedan primer svake pomenute vrste pod upita.
l UU ruyiCIVIJt: l .:>IULt:IIIJI UfJill
Podupiti za izvedene tabele , . . .
Podupiti za izvedene tabele (engl. derived table subqueries) omogucavaJU
u odredbi FROM drugog upita. Time se formira privremena tabela koja se dodaje up1tu.
Pogledajte jednostavan upit:
select employeeiD, name from employee where job='Programmer';
Jasno je da ovaj upit ifre i imena zaposlenih koji su programeri . Ovaj upit
moemo upotrebiti u drugom upitu da bismo dobili drugi koristan rezultat:
select programmer.name
from (select employeeiD, name from employee where job='Programmer')
as programmer,
assignment
where programmer.employeeiD = assignment.employeeiD;
U ovom primeru upotrebili smo podupit (select employeeiD, name from
employee where j ob= Programmer ') da bismo formirali izvedenu tabel u redovi
sadre samo kolone employee ID i name. Privremenoj tabeli dodelili smo alijas 'pro-
grammer . Tu tabel u moemo potom pretraivati na isti kao bilo koju drugu
tabelu. U ovom primeru upotrebili smo je da bismo utvrdili koji su programeri radili
za spoljne klijente i dobili smo rezultate:
+--------------+
l name
+--------------+
l Nora Edwards l
+--------------+
1 row in set (0.01 sec)
Podupiti koji daju jednu vrednost
Kao u prethodnom odeljku, jednostavnim upitom:
select max(hours) from assignment;
Rezultat ovog upita je jedna vrednost, koja predstavlja broj radnih sati utro-
enih na neki posao. Ovde smo upotrebili MySQL-ovu funkciju koju dosad nismo
pominjali: to je funkcija max () , koja pronalazi vrednost u zadatoj koloni_
tabele. Funkcijom max () se vie u poglavlju 8, "Upotreba MySQL-ov1h
funkcija u komandi SELECT". U pod upitima koji jednu vrednost
(engl. single-value subqueries), se ova vrsta funkcija koristi za dobijanje
tata koji se potom koristi za druge
Kao u prethodnim odeljcima, ovaj upit upotrebiti unutar drugog upita.
Rezultat upita koji jednu vrednost jeste vrednost koja se potom
poredi s nekom drugom Pogledajte upit:
select e.employeeiD, e.name
from employee e, assignment a
where e.employeeiD = a.employeeiD
and a.hours = (select max(hours) from assignment);
Pod upiti
U ovom primeru traimo zaposlenog koji bi mogao zasluiti "titulu" najvrednijeg
1.1dnika u firmi. e je koji je zaposleni proveo najvie radnih sati dnevno
nekom poslu?
Ovo su rezultati izvravanja upita:
1--- ----------+---------- ----+
l employeeiD l name
l -- ----------+--------------+
l 7513 l Nora Edwards l
1-- -----------+------------ --+
l row in set (0.42 sec)
Mogu se napisati i upiti koji umesto jedne vrednosti, red s vie vrednosti, ali
.Jl: korist od toga U nastavku teksta primer takvog upita.
Podupiti za izraze tipa
Podupiti za izraze tipa (engl. Boolean expression subqueries) da se
u glavnom upitu upotrebi jedna od nekoliko specijalnih funkcija za rad s rezultatima
tipa. Te funkcije SU IN, EXISTS i (grupisano) ALL, ANY i SOME.
Rezervisana IN s grupom vrednosti. Pogledajte
upit:
ne lect name
I r om employee
where employeeiD not in
(select employeeiD
from assignment);
Ovaj upit daje jednake rezultate kao razmatrani upit u primeru za operator LEFT
JOIN (levi spoj), a to su zaposleni koji nisu obavili nijedan posao za nekog spoljnog
klijenta. Rezervisana IN da utvrdite da li se data vrednost nalazi u
skupu vrednosti. U ovom dobijamo jednake rezultate
kao one koje smo dobili u primeru upita za operator LEFT JOIN:
1-- ---- ---------+
l name
1--- ------------+
/ Ajay Patel l
l Candy Burnett l
l Ben Smith l
1-- ------- ------+
3 rows in set (0.45 sec)
Zanimljivo je da se operatora IN podaci upita mogu porediti i s listom
navedenih vrednosti, kao u narednom primeru:
nelect name
Irom employee
where employeeiD not in (6651, 1234);
102 Poglavlje 7 Sl oeniji upiti
Rezervisana EXISTS deluje na malo od rezervisane IN.
U upitima u kojima je zada to EXISTS, pod upit zapravo koristi podatke iz spoljnog
(glavnog) upita. To se ponekad zove kore/iran (engl. correlated) pod upit.
Pogledajte upit:
select e.name, e.employeeiD
from employee e
where not exists
(select *
from assignment
where employeeiD = e.employeeiD);
U ovom primeru traimo zaposlene koji nisu nikad radili na poslovima za
spoljne klijente.
Pod upit redove u kojima je ispunjen uslov da je vrednost u koloni
employee ID tabele assignment jednaka vrednosti u koloni employee. employee ID.
Vrednost e. employee ID iz glavnog upita. Evo ta MySQL zapravo radi: za
svaki red iz tabele employee ispituje rezultate podupita; ako u tom skupu ne postoji
nijedan red, tj. skup je prazan (WHERE NOT EXISTS), podatke o zaposlenom
u skup rezultata upita.
Mada neki korisnici lake razumeti ovu sintaksu, rezultate jednake onima iz
prethodnog odeljka dobijamo i upita s levim spojem (LEFT JOIN). Ovaj upit
daje potpuno jednake rezultate:
+---------------+-------------+
l name l employeeiD l
+---------------+-------------+
l Ajay Patel l 6651 l
l Candy Burnett l 9006 l
l Ben Smith l 9842 l
+---------------+-------------+
3 rows in set (0.00 sec)
Rezervisane ALL, ANY i SOME sa skupom vrednosti koje
podupit.
Pretpostavimo da Nora Edwards, koje se moda kao programera koji najvie
radi, eli da dokae da niko nema vie radnih sati od programera. Da bi dokazala tu
smislila je upit:
select e.name
from employee e, assignment a
where e.employeeiD = a.employeeiD
and a.hours > all
(select a.hours
from assignment a, employee e
where e.employeeiD = a.employeeiD
and e.job='Programmer');
Podu pit listu radnih sati, po programeru i po poslu koji je
obavio. Potom glavni upit ispituje da li postoji drugi zaposleni je broj sati
Opcije komande SELECT
od broja radnih sati nekog programera. To se radi u delu upita a. hours > ALL,
gde se da li je broj radnih sati zaposlenog od broja radnih sati svakog
programera
vas iznenaditi informacija da ovaj upit ne nijedan red podataka,
dokazuje da niko u toj firmi ne radi vie od programera.
Opcije komande SELECT
Kada smo prvi put razmatrali komandu SELECT, opisali smo oblik opte
sintakse te komande. Pogledajmo sada njenu potpunu sintaksu da bismo videli ta jo
ne znamo.
U MySQL-ovoj dokumentaciji stoji da komanda SELECT ima opti oblik:
SELECT [STRAIGHT_JOIN)
[SQL_SMALL_RESULT) [SQL_BIG_RESULT) [SQL BUFFER RESULT)
[SQL_CACHE l SQL_NO_CACHE) [SQL CALC FOuND ROWSJ [HIGH_PRIORITY)
[DISTINCT l DISTINCTROW l ALL) - - -
...
[INTO {OUTFILE l DUMPFILE} 'ime_datoteke' opcije_pri_izvozu]
[FROM reference_tabela
[WHERE uslov]
[GROUP BY {celobrojna vrednost ime kolone l formula}
[ASC l DESC) , . .. J -
(HAVING uslov]
[ORDER BY {celobrojna vrednost ime kolone l formula}
[ASC l DESC) , ... J -
[LIMIT [pomak,] rows l rows OFFSET pomak]
[PROCEDURE ime_procedure(lista_argumenata)]
[FOR UPDATE l LOCK IN SHARE MODE))
odredaba poznajete. Pogledajmo ukratko one koje dosad nismo
pominjali:
Odredba STRAIGHT JOIN na samom komande nalae optimizatoru
upita da spoji tabele ba redosledom koji ste zadali. ove opcije jednak je
kao kada zadate STRAIGHT JOIN u odredbi WHERE, kao to je napomenuto u
prethodnom delu ovog poglavlja. To je jedno od MySQL-ovih proirenja ANSI
standarda za jezik SQL.
Opcije SQL_SMALL_RESULT, SQL_BIG_RESULT i SQL_BUFFER_RESULT
vaju optirnizovanje upita. opcija SQL_SMALL RESULT i SQL BIG RESULT
obevetavate MySQL da da se skup upita sastoJati od malog,
odnosno velikog broja redova. Opcija SQL_BUFFER_RESULT nalae MySQL-u da
skup rezultata smesti u privremenu tabel u. Tu opciju moete iskoristiti kada znate
da slanje skupa rezultata klijentskom programu potrajati dugo, a elite
da izbegnete da on za to vreme blokira tabele iz kojih podaci treba da se
Ove opcije su MySQL-ova proirenja ANSI standarda za jezik SQL.
104 Poglavlje 7 Sloeniji upiti
SQL CACHE i SQL NOCACHE nalau MySQL-u da rezultate smeta, odnosno ne
smeta u ostavu O o jedno proirenje ANSI standarda za jezik SQL.)
SQL CALC FOUND ROWS se koristi u odredbi LIMIT; zahteva da MySQL
koliko bi no -redova upit vratio kada ne bi sadrao odredbu LIMIT. Taj broj
redova se zatim moe opcije select found_rows () ; U o jedno
proirenje ANSI standarda za jezik SQL). Svrha ove opcije jeste da se izbegne
ponavljanje posla. U verzijama MySQL-a u kojima ova opcija nije postojala,
isti rezultat je mogao da se postigne tako to se najpre izvri upit s funkcijom
COUNT (*),a zatim i drugi upit SELECT koji sadri opciju LIMIT.
HIGH PRIORITY obavetava MySQL da taj upit treba da ima prednost nad svim
komandama UPDATE koje pristup tabelama navedenim u upitu.
smo opisali opciju DISTINCT, a DISTINCTROW je njen sinonim. ALL ima
suprotan efekat sve duplikate) a to je i podrazumevana opcija.
SELECT INTO OUTFILE deluje suprotno od komande LOAD DATA INFILE koju
smo razmatrali u poglavlju 5, "Umetanje, brisanje i auriranje podataka".
Ova komanda smeta rezultate komande SELECT u zadatu datoteku. Odredba
opcije_pri_izvozu ima isto kao u komandi LOAD DATA INFILE (vie
detalja o tome u poglavlju 5).
Odredba PROCEDURE da zadate proceduru koja se poziva pre nego to
se skup rezultata poalje klijentskom programu. Ta procedura mora biti napisana
na jeziku C++ i, kao takva, izlazi izvan okvira ove knjige, ali ako vam treba vie
informacija, potraite ih u MySQL-ovoj dokumentaciji .
Odredbe FOR UPDATE i LOCK IN SHARE MODE deluju samo ako vaa maina baze
podataka podatke na nivou stranice ili reda. U praksi, opcija je upo-
trebljiva ako koristite maine InnoDB i BDB.Ako zadate FOR UPDATE,
vanje podataka biti a ako zada te LOCK IN SHARE MODE,
biti deljeno.Vrste u poglavlju lO",Upotreba trans-
akcija u InnoDB tabelama".
Saetak
Spojevi
Spoj je postupak povezivanja dveju tabela. Tabele koje povezujemo navodimo u
odredbi FROM, zajedno s vrstom spoja. Treba zadati i uslov koji opisuje na
koji bi tabele trebalo da budu spojene.
Operator zarez i rezervisane JOIN, INNER JOIN i CROSS JOIN deluju na isti
tj. kombinuju zadate tabele tako da traenje podataka u svim
tim tabelama.
Lev i desni spojevi pronalaenje redova u jednoj tabeli koji nemaju
redove u drugoj tabeli .
rrranJa
Pod upiti
Pod upit je upit unutar drugog upita.
Pod upiti mogu da vrate jednu vrednost, red podataka ili skup vrednosti. Mogu se
koristiti i za ispitivanje uslova operatora SOME, ALL ili ANY
operatora EXISTS moe se utvrditi da li u rezultatima podupita postoji
red koji je povezan s nekim redom glavnog upita.
Opcije komande SELECT
Komandi SELECT mogu se pridruiti razne opcije koje optirnizuju izvravanje te
komande.
komande SELECT INTO OUTFILE mogu se kopirati podaci iz tabele u
spoljnu datoteku, na koji smo u poglavlju 5 podatke iz
datoteke u tabelu komande LOAD DATA INFILE.
Komandi se mogu dodati procedure (napisane na jeziku C++) koje
podatke pre prenoenja u MySQL ili iz MySQL-a.
Pitanja
1. De kart ov proizvod je
a) skup svih kombinacija redova iz dve ili vie tabela
b) skup kombinacija redova iz dve ili vie tabela koji su povezani
e) skup redova iz jedne tabele kojima su dodati redovi iz druge
tabele, a gde to nije red je popunjen vrednostima
NULL na mestima gde bi bili podaci iz druge tabele
d) nije nita od prethodnog
2. Levi spoj je
a) skup svih kombinacija redova iz dve ili vie tabela
b) skup kombinacija redova iz dve ili vie tabela koji su povezani
e) skup redova iz jedne tabele kojima su dodati redovi iz druge
tabele, a gde to nije red je popunjen vrednostima
NULL na mestima gde bi bili podaci iz druge tabele
d) nije nita od prethodnog
3. Jednakovredni spoj je
a) skup svih kombinacija redova iz dve ili vie tabela
b) skup kombinacija redova iz dve ili vie tabela koji su povezani
e) skup redova iz jedne tabele kojima su dodati redovi iz druge
tabele, a gde to nije red je popunjen vrednostima
NULL na mestima gde bi bili podaci iz druge tabele
d) nije nita od prethodnog
106 Poglavlje 7 Sloeniji upiti
4. Korelirani podupit se tako zove zato to uspostavlj a korelaciju
a) redova tabela
b) redova iste tabele
e) dva spoja
d) redova glavnog upita i redova podupita
5. Razlika upita sa 5.1 i 5.2 u nastavku teksta j e
a) nema razlike
b) podatke
e) iste podatke ali je verovatno da se levi spoj (upit 5.1) bre
tavati
d) iste podatke ali je verovatno da se podupit (upit 5.2) bre
tavati
Upit5.1:
select employee.name
from employee left join assignment
on employee.employeeiD = assignment.employeeiD
where clientiD is null;
Upit 5.2:
select e.name, e.employeeiD
from employee e
where not exists
Vebe
(select *
from assignment
where employeeiD e. employeeiD) ;
1. Napiite upit koji prikazuje imena zaposlenih i njihove kvalifikacije.
2. Napiite upit koji operatora LEFT JOIN formira listu klijenata za koje
nijedan od zaposlenih nije obavio nijedan posao.
3. Upit iz vebe broj 2 napiite tako da koristi operator EXISTS.
Odgovori
Pitanja
1. a
2. e
3. b
4. d
5. e
Vebe
1.
select name, skill
from employee, employeeSkills
u s1eaecem poglaVlJU
where employee.employeeiD = e mpl oyee Skills.employeeiD;
2.
3.
select client.clientiD, name
from client left join assignment
on client . clientiD = assignment. clientiD
where employeeiD is NULL;
select clientiD, name
from client
where not exists
(select *
from assignment
where assignment . clientiD
client.clientiD);
U poglavlju
U poglavlju 8",Upotreba MySQL-ovih funkcija u komandi SELECT",
funkcije koje postoje u MySQL-u za upotrebu u komandi SELECT.
8
Upotreba MySQL- ovih
funkcija u komandi SELECT
MYSQL SADRI IROK OPSEG OPERATORA I FUNKCIJA koji mogu biti
korisni pri pisanju upita. je namenjena upotrebi i odredbama SELECT i WHERE.
Postoje i specijalne funkcije koje deluju na grupe podataka i upotrebljavaju se u odredbi
GROUP BY. smo koristili osnovne operatore za i funkcije count () i
max (). U MySQL-u je na raspolaganju veliki broj funkcija. U ovom pogla-
vlju najkorisnije njima. Ovu knjigu nismo zamislili kao referentni
za MySQL-ove funkcije, samo pokuavamo da sliku funkcio-
nalnosti koja je na raspolaganju.
teme:
Operatori
Funkcije za upravljanje tokom izvravanja
Funkcije za rad sa znakovnim vrednostima
funkcije
Funkcije za rad s datumima i vremenima
Funkcije za konverziju tipova podataka
Druge funkcije
Funkcije za upotrebu u odredbama GROUP BY.
Vano je zapamtiti da se u MySQL-u svaki izraz koji sadri vrednost NULL svodi na
vrednost NULL, uz nekoliko izuzetaka koje kada budemo naili na njih. O
lome biti vie u odeljku o operatorima za vrednosti.
Poglavlje 8 Upotreba MySQL-ovih funkcija u komandi SELECT
u ovom poglavlju komandu SELECT bez tabela u njoj.
Komanda SELECT moe se upotrebiti kao jednostavan kalkul ator. Na primer, ako
za date
select 2+2;
rezultat
+-- ---+
l 2+2 l
+-- ---+
4 l
+- ----+
1 row in set (0.42 sec)
Moete izvravati izraze koji ne sadre imena tabela i u kojima moete zadavati irok
opseg i drugih operatora i funkcija. :ranje 2+2 je trivijalno,
ali to svakako ne vai za izvravanje operaciJa u komandi SELECT. Na
primer, to vam da uradite finansijsku analizu vrednosti u tabelama i da
zatim prikaete rezultate u obliku izvetaja.
U svim MySQL izrazima moete zadavati zagrade da biste upravljali redosledom
kojim se pojedini delovi izraza, na isti kao u bilo kom drugom pro-
gramskom jeziku.
Pogledajmo najpre operatore.
Operatori . .
u MSQL-u postoje tri glavne grupe operatora: za vrednosti
i Operatore smo ukratko opisali u poglavlju 6, upita u
MySQL-u". Sada ih detaljnije razmotriti.
operatori v
MySQL podrava operatore koje biste ocekivali: sabiranJe(+),
oduzimanje (-), mnoenje (*) i deljenje (/). Deljenje nulom daje vrednost NULL.
Operatori za vrednosti . .
Najvanije to bi trebalo da zapamtite ope;atorima za
j este izuzev u nekohko posebmh slucaJeva, sta god poredite s vrednoscu NULL,
uvek daje NULL. To vai i za NULL s NULL:
select NULL=NULL;
+-- -- - -- - -- - +
l NULL=NULL l
+-------- - - -+
NULL l
-----------+
1 row i n set (0 . 00 sec )
Uporedite to sa upitom:
select NULL IS NULL;
+--- - ----- - - - --+
l NULL IS NULL l
+--------------+
l l
+--------------+
l row in set (0.00 sec)
Ovaj primer ono to smo napomenuli u poglavlju 6, a to je da morate opre-
zno korisiti operatore za ukoliko se podacima moe pojaviti i NULL.
Druga koju bi trebalo da zapamtite jeste da se u pri pare-
vrednosti znakovnog tipa u MySQL-u ne pravi razlika malih i velikih
slova. Ako elite da se znakovne vrednosti porede tako da se ipak pravi razlika
malih i velikih slova, ispred jedne od njih dodajte prefiks BINARY. Na primer,
select * from department where name='marketing';
Ovaj upit 'marketing' bez obzira na to kako je napisana, a rezultati
izgledaju ovako:
+- ------- --- ----+-----------+
l departmentiD l name
+- -- - ---- - - -- ---+-----------+
130 l Marketing l
+---------------+-----------+
l row in set (0.41 sec)
Ako je potrebno razlikovanje malih od velikih slova, dodajte rezervisanu
binary, na
select * from department where name = binary 'marketing';
Ovako napisan upit ne nijedan red iz baze podataka employee:
Empty set (0.18 sec)
Posle ovog uvoda, moemo na operatore za se koriste
operatori navedeni u tabeli 8.1.
Tabela 8.1 Operatori za
Operator
!= ili <>
<
<=
>
>=
Jednako
od
Manje od
Jednako ili manje od
od
Jednako ili od
ll !'oglavlJe tl upotreoa My:>uL-ovm ugraaenm runKCIJa u KomanOI :>tLtLI
Tabela 8.1 Operatori za (nastavak)
Operator
n BETWEEN min AND max da li se n nalazi u opsegu vrednosti od min do max.
n IN (skup vrednosti) Pripadnost skupu vrednosti koji se moe zadati u obliku liste
vrednosti, izraza ili podu pita. Primer skupa: (jabuka, orah,
breskva)
<=>
n IS NULL
ISNULL(n)
operatori
Operator za jednakost koji se moe upotrebiti i za NULL. Kada se
pored e dve vrednosti NULL, rezultat je l (true).
Ispituje da li n ima vrednost NULL
Ispituje da li n ima vrednost NULL.
MySQL podrava sve operatore koji delove izraza.
izrazi u MySQL-u mogu imati vrednost 1 (true), o (false) ili NULL. Osim toga,
MySQL kao true (istinito, svaku vrednost od nule i od
NULL.
Kada su vrednosti NULL u pitanju, neki elementi tabela istinitosti su malo
od onog to biste Tabela 8.2 prikazuje operatore.
Tabela 8.2 operatori
Operator
AND ili &&
OR ili ll
NOT ili
XOR
Primer
n && m
n ll m
NOT n
n XOR m

I. Tabela istine izgleda ovako:
true&&true = true
false&&bilo ta = false
Svi ostali izrazi svode se na NULL.
ILI. Tabela istine izgleda ovako:
true l lbilo ta= true
NULLI l false= NULL
NULL l l NULL = NULL
false! l false = false
NE. Tabela istine izgleda ovako:
!true = false
!false = true
!NULL = NULL
ILI. Tabela istine izgleda ovako:
true XOR true = false
true XOR false = true
false XOR true = true
NULL XOR n = NULL
n XOR NULL = NULL
runkCIJe za upravlJanje tokom izvravanja komandi
Funkcije za upravljanje tokom izvravanja komandi
Najpre razmotriti grupu funkcija za upravljanje tokom komandi.
njima su najkorisnije IF i CASE, koje deluju iskazu if, odnosno switch
ili case iz programskih jezika.
Prototip funkcije IF izgleda ovako
IF (el, e2, e3)
Ako izraz el ima vrednost true, funkcija IF rezultat e2; u suprotnom, rezultat
funkcije je e3. Na primer, ako ovu funkciju upotrebimo u bazi podataka employee,
moemo zadati upit:
select name, if(job='Programmer', "nerd", "not a nerd")
from employee;
Ovaj upit daje rezultate:
+---------------+--------------------------------------------+
l name l if(job='Programmer', "nerd", "not a nerd") l
+---------------+--------------------------------------------+
l Ajay Patel nerd
l Nora Edwards nerd
l Candy Burnett not a nerd
l Ben Smith not a nerd
+---------------+--------------------------------------------+
4 rows in set (0.00 sec)
Funkcija CASE ima prototipe (prema MySQL-ovoj dokumentaciji):
CASE vrednost
WHEN THEN rezultat
[WHEN THEN rezultat .. . ]
[ELSE rezultat]
END
ili
CASE
WHEN [uslov] THEN rezultat
[WHEN [uslov] THEN rezultat ... ]
[ELSE rezultat]
END
Ovu funkciju moete upotrebiti da biste izdvojili jednu vrednost iz skupa od
nekoliko. Primera radi, pogledajte upit:
select workdate, case
when workdate e 2000-01-01 then "archived"
when workdate e 2003-01-01 then "old"
else "current"
end
from assignment;
1'14 PoglavlJe 8 Upotreba My:>UL-ovlh tuni<CIJa u 1<omand1 :>tLtCI
Ovaj upit ispituje vrednost kolone workdate (datum posla) u svakom redu tabele
assignment. Datumi iz prethodnog veka se sa "archived", datumi iz pret-
hodne godine se sa "old", dok se svi ostali datumi kao
"current".
Funkcije za rad sa znakovnim vrednostima
MySQL-ove funkcije za rad sa znakovnim vrednostima dele se u dve kategorije: funk-
cije za obradu znakovnih vrednosti i funkcije za znakovnih vrednosti.
Verovatno ustanoviti da su funkcije iz druge grupe korisnije od onih iz prve.
Funkcije za obradu znakovnih vrednosti
Tabela 8.3 prikazuje najkorisnije funkcije za obradu znakovnih vrednosti. U doku-
mentaciji su opisane i mnoge druge.
Tabela 8.3 Funkcije za obradu znakovnih vrednosti
Funkcija Namena
concat(s1, s2, ... )
conv(n, izvorna_baza,
nova_baza)
length (s)
load file
(ime_ datoteke)
Spaja znakovne vrednosti sl, s2, ....
Pretvara broj n iz baze izvorna_baza u broj baze
nova_ baza. (Moda vas je iznenadilo to to je ova funkcija
navedena funkcijama za rad sa znakovnim vrednostima,
ali se za notaciju nekih baza koriste slova, kao u heksadecimal-
noj bazi.)
ukupan broj znakova sadranih u s.
sadraj datoteke ime_ datoteke kao jedan niz
znakova.
locate (igla,plast_sena, poziciju niza znakova igla u nizu
pozicija) plast_sena. Traenje od pozicije pozicija.
lower (s) i upper (s) Pretvara niz znakova s u mala, odnosno velika slova.
quote (s)
replace(izvor,
za mena)
soundex(s)
substring(s,
ukupno)
trim (s)
Preslikava niz znakova s u oblik pogodan za smetanje u bazu
podataka. To podrazumeva uokvirivanje znakovnog niza
polunavodnicima i umetanje obrnute kose crte.
niz znakova izvor u kojem je podniz zamenjen
nizom zamena na svim mestima gde se pojavljuje.
soundex oblik izvornog niza znakova s. Soundex oblik
znakovne vrednosti predstavlja na koji znakovna
vrednost treba da se izgovara na engleskom jeziku. Na primer,
ponekad je lake ime osobe ako se trai sound ex oblik
a ne kako je ime napisano.
ukupno znakova iz niza s, od
Uklanja i zavrne beline iz niza znakova s.
funkcije l trim () moete ukloniti samo beline, a
funkcija rt rim () uklanja zavrne beline.)
runKCIJe za raa sa znaKovnim vreanost1ma
Funkcije za znakovnih vrednosti
Osim operatora jednakosti, u MySQL-u postoji i vie drugih funkcija za
dve znakovne vrednosti:
LIKE: s dokerskim znacima.
RLIKE: s regularnim izrazima.
STRCMP: znakovnih vrednosti, funkciji strcmp () u jeziku C.
MATCH: Tekstualno pretraivanje.
U ovom odeljku funkcije LIKE, RLIKE i STRCMP. Tekstualno pretrai-
vanje je na raspolaganju samo u My ISAM tabelama. Vie informacija o tome
u poglavlju 9, "Tipovi tabela u MySQL-u".
s dokerskim znacima funkcije LIKE
Pogledajmo primer upotrebe operatora LIKE:
select *
from department
where name like '%research%';
U ovom primeru ne traimo nazive jednake 'research', nazive koji bilo
gde sadre 'research'. Rezultati su
+---------------+--------------------------+
l departmentiD l name
+---------------+----------------- ---------+
128 l Research and Development l
+---------------+------ --------------------+
l row in set (0.04 sec)
Funkcija LIKE podrava dva s dokerskim znacima. Znak za pro-
cenat (%), upotrebljen kao u navedenom primeru, poklapanje s grupom zna-
kova bilo koje duine i nula). To da se izraz '%research%' poklapa
sa svakom znakovnom koja sadri research. Imajte u vidu da se pri
znakovnih vrednosti ne pravi razlika malih i velikih slova,
kao to je objanjeno u prethodnom delu ovog poglavlja.
Stariji dokerski znak je podvlaka U, kojim se poklapanje s jednim zna-
kom. Na primer, '_at' se poklapa sa znakovnim vrednostima cat , mat , bat itd.
s regularnim izrazima funkcije RUKE
Funkcija RL IKE znakovnih vrednosti s regularnim izrazima.
Regularan izraz je ablon koji opisuje opti oblik znakovne vrednosti. Uslovi koje
bi trebalo da ispunjavaju znakovni nizovi koje traimo, opisuju se posebnom notaci-
jom. ukratko tu notaciju.
Prvo, svaki literal uvek se poklapa sa istim nizom znakova. To da se ablon
'cat' poklapa s 'cat'. poklapanje vai i za catacomb i the cat
sat on the mat'. ablon 'cat' pronalazi niz znakova cat na svim mestinu
unutar niza znakova.
116 Poglavlje 8 Upotreba MySQL-ovih tunkciJa u komano1 ::,tLtLI
Ako elite da ablon pronalazi samo 'cat', onda ga morate izmeniti u '"'cat$'.
Znak karet ("') "fiksni niza znakova"; drugim niz znakova koji
traimo mora da 'cat'. Znak za dolar($) "fiksni kraj niza zna-
kova"; drugim niz znakova koji traimo mora da se zavrava 'cat'.
Prema tome, ablon '"'cat$' prihvata samo 'cat' i nita drugo.
U regularnim izrazima podrani su i dokerski znaci, isto kao u funkciji LIKE.
dokerski znak je Postoji samo jedan - (.) - koji
poklapanje s jednim znakom, bilo kojim. Na primer, ' . at' poklapanje s
'cat', 'bat', 'mat' itd.
Dovoljan je samo jedan dokerski znak jer se u traenom nizu znakova moe zadati
i ponavljanje znakova i dokerske znakove) broj puta.
Kada iza nekog znaka postavite specijalni znak *, to da se prethodni znak
moe pojaviti nula ili vie puta. Na primer, ablon 'n*' prihvata ' ', 'n', 'nn', 'nnn'
itd. Znaci se mogu grupisati zagrada, tako da ablon ' (cat)*' prihvata ' ',
'cat', 'cat cat', 'catcatcat' itd. je i upoteba dokerskih znakova, pa
ablon ' . * ' prihvata broj znakova, to svaki niz znakova.
tome, znak plus(+) da se znak ili niz znakova ispred njega moe poja-
viti jedanput ili vie puta, a upitnik (?) jednom ili nijednom. Moete zadati i
opseg vrednosti, tako da ablon ' (cat) (2, 4) ' prihvata 'catcat ', 'catcatcat ' i
'catcatcatcat'.
Osim znakova i nizova znakova, moete zadavati i skupove znakova,
koji se piu uglastih zagrada. Na primer, ablon ' [a-z] ' prihvata bilo koje
slovo, dok ablon ' [a- z]*' prihvata nizove sastavljene od proizvoljno g
broja znakova.
I najzad, postoji vie klasa znakova, koje su zapravo unapred definisani skupovi
uslova. Na primer, [ [:al num: JJ prihvata svaki znak.
Ako se bavite programiranjem na jeziku Perl, vredno je napomenuti da MySQL
podrava regularne izraze u formatu POSIX, koji se razlikuje od formata Perlovih
regularnih izraza.
A sada, pogledajmo primer upotrebe ablona s funkcijom RLIKE. Razmotrite sle-
upit:
select * from department where name rlike 'an';
Ovaj upit pronalazi sve redove koji bilo gde u koloni department sadre niz zna-
kova 'an':
+---------------+---------- ----------------+
l departmentiD l name
+------------ ---+-------------- ------- -----+
42 Finance
128 l Research and Development l
129 l Human Resources l
+---------------+------- ------- --------- ---+
3 rows in set (0.00 sec)
funkcije
. Regularni izrazi mogu biti veoma ali i veoma sloeni. Ako vam treba vie
pnmera i opirniji opis sintakse, na Webu mnogo dobrih tekstova na tu
temu.
nizova znakova funkcije STRCMP()
.funkciju s:RCMP (). MySQL-u vae iste konvencije kao i u drugim programskim
JeZlCllUa, kao so su e lh P HP. Prototip funkcije izgleda ovako:
STRCMP(sl, s2)
a funkcija vrednosti:
o ako su nizovi znakova jednaki
-l ako je sl maqji od s2 - ako po redosledu sortiranja sl dolazi ispred s2
l ako je sl od s2 - tj. ako po redosledu sortiranja sl dolazi iza s2
Rezultati narednih upita izgledaju ovako:
mysql> select strcmp ('cat , cat ) ;
+- ---------------------+
l strcmp ('cat', 'cat') 1
+- ---------------------+
l o l
+- ---------------------+
l row in set (0.42 sec)
mysql> select strcmp('cat', 'dog');
- -------------- -------+
l strcmp( 'cat', 'dog') 1
+- ---------------------+
l -1 l
1- ---------------------+
l row in set (0.00 sec)
mysql> select strcmp('cat', 'ant');
-- --------------------+
l strcmp( 'cat', 'ant') 1
l -- -------------------+
l l l
l - --------------------+
row in set (0.00 sec)
Imajte u vidu da zavisi od lokalnog skupa znakova koji je akti-
van. Ako Je aktivan Jez1k razlicit od engleskog, znakovne vrednosti biti sortirane
kako biste i pod uslovom da ste zadali skup znakova kada ste
11:tprav1h tabelu.
funkcije
l'.1bela 8.4 prikazuje nekoliko korisnih funkciia. U MySQL- d k _
. .. " , OVOJ O ll
nar1 rete opise mnogih drugih funkcijn iz ll' kategorije.
118
Poglavlje
8
Upotreba MySQL-ovih tunKCIJa u KomanOI ;:,tLtLI
Tabela 8.4 funkcije
Funkcija
abs (n)
ceiling (n)
floor (n)
mod (n, m) i div
power (n, m)
rand(n)
round (n[, d])
sqrt (n)
Svrha
apsolutnu vrednost n, a to je vrednost bez predznaka.
vrednost n zaokruenu navie na najblii ceo broJ.
vrednost n zaokruenu nanie na najblii ceo broj.
Ove dve funkcije dele n sa m. Funkcija di v celo brojni rezultat,
a funkcija mod () celo brojni ostatak deljenJa.
n podignuto na stepen m. ..
generisan broj u opsegu O do l. Parametar n mJe .
obavezan, ali kada ga zadate, njime se tructJalizuJe algontam za
brojeva. istu vrednost n funkciJI rand
generie se ista pseudoslucaJna vrednost.)
n zaokrueno na najbliu celobrojnu vrednost. Ako zadate
i parametar d, n vrednost se zaokruuje na d dectmalruh mesta.
kvadratni koren od n.
. . u e zi sa ovim funkcijama
Pogledajmo primer upotrebe funkClj3 mod() l v.. v
je dok se mod moe napisati u obhku
mod(9, 2)
ili
9 mod 2
ili
9 % 2
funkcija di v moe se napisati samo kao
9 div 2
Primera radi
div(9, 2)
raditi izazvati sintaksnu greku.
U b fi k
d i div u MySQL-u daje rezultate:
potre a un CIJa mo
mysql> select 9 mod 2;
+---------+
l 9 mod 2 l
+---------+
l l
+---------+
1 row in set (0.00 sec)
mysql> select 9 div 2;
+---------+
l 9 div 2 l
+-- - -- ----+
4 l
----
__ __ (o . oo
Funkcije za rad s datumima i vremenima
Funkcije za rad s datumima i vremenima
Tabela 8.5 prikazuje nekoliko najkorisnijih funkcija za rad s datumima i vremenima.
MySQL-ovoj orijentisanosti na analizu podataka, skup funkcija za rad
s datumima i vremenima veoma je bogat. Naredni spisak daleko je od potpunog.
Tabela 8.5 Funkcije za rad s datumima i vremenima
Funkcija Namena
adddate(datum, INTERVAL
n tip) i subdate (datum,
INTERVAL n tip)
curdate(), curtime(),
now()
date_format(datum,
format) i
time_format(vreme,
format)
dayname (datum)
extract(tip FROM datum)
unix_timestamp( [datum])
Ove funkcije slue za sabiranje i oduzimanje datuma. Vrednosti
zadatoj parametrom datum dodaju, odnosno od nje
period zadat rezervisane INTERVAL. Morate zadati
i n i tip te
Parametar tip moe imati vrednost SECOND, MINUTE, HOUR,
DAY, MONTH, YEAR, MINUTE: SECOND (trebalo bi da n bude
izraeno u formatu 'm: s'), HOUR:MINUTE ('h:m'), DAY_HOUR
('d h'), YEAR_MONTH (' y-m' ), HOUR_SECOND (' h:m: s'),
DAY_MINUTE ('d h:m'), DAY_SECOND ('d h:m:s').
Ove funkcije su zaista korisne, ali poto je gotovo
zapamtiti sve formate za datume i vremena Qer se razlikuju),
da ih potraite u MySQL-ovoj dokumentaciji.
Ove funkcije datum, vreme, odnosno
datum i vreme.
ovih funkcija moete izraziti datume i vremena u
gotovo svakom fom1atu koji zamislite. To se radi tako to se
zada format u obliku niza znakova, kao u primeru:
date_format(workdate, '%W %D of %M, %Y').
Navedeni format prikazuje datum u obliku, na primer,
'Monday 16th of June, 2003 '. Poto je spisak
formata detaljnije informacije potraite u
dokumentaciji.
Ova funkcija daje englesko ime dana u nedelji zadatog u
parametru da t um (na primer, ' Monday ').
Ova funkcija izdvaja iz datuma datum komponentu tip
zadajete parametrom tip. Na primer, ako zadate YEAR, funkcija
izdvaja godinu iz datuma. Tipovi komponente su isti kao u
parametrima funkcija adddate () i subdate ().
Ova funkcija daje datum i vreme u Unixovom formatu
timestamp. (Vrednost je broj sekundi koji je protekao od 1.
januara 1970. godine.) Ako zadate i datum, rezultat je timestamp
vrednost koja odgovara tom da t umu.
Pogledajmo primer upotrebe funkcije adddate (). Datumu 1. januar 1990. doda-
jemo godinu i est meseci:
s elect adddate("l999-01-01", INTERVAL "1-6" YEAR_MONTH);
120
Poglavlje 8 Upotreba MySQL-ovih funkcija u komandi
Rezultat je
+--------------------------------------------------+
l adddate("l999-0l-01", INTERVAL "1-6" YEAR_MONTH) l
+------------------- ----------------------- --------+
l 2000-07-01 l
+------------------------------------------------- -+
1 row in set (0.41 sec)
U mnogim aplikacijama u kojima formatirate izlazne podatke namenjene drugom
programu, to moda biti najpogodniji oblik datuma. Unixov for-
mat timestamp nije razumljiv ali su vrednosti zadate u tom formatu potpuno
kompatibilne sa API funkcijama drugih programskih jezika.
Isti upit, ali s funkcijom unix_timestamp ()
select unix_timestamp(adddate("l999-01-0l", INTERVAL "1-6"
YEAR_ MONTH) ) ;
generie rezultat neupotrebljiv za ali direktno upotrebljiv u drugom program-
skom kodu, kao to je PHP-ova funkcija date ():
+------------------------------------------------------------------+
l unix_timestamp(adddate("l999-01-0l", INTERVAL "1-6" YEAR_MONTH)) l
+------------------------------------------------------------------+
962373600 l
+------------------- -- ---------------------------------------------+
1 row in set (0.01 sec)
Funkcije za konverziju tipova podataka
Postoje samo dve funkcije za konverziju tipova podataka, cast () i convert (), koje
daju isti rezultat, ali se sintaksa malo razlikuje. Ove funkcije konverziju
tipova podataka, tj. u rezultat pretvaraju jedan tip podataka (na primer, signed integer)
u drugi (na primer, char).
Prototipovi ovih funkcija su
cast(izraz AS tip)
convert(izraz, tip)
Funkcija cast () podrana je u ANSI standardu, a funkcija convert () podrana je
u ODBC standardu.
Parametar tip moe imati vrednost BINARY, CHAR, DATE, DATETIME, SIGNED
(INTEGER) i UNSIGNED (INTEGER).
konverzija tipova podataka odvija se u MySQL-u automatski kad zatreba;
na primer, ako funkciji za rad s vrednostima znakovnog tipa prosledite broj, on
automatski biti pretvoren u niz znakova.
Fukcije za upotrebu u odredbi GROUP BY
Druge funkcije
U MySQL-u postoje i funkcije koje se mogu svrstati u grupu "ostalo". Na primer,
postoje funkcije za generisanje he vrednosti i ifrovanje, ali i mnoge druge veoma
korisne funkcije. U tabeli 8.6 navedene su funkcije.
Tabela 8.6 Ostale funkcije
Funkcija Namena
benchmark
(broj, izraz)
encrypt(s[,zrnce])
found_rows ()
last_insert_id ()
md5 (s)
password(s)
vrednost izraza izraz zadati broj puta, Ova funkcija
uvek nulu - njena svrha je da meri vreme potrebno za
izraza i prikae dobijena vreme.
ifruje vrednost s Unixove sistemske funkcije crypt.
Neobavezni parametar zrnce je niz od dva znaka. Ako funkcija
crypt nije na raspolaganju u vaem sistemu Qer imate, na primer,
Windows), funkcija rezultat NULL.
Daje podatak o ukupnom broju redova koji bi tao poslednji upit
kada ne bi sadrao odredbu limit. Deluje samo ako je u komandi
SELECT zadata opcija SQL_CALC_FOUND_ROWS, kao to je opisano
u poglavlju 7.
poslednju vrednost AUTO_INCREMENT koja je bila automat-
ski generisana. To je korisno kada u tabel u dodate nov red i potre-
ban vam je njegov identifikator da biste ga upisali kao vrednost
spoljnog u drugu tabelu.
128-bitni he ulaznog niza znakova s u MDS formatu. Ako
piete aplikaciju koja imena korisnika i lozinke, to je prepo-
oblik skladitenja lozinki u bazu podataka.
Algoritmi za ifrovanje podataka imaju vek upotreblji-
vosti. da snaga neprekidno raste, neophodni su i
sve snaniji algoritmi za ifrovanje podataka. MDS se zasad smatra
sigurnim.
ifrovan oblik za lozinku zadatu parametrom s. To nije
oblik u kojem se interno lozinke korisnika MySQL-a, to je
opisano u u 11, "Upravljanje pravima korisnika". Upotreba
funkcije password () za ifrovanje lozinki koje se u bazi
podataka ne se.
Fukcije za upotrebu u odredbi GROUP BY
Postoje funkcije posebno namenjene upotrebi u odredbi GROUP BY. One se ponekad
naziVaJU grupne ili agregatne funkcije. Moete ih primeniti i na ceo skup rezultata
upita, pri se svi redovi kao pripadnici jedne grupe. To smo upo-
trebili u upitima kao to je
select count(*)
from employee;
Ovaj upit daje ukupan broj redova u tabeli employee.
122 Poglavlje B Upotreba MySQL-ovih funkcija u komandi SELI::CI
Ove funkcije se primenjuju na grupe podataka, kao u primeru:
select job, count(job}
from employee
group by job;
Ovaj upit prebrojava koliko ima zaposlenih na svakom radnom mestu.
Tabela 8.7 prikazuje listu najkorisnijih grupnih funkcija .
Tabela 8.7 Funkcije za rad s grupama podataka
Funkcija
avg (kolona)
count(kolona)
min (kolona)
max (kolona)
std (kolona)
sum (kol ona)
Saetak
Namena
prosek vrednosti sadranih u koloni kolona.
ukupan broj vrednosti u koloni kolona.
najmanju vrednost u koloni kolona.
vrednost u koloni kolona.
standardni otklon za vrednosti sadrane u koloni kol ona.
zbir vrednosti sadranih u koloni kolona.
MySQL prua izbor i operatora, kao i operatora za pere-
vrednosti. Pri upotrebi operatora morate obratiti panju na
pojave vrednosti NULL jer u tom rezultati uvek biti
kakve
MySQL prua bogat izbor funkcija za rad s vrednostima znakovnog i
kog tipa, za rad s datumima, za konverziju tipova podataka i druge funkcije.
Funkcije za rad s grupama podataka deluju na grupe vrednosti u kolonama
tabela. Te grupe se formiraju ako je zadata odredba GROUP BY, ali ako nije, funk-
cije deluju na sve vrednosti u koloni tabele.
Pitanja
l . Koji se od operatora ne mogu upotrebiti za ispitivanje da li je
vrednost jednaka NULL?
a) ISNULL ()
b) <=>
e) IS NULL
d)
2. Rezultat ovog pozivanja funkcije strcmp ( 'fred' , 'Fred') jeste
a) -1
b) o
e) 1
d) 2
Odgovo1
3. Koju biste od funkcija upotrebili da dobijete ime meseca u datumu?
a) dayname ()
b) extract()
e) subdate ()
d) now()
4. Koju od funkcija poziva MySQL kada interno ifruje lozinke svojih
korisnika?
a) password()
b) encrypt ()
e) rodS()
d) sha()
5. Ako u komandi SELECT upotrebite grupnu funkciju a ne zadate odredbu GROUP
Vebe
a) to je sintaksna greka
b) cela tabela se kao jedna grupa
e) ceo skup rezultata se kao jedna grupa
d) svaki red se kao jedna grupa
l. Napiite upit koji prikazuje imena zaposlenih i radnih mesta, ali ako je naziv rad
nog mesta 'Programmer', treba da se prikae 'Analyst 1 Programmer'.
2. Napiite upit koji u kolonu department dodaje novu slubu je naziv Property
Services. Zatim napiite upit koji dodaje novog zaposlenog, je ime Fred Smith
a radno mesto DBA i radi u toj slubi. Upotrebite funkciju last_insert_id (} da
biste dobili identifikator nove slube.
3. Napiite upit koji najnoviji posao iz tabele assignment. Savet: upotrebite
grupnu funkciju max () .
Odgovori
Pitanja
l. d
2. b
3. b
4. a
5. e
124 Poglavlje 8 Upotreba MySOL-ovih funkcija u komane11
Vebe
l.
2.
3.
select name, replace(job, 'Programmer', 'Analyst/Programmer')
from employee;
insert into department values
(NULL, 'Property Services');
insert into employee values
(NULL, 'Fred Smith', 'DBA', last_insert_id());
select max(workdate) from assignment;
U poglavlju
Ovo poglavlje zavrava deo "Upotreba MySQL-a" . U narednom. delu knjige, "Tipovi
tabela i transakcije u MySQL-u", pojedine maine baze podataka koje
MySQL podrava i posebne koje one pruaju.

Tipovi tabela i transakcij
u MySOL-
9 Tipovi tabela u MySQL-u
10 Upotreba transakcija u InnoDB tabelama
9
Tipovi tabela u MySQL-u
u OVOM POGLAVLJU TIPOVE TABELA koje su na raspolaganju
projektantu MySQL aplikacija. U dosadanjim primerima koristili smo uglavnom
InnoDB ili My ISAM tabele, ali postoje i druge.
Projektovanje sistema za upravljanje bazama podataka, projektovanju sistema
za druge namene, podrazumeva mnogo kompromisa. Na primer, poeljno je da se
mnogi poslovi u bazi podataka obavljaju kao transakcije, ali da bi se to obezbedilo,
treba vie vremena i troi se vie prostora na disku i memorije. Deo posla
pronalaenja najboljih kompromisa autori MySQL-a su preneli na vas, projektanta
baze podataka, tako to su vam prepustili izbor tipa tabela koje koristiti. Moete
se opredeliti zajedan od tipova koji podravaju transakcije, ukoliko je to neophodno
u vaoj aplikaciji, ili moete izabrati tip tabela koji bolje performanse, ali
ne podrava transakcije. U oba morate biti svesni kompromisa koje morate
da napravite.
Moda da se tipovi tabela nazivaju maine za skladitenje (engl. storage
engine). To odraava da je za upotrebu nekih tipova tabela neophodna zna-
posebnog programskog koda koji upravlja smetanjem podataka, indek-
siranjem, podataka i pristupanjem disku. To odraava sutinu
baze podataka: skladitenje podataka.
Izrazi transakcij"a ili podrka za transakcije se u ovom poglavlju. To
je vaan uslov o kojem treba da vodite kada birate tip tabele. U primerima koje
smo dosad naveli u ovoj knjizi, SQL upiti su se izvravali potpuno izolovana do drugih
korisnika baze podataka, ali u mnogim aplikacijama to se u stvarnosti ne deava.
Zamislite da imate bazu podataka o prometu na bankovnim Ako elite
da prebacite 1.000 dinara s jednog na drugi, potrebna su vam najmanje dva
SQL upita- jedan, koji na prvom smanjuje stanje za 1.000 dinara i drugi, koji
stanje na drugom za 1.000 dinara. Bilo bi prava katastrofa kada bi se
128 Poglavlje 9 Tipovi tabela u My:;,uL-u
zbog (na primer, prestanka napajanja) prvi upit izvrio do kraja, ali ne i drugi.
U takvim bilo bi neuporedivo bolje da se izvre ili oba upita, ili nijedan,
jer baza podataka mora uvek biti u stanju.
Tabele koje podravaju transakcije da za date da je grupa
upita nedeljiva jedinica obrade -transakcija. Trebalo bi da se cela transakcija obavi do
kraja, a ako to nije baza podataka mora da je po11iti (engl. roll back), odnosno
da se vrati u stanje u kojem je bila pre transakcije.
Transakcije i MySQL-ova sintaksa za njihovu upotrebu opisane su u poglavlju 10,
"Upotreba transakcija u InnoDB tabelama".
U MySQL-u se mogu koristiti tipovi tabela:
ISAM
MyiSAM
InnoDB
BerkeleyDB (BDB)
MERGE
HEAP
Sve navedene tipove tabela ali najvie prostora posveti-
upotrebljavanim tipovima: My ISAM i InnoDB. InnoDB i BerkeleyDB
podravaju transakcije. Drugi (ISAM, My ISAM, MERGE i HEAP) to ne
U ovom poglavlju i posebne koje pruaju My ISAM tabele,
a to su komprimovane tabele i tekstualno pretraivanje. Celo poglavlje 1 O je
posebnim maine za skladitenje InnoDB.
ISAM tabele
ISAM tabele su u MySQL samo radi podrke starijim aplikacijama.
daje njihova funkcionalnost u potpunosti odrana MyiSAM tabelama, ih
detaljno razmatrati. Planirano je da budu uklonjene iz verzije MySQL-a 5.0.
Naredni kod pravi ISAM tabelu, ukoliko vam je iz nekog razloga potrebna:
create table asset
assetiD int not null,
description varchar(255}
type=ISAM;
ISAM tabele brz pristup podacima ali ne podravaju transakcije.
deo onoga to o My ISAM tabelama vai i za ISAM tabele, pri za sta-
rije ISAM tabele postoji vie
IVIYIJMIVI .
MyiSAM tabele su uvele poboljanja:
Prenosivost tabela. Tabele smeten e na disk ili na druge medije mogu se prene ti na
drugi na kojem radi MySQL, bez obzira na platformu. To ne vai za
ISAM tabele.
Podrka za veoma velike tabele. ISAM tabela je na 4 GB.
MyiSAM da tabela bude velika onoliko koliko to dozvoljava ope-
rativni sistem. da to biti vano samo nekim korisnicima,
paljivo da odaberete operativni sistem (i sistem za rad s datotekama). Mnogi
sistemi za rad s datotekama datoteka na najvie 2 GB.
(Imajte u vidu da to moete ako upotrebite MERGE tabele.)
Efikasnije prostora na disku. Manji su rascepkanost i praznine na disku.
Manja ograni{enja klju{eva. ISAM tabele podravaju najvie 16 po tabeli,
a podrazumevana maksimalna duina je 256 bajtova. My ISAM tabele
podravaju 64 po tabeli, a podrazumevana maksimalna duina je
1024 bajta.
ISAM tabele treba smatrati zastarelim. One i dalje postoje, ali ne bi trebalo da ih
koristite u novim aplikacijama koje razvijate. Ako upotrebljavate ISAM tabele, trebalo
bi da ozbiljno razmislite o njihovoj konverziji u My ISAM. Napor koji treba uloiti je
veoma mali, a prednosti su
MyiSAM tabele
Mnogi ljudi godinama koriste MySQL ne da moe da radi i s tabelama drugog
tipa. Razlog je to to se taj tip tabela podrazumeva u svim novijim verzijama MySQL-a.
My ISAM tabele veoma brz pristup podacima ali ne podravaju
transakcije. One visoke performanse u mnogim situacijama, i kada
projektant napravi greke, a u rukanu administratora mogu da
podre i veoma obimne i/ili veoma baze podataka.
Naredni kod formira MyiSAM tabelu:
create table article (
} ;
articleiD int not null auto_increment primary key,
title varchar(255},
body text
Nije obavezno, ali na kraj moete dodati red
type=MyiSAM;
i isti rezultat.
MyiSAM tabele mogu biti jedne od tri vrste: ili kompri
movane.Tabela automatski postaje ili u zavisnosti od definicija njenih
kolona. Komprimovane tabele moete praviti samo alatke myisampack.
IJU ruyodYIJC ::J IIJJUYI ldUCid U IYIY.>UL-U
Tabele su redovi fiksne duine automatski se prave kao dok se tabele s
redovima promenljive duine prave kao tabele. Po moemo utvrditi
da li tabela ima redove fiksne ili promenljive
Tip podataka char i svi tipovi su fiksne kolona tipa
varchar, text i b lob menja se u zavisnosti od sadraja. Tabela su sve kolone tipa
char ili tipa, ali tabela koja sadri barem jednu kolonu tipa
varchar, text ili blob
U odeljku "Tekstualno pretraivanje My ISAM tabela", tabel u koju
nazvati article. To biti tabela zato to sadri kolonu tipa varchar
i kolonu tipa text. Prostor na disku koji biti potreban za skladitenje svakog reda
tabele od podataka u poljima tabele.
tabela prua vie prednosti. Pretrauje se bre od ili komprimo-
vane tabele. Baza podataka moe veoma lako zapis na osnovu indeksa
kada se svaki zapis nalazi na pomaku od datoteke. Tabela se veoma
lako smeta u ostavu (ke). Manja je verovatno nepovratnog podataka u
ozbiljnog kvara sistema- alatka za popravku tabela uspeva da restaurira
sve redove osim
Nedostatak tabela jeste to to se pri umetaqju stvarnih podataka u kolone
fiksne veli gotovo uvek rasipa prostor na disku. Tu cenu mogli biste da platite uko-
liko se vaih podataka ne razlikuje previe. Na primer, to vai za imena i pre-
zimena ljudi. cena vam moda biti previsoka ako se podaci veoma
mnogo razlikuju po Ako smatrate da prezimena zaposlenih imati uvek
maqje od 80 znakova, moda eleti da nepotrebno rasipate po 75 znakova svaki
put kada se neko preziva ili
Za tabele potrebno je sloenije upravljanje unutar samog MySQL-a.
Posao keiranja, ili popravljaqja zapisa nije tako jednostavan za mainu za
skladitenje. Razlog je to to je tabele promenljiva, ali i to to tabela
postaje rascepkana (fragmentirana).Ako je zbog promene sadraja red postao deo
podataka ostati na izvornom mestu, a deo biti smeten u novi blok unutar dato-
teke. To da se ne moe garantovati da segment datoteke koji je operativni sistem
u ke sadri sve delove reda. Osim toga, tabele moe biti tee popra-
vljivo jer ako se izgube blokovi podataka ili veze njih, ne moe se lako utvrditi
koji delovi kojim redovima pripadaju.
Da biste popravili ili defragmentirali My ISAM tabelu, moete s komandne linije
upotrebiti alatku myisamchk ili MySQL-ovu komandu REPAIR TABLE. (To je opir-
nije objanjeno u poglavlju 13",Administriranje baze podataka") . Za defragmentiranje
baze podataka, ali bez popravljanja, moete upotrebiti MySQL-ovu komandu OPTI-
MIZE TABLE. (To je opirnije opisano u poglavlju 18",0ptimizovanje baze podataka".)
IVIYI.li'IIVI liiUCIC
KomprimovanjeMyiSAM tabela
Iako tabele nastaju kao ili bez vaeg zahteva (ali kao rezultat
odluka koje ste doneli pri projektovanju), tabele se ne komprimuju automatski. Da biste
komprimovali tabelu, morate upotrebiti alatku myisampack s komandne linije. (Postoji
pack_isam, njena verzija za ISAM tabele, ukoliko ih koristite.)
Mada se komprimovanje na prvi pogled korisno, trebalo bi da ga primenjujetc
samo za neke aplikacije jer se komprimovane tabele mogu samo Ako treba da
izmenite strukturu komprimovane tabele, ili da aurirate podatke u njoj, ili da joj
dodate nove, morate da dekomprimujete celu tabelu, unesete izmenc
i zatim ponovo komprimujete tabelu.
Postupak komprimovanja koji obavlja alatka myisampack kombinacija pravog
komprimovanja (Hafinanovim kodom) i vie optimizacija je cilj saimanje kolona,
na primer, konverzijom tipova podataka u manje, i konverzijom sadraja
kolona u nabrajanja. da se svaki zapis komprimuje zasebno, dekomprimovanje
zapisa je relativno jednostavno. Na sporijim za skladiteqje
podataka trajanje operacije dekomprimovanja moe biti i zanemarljivo u pare-
s trajanjem podataka s diska.
Tekstualno pretraivanje MyiSAM tabela
Jedna od koju zasad pruaju samo My ISAM tabele jeste tekstualno pretra-
ivanje i indeksiranje. Standardni indeksi su veoma efikasni kada u tabeli treba
vrednost jednaku traenoj, ali se trae ili nizovi znakova unutar blokova tek-
sta. U takvim tekstualno pretraivanje je korisnije.
Naredna SQL komanda formira MyiSAM tabelu sa indeksom za tekstualno
pretraivanje:
create table article (
articleiD int not null auto increment primary key,
title varchar(255),
body text,
fulltext (title,body)
) ;
Naredni upit sve zapise koji sadre re 'merger :
select title
from article
where match (title,body) against ('merger');
su i sloenija pretraivanja. Naredni upit zapise koji sadre bilo
koju re iz skupa 'merge ', 'acquis i tion', 'acquire' ili 'take over'.
select title from article
where match (title,body) against ('merge acquisition acquire
takeover');
l ..lL 1 ,,._,uv1 LdUCid u tvty..JuL.-u
Obratite panju na to da zapise koji sadre barem jednu od navedenih
U ovom ne traimo nizove znakova niti zapise koji sadre sve navedene
modifikatora IN BOOLEAN MODE, koji objasniti u nastavku teksta,
mogu se zadati obe vrste pretrage istovremeno. . ,
acquire' i acquis i tions' morali smo da navedemo odvojeno zato sto
MySQL zasad jo ne podrava pretraivanje od korena (engl. stemming). pre-
traivanja od korena postoji u mnogim drugim sistemima za tekstualno pretrazrvanJe.
Ona da sistem prepoznaje da skup ima koren.
Na primer, 'acquire' je koren drugih kao to su 'acquire s', 'acquired' 1
'acquisition'.
Za svako otkriveno poklapanje se koeficijent povezanosti s traenim
pojmom (engl. relevance value), a rezultati se automatski sortiraju po vred-.
nosti tog koeficijenta. Ako elite, moete pogledati i koeficijente povezan os tr za svaki
zapis. Naredni upit prikazuje nesortiranu listu koeficijenata za sve zapise. Svaki
zapis koji ima koeficijent nula nije ni po povezan s traenim pojmom i zato se ne

select title, match (title,body)
against ('merge acquisition acquire takeover')
as relevance
from article;
Obratite panju na to da relevance nije rezervisana samo alijas za .
match(title,body) against ('merge acquisition acquire
smo je samo zato da bi rezultati bili lake
Korisniji je upit, koji prikazuje naslove i koeficijente povezanosti
dokumenata. da imamo uslov MATCH u odredbi WHERE, rezultati biti sorti-
rani, a redovi koji se ne odnose na traeni pojam zanemareni.
select title, match (title,body)
against ('merge acquisition acquire takeover')
as relevance
from article
where match (title,body) against ('merge acquisition acquire
takeover');
Postoje koje se ne mogu traiti. Da bi se poboljale performanse,
su iz indeksa ili se zanemaruju pri pretraivanju.
Kratke se ne indeksiraju. Standardno se zanemaruju i sve koje sadre manje
od slova. Na nekim instalacijama, kao to je Slashdot.org, to je ozbiljan problem,
poto su troslovni akronimi vaan deo sadraja tekstova.To
moete ako konfiguracionoj promenljivoj ft_min_word_len zadate drugaCIJU
vrednost, ali onda morate ponovo generisati sve indekse.
U indeksima za tekstualno pretraivanje moete zadati nebitne (engl. stop words).
Nebitna je bez vrednosti. To su uglavnom koje su vane za sasta-
vljanje ali za koje je malo verovatno da biti vane za sadraj teksta.
MyiSAM tabele
U engleskom jeziku, kao to su 'the', 'and', 'then' i 'soon' neophodne su, ali
nisu korisni pojmovi za traenje. U MySQL-u postoje standardne liste takvih
(za engleski j ezik) , a moete i sami sastaviti takve liste za tekstove na drugim
govornim jezicima koje indeksirate.
da je pretraivanje veoma sloen posao, vano je imati na umu
da postoje ozbiljna u pogledu performansi . Kada MySQL-ove
tabele postanu veoma velike (npr. preko 1.000.000 redova), performanse
pretraivanja osetno se pogoravaju. U manjim aplikacijama to ne bi da pred-
stavlja problem, imajte tu na umu kada pravite sloenije aplikacije.
koje su podacima ne koriste se pri pretraivanju.Ako vaa tabela
sadri tekstove objavljene u biltenu vae kompanije Acme PTY Ltd., verovatno
nmogi tekstovi u zaglavlju sadrati 'Acme'. Pretraga po toj verovatno gene-
risati mnogobrojne rezultate, koji ipak biti upotrebljivi. Ako 50% ili vie zapisa
sadri smatra se da ta nema vrednosti za koeficijenta
povezanosti.
tekstualno pretraivanje
Pri pretraivanju moete imati stepen kontrole ako upotrebite modifikator IN
BOOLEAN MODE.
Naredni upit tati samo zapise koji sadre 'linux' i izraz "Open source",
ali ne i 'desktop'. 'Java' i 'Oracle' nisu obavezne, ali kada se
koeficijent povezanosti, 'Java' rang zapisa, a 'oracle' smanjuje
rang zapisa. Redosled traenih u nizu znakova ili u zapisu nije bitan.
nelect title
from article
where match (title,body)
against ('+linux +"Open Source" -desktop Java -Oracle'
IN BOOLEAN MODE) ;
Tabela 9.1 prikazuje listu svih operatora.
lobela 9.1
()pcrator
Operatori za pretraivaqje

( )
ll ll
Ova je obavezna.
Ova ne treba da se pojavi u rezultatima.
Ova je manje vana.
Ova je vanija.
Grupie u podizraz.
Ova se moe pojaviti u rezultatima ali smanjuje rang zapisa.
Dokerski sufiks. Na primer, merge i merger, ali merge*
i merge i merger. Moe se upotrebiti samo na kraju za prctragu.
vo je izraz. Pronalazi samo sadraj, u istom redosledu.
--------------------
134
Poglavlje 9 Tipovi tabela u MySQL-u
Za pretraivanje nije neophodno da postoje indeksi za tekstualno pretrai-
vanje. Tako se mogu pretrai vati i neindeksirane tabele, ali je postupak s
Jo jedna mala razlika tekstualnog pretraivanja i jeste
to to se pri pretraivanju zanemaruju koje se poJaVlJUJU
podacima. U tom ne vai pravilo 50%. Ako pretraujemo tekstove obJaVlJene
u biltenu kompanije Acme PTY Ltd., naredni upit bi verovatno gotovo sve
redove, dok bi rezultat upita iza njega bio prazan skup.
select title from article
where match (title,body) against ('Acme' IN BOOLEAN MODE);
select title from article
where match (title,body) against ('Acme');
lnnoDB tabele
Sada razmotriti InnoDB tabele. InnoDB je maina za skladitenje koja je brza i
podrava transakcije. Njene transakcione obrade su toliko vane da
njihovoj primeni posvetiti celo naredno poglavlje.
InnoDB table
Transakcionu obradu.Videti poglavlje 10.
Zakiju{avanje podataka na nivou reda. To da samo red koji se trenutno obra-
u nekom upitu nije na raspolaganju drugim drug1h .
maina za skladitenje (osim BDB-a) primenjuje podataka na mvou
cele tabele, tj. kada jedan proces aurira jedan red tabele, cela tabela nije dostupna
drugim procesima.
Upotrebu spoljnih kiju{eva. Primeri iz prethodnih poglavlja u kojima se koriste
spoljni raditi s tabelama drugog tipa.
Dosledno u{itavanje podataka bez zakiju{avanja u komandama SELECT. (Ideja je
pozajrnljena iz Oraclea.)
InnoDB ima vlastite konfiguracione opcije, vlastiti direktorijum i vlastiti skla-
ditenja podataka. Dok My ISAM smeta svaku tabelu u zasebnu datoteku, InnoDB
smeta sve tabele i indekse u tabelarni prostor, to da se delovi jedne tabele mogu
nalaziti u vie datoteka. tome, InnoDB moe raditi s veoma obimnim
tabelama za ne vae koja operativni sistem.
imajte u vidu da u s MyiSAM tabelama,jedna InnoDB tabela zauz1ma
znatno vie prostora na disku za skladitenje istih zapisa. . . . , .
Celo naredno poglavlje, 10, je upotrebi ovih speclJalmh mogucnost1
JnnoDB-a.
Podeavanje InnoDB-a zahteva napor. Osnovnu opisali
u poglavlju 1, "Instaliranje MySQL-a", a konfiguracione opclje razmatracemo opslr-
nijl! u poglavlju 12",Podeavanje MySQL-a" .
BerkeleyDB (BDB) tabele
Iako je razvijen odvojeno od dela MySQL-a, InnoDB se moe koristiti pod
jednakim uslovima dve vrste licence.
Mnoge opsene i veoma Web lokacije koje koriste MySQL, kao to su
Slashdot (www. slashdot. org), Google (www. google. com) i Yahoo! Finance (http: l l
finance. yahoo. com), koriste mainu InnoDB. je pogodna za obradu velikih
podataka, velikom brzinom i u okruenju koje podrava transakcije.
InnoDB je jedan od najbrih sistema na svetu koji podrava transakcije, ali po cenu
izvesnih rtava. Pri upotreba, My ISAM biti bri, ali razlika biti
tako
InnoDB proizvodi kompanija InnoBase Oy, koja ima vlastitu Web lokaciju. Najno-
vije informacije o InnoDB-u na www. innodb. com.
BerkeleyDB (BDB) tabel e
Druga koju imate kada za MySQL birate mainu za skladitenje koja podr-
ava transakcije jeste BerkeleyDB se na BDB). BDB se moe nabaviti
od kompanije Sleepycat software (www. sleepycat. com) . Ova maina se koristi za trans-
akcionu obradu u MySQL-u nego InnoDB. Mada je BDB maina due vreme
na tritu, integracija s MySQL-omje relativno novijeg datuma, a u MySQL-ovoj
dokumentaciji stoji da je kvalitet s MySQL-om nivoa "gama". To da
j e pouzdanost bolja od verzije beta, ali postoje problemi . Ne zaboravite, u
MySQL-ovoj kvalifikaciji beta verzije, pouzdanost je bolja nego u verzijama softvera
koje mnoge druge kompanije kvalifikuju kao "zlatno izdanje".
BDB primenjuje podataka na nivou stranice, usled su perfor-
manse neznatno slabije od InnoDB-a. Postaje spor i kada istovremeno otvorite
broj tabela.
Sve BDB tabele moraju imati primarni (to i nije neki problem, poto se to
ionako U stvari, primarni automatski biti napravljen ako ga
sami ne zadate.
BDB tabele se u bazi podataka u obliku b-stabala (engl. b-trees) . Uporedite
to s drugim tipovima tabela za koje se indeksi u obliku b-stabala. Posledica je
sporije sekvencijalno redova tabele (to se primenjuje, npr. kada bezuslovno
sve redove tabele ili izvravate upite u kojima su indeksi neupotrebljivi).
Osim toga, BDB tabele zauzimaju vie mesta na disku.
Vano BDB tabela jeste to da ne moete po meri ti podatke
na drugo mesto na disku. Razlog je to to se zajedno s podacima tabele skladiti i apso-
lutna putanja do tih podataka. Kada pravite rezervne kopije BDB tabela, morate oba-
vezno napraviti i rezervnu kopiju datoteka dnevnika jer bez njih da
pokrenete bazu podataka.
Poglavlje 9 Tipovi tabela u MySQL-u
MERGE tabele
MERGE tabele predstavljaju vet zaobilaenja maksimalne
datoteka koja operativni sistem. Poto se svaka MyiSAM tabela smeta u
zasebnu datoteku, tabele je na maksimalnu datoteke koju
operativni sistem dozvoljava. To se moe MERGE tabele,j:r one
da se u upitima vie My ISAM tabela kao Jedna log1cka tabela.
Pogledajmo primer. Listing 9 .l sadri kod koji formira MERGE tabel u od tn
tabele dnevnika promena.
Listing 9.1 A MERGE Table Example
create database logs;
use logs;
create table log2003Jan
(logid int auto_increment primary key,
logts datetime,
entry char(255));
insert into log2003Jan values
(NULL, '2003-01-01', 'first jan entry');
create table log2003Feb
(logid int auto increment primary key,
logts datetime,
entry char(255));
insert into log2003Feb values
(NULL, 2003-02 -01', 'first feb entry');
create table log2003Mar
(logid int auto increment primary key,
logts datetime,
entry char(255));
insert into log2003Mar values
(NULL, '2003-03-01', 'first mar entry');
create table logs
(logid int auto increment primary key,
logLs datetime,
ntry char(255))
ype merge
Ullion (log2003Jan, log2003Feb, log2003Mar)
insert_method = last;
U ovom listingu napravili smo tri tabele s jednakom strukturom, log2003Jan,
i log2003Mar. MERGE tabele se primenjuju za beleenje promena,
k.10 to videti u nastavku teksta.
N n kon umetanja nekih pro bnih podataka u te tri tabele, od njih smo naravi li jednu
M ERG E tabclu.To smo uradili tako to smo napravili tabelu logs, koj;l 1111.1
IVICn\JC taUt'll"
osobine: ima istu strukturu kao tri tabele koje grupisati, njen tip je MERGE,
a sadraj je unija (UNION) sadraja sve tri tabele. Osim toga, zadali smo last
(poslednja) kao vrednost opcije INSERT_ METHOD. To da nov red koji unesemo
u ovu MERGE tabel u biti smeten u poslednju tabelu u grupi, u ovom
log2003Mar. Ostale su FIRST (podaci se u prvu tabelu u grupi) ili
NO (umetanje novog reda nije dozvoljeno u MERGE tabelu).
Tako smo formirali tabelu s kojom moemo da radimo na i koja
prividno sadri sve podatke iz svih tabela u grupi. Ako izvrimo upit
select * from logs;
rezultate:
+-------+--------------- ------+-------- ---------+
l logid l logts l entry
+-------+---------------------+----- ------------+
l l 2003-01-01 00:00:00 l first jan entry l
l l 2003-02-01 00:00:00 l first feb entry l
l l 2003-03-01 00:00:00 l first mar entry l
+-------+---------------------+-----------------+
3 rows in set (0.01 sec)
Kao to vidite, prikazani su podaci iz sve tri tabele. Zaista je vano da zapamtite da,
iako smo zadali da je kolona log id primarni MERGE tabele, mehanizam radi
malo od na koji rade primarni Njihove vrednosti
moraju biti jedinstvene, ali poto MERGE tabela upravlja istovremeno s tri
skupa primarnih nipoto nije da postoji vie od jednog reda koji
sadre istu vrednost primarnog kao to je prikazano u rezultatima navedenog
upita.
i kad su tabele koje njene komponente grupisane u MERGE tabel u, nad
njima i dalje moemo izvravati upite na komande DROP,
ALTER, DELETE FROM TABLE, REPAIR, TRUNCATE, OPTIMIZE i ANALYZE ne mogu se vie
izvriti ni nad jednom tabelom u grupi. Neke od tih komandi (DELETE FROM TABLE)
ipak moete izvriti ukoliko MERGE tabela trenutno nije otvorena. Moete je zatvoriti
komande FLUSH TABLES. U MySQL-ovoj dokumentaciji stoji da nakon
komande FLUSH moete izvriti i bilo koju od navedenih komandi, ali mi smo ustanovili
da to nije uvek sasvim Na primer, u vreme pisanja ove knjige, ako se
komande DROP izbrie jedna od tabela u grupi, automatski se brie i sama MERGE
tabela. Ako je potrebno da neku od navedenih komandi izvrite nad jednom od tabela
u grupi, najbolje je da prethodno izbriete MERGE tabel u i da je zatim ponovo napra-
vite. Brisanje MERGE tabele ni na koji ne na njene komponente niti na
podatke u njima.
Tabele koje MERGE tabelu moete komprimovati alatke myisam-
pack. To je korisno u kao to je na primer u kojem skladitima
datoteke dnevnika promena -jer se datoteke iz ranijih meseci mogu ko mp rimovati
da se novi podaci upisuju samo u poslednju datoteku.
l '
138
Poglavlje 9 Tipovi tabela u MySOL-u
HEAP tabele
HEAP tabele su izuzetno brze i cele se u memoriji. Brzina se postie zahvalju-
upotrebi heiranih indeksa.
Nedostatak cele tabele u memoriji jeste, naravno, to da u problema
s napajanjem podaci iz HEAP tabele nestaju zauvek. tabele tog
tipa su savrene za privremenih podataka.
Tabelu tipa HEAP moete napraviti na
create table testHeap
(id int not null primary key,
data char(lOO))
type=heap
max_rows = 100;
Kao to vidite, tip tabele zadali smo kao HEAP. Osim toga, primenili smo i dobro
pravilo maksimalnog broja redova u tabeli. Ako vaa HEAP
tabela previe naraste, lako se moe dogoditi da vam ponestane memorije. Maksimalan
broj redova u HEAP tabeli moe se zadati u konfiguracionoj opciji
max_heap_table_size.
HEAP tabele imaju
Nisu podrane kolone tipa AUTO_ INCREMENT.
Nisu podrani tipovi podataka BLOB i TEXT .
U HEAP tabelama ne mogu se traiti redovi na osnovu dela indeksa.
(Ako ne znate ta ovo vie informacija o indeksiranju u
poglavlju 19.)
Indeksi se mogu koristiti pri pretraivanju redova tabele samo u upitima koji u
uslovima za pretragu sadre operatore = ili <=>.
Saetak
MySQL podrava est tipova tabela: ISAM, My ISAM, InnoDB, BDB, MERGE
i HEAP.
Samo tabele tipa InnoDB i BDB podravaju transakcije.
Samo MyiSAM tabele podravaju tekstualno pretraivanje i indeksiranje.
ISAM
ISAM je zastareli tip tabela, zamenjen tipom My ISAM.
ISAM tabele imaju od najvie 4 GB.
ISAM tabele nisu prenosive dva sistema.
Jedna tabela moe imati najvie 16 a svaki moe sadrati 256 bajtova
(znakova).
.Jdl.l:ldl\
MyiSAM
My ISAM je podrazumevani tip tabele. Veoma je brz, ali ne podrava transakcije.
MyiSAM podrava komprimovanje tabela.
tabela je na maksimum koji dozvoljava operativni
s1stem, al1 se to moe MERGE tabela.
Datoteke u koje su smetene My ISAM tabele prenosive su ope-
rativnih sistema.
Jedna tabela moe imati najvie 64 a svaki moe sadrati najvie 1024 bajta.
lnnoDB
InnoDB tabele podravaju transakcije.
InnoDB podravaju na nivou redova.
Ne postoji teorijska gornja granica tabele jer jedna tabela moe biti
smetena u vie datoteka.
InnoDB dosledno redova bez u komandama
SELECT.
InnoDB tabele su prenosive operativnih sistema.
InnoDB tabele zauzimaju vie prostora na disku od MyiSAM tabela.
InnoDB tabele podravaju spoljne .
BDB
Kao i InnoDB tabele, BDB tabele podravaju transakcije. BDB tabele se
koriste u MySQL-u od InnoDB tabela .
BDB podrava podataka na nivou stranice.
BDB tabele nisu prenosive.
MERGE
MERGE tabele da se vie My ISAM tabela tretira kao jedna
tabela, se zaobilazi problem dozvoljene
MyiSAM tabela .
HEAP
se u celini u memoriji i njihova se mora
da b1 se Izbegla prevelika potronja memorije .
u HEAP tabelu nisu trajni i gube se u prestanka napa-
JanJa racunara .
HEAP tabele su superbrze, pod uslovom da imate dovoljno memorije u
koju ih smestiti.
I lEA l' tabele ne podravaju kolone tipa AUTO_INCREMENT, TEXT i BLOB.
140 Poglavlje 9 Tipovi tabela u MySUL-u
Pitanja
1. Potrebne su nam transakcije i tabele koje se lako mogu preneti na drugi opera-
tivni sistem. Za tu namenu pogodne su tabele tipa
a) ISAM
b) MyiSAM
e) InnoDB
d) BDB
2. Potrebna nam je privremena tabela za brzo pretraivanje. Trebalo bi da upotre-
bimo tabelu tipa
a) ISAM
b) MyiSAM
e) MERGE
d) HEAP
3. Potrebne su nam izuzetno velike tabele. Za tu namenu nisu pogodne tabele tipa
a) ISAM
b) MERGE
e) InnoDB
d) nijedan od prethodnih
4. Potrebno nam je tekstualno pretraivanje. Za tu namenu pogodne su tabele tipa
a) MyiSAM
b) InnoDB
e) BDB
d) HEAP
S. Pogledajte upit za tekstualno
select title
from article
where match (title,body)
against ('+php +pdf pdflib >tutorial -reference'
IN BOOLEAN MODE);
Koja od tvrdnji o ovom upitu nije
a) Teina traene 'tutorial' je
b) Rang rezultata koji sadre 'reference'
e) Rezultati pretrage moraju sadrati re 'ph p' .
d) Rezultati pretrage koji sadre re 'pdfl ib' rangirani vie od onih
koji je ne sadre.
u poglaVlJU
Vebe
Za ovo poglavlje nema formalnih vebi, ali bi bilo korisno da vebate
1 upotrebu tabela pojedinih tipova.
Odgovori
Pitanja
1. e
2. d
3. a
4. a
5. b
U poglavlju
U sled poglavlju, "Upotreba transakcija u Inn oD B tabelama", ta
pojam transakcija, zbog su transakcije tako vane i kako se one pri-
menJUJU u InnoDB tabelama.
10
Upotreba transakcija
u lnnoDB tabelama
u OVOM POGLAVLJU SE transakcijama u MySQL-u. U pri-
merima tip tabela InnoDB, ali gotovo sve to bude podjed-
nako i za Berkeley DB tabele.
teme:
ta je transakcija
Upotreba transakcija u MySQL-u
InnoDB-ov model transakcije i 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
kao nedeljiva celina. Drugim sve to treba da bude u trans-
akciji mora se uraditi u celini, ili ne sme nita uraditi. Ovaj koncept je poznat kao
nedelji vost (engl. atomicity). Kae se da je transakcija atom obrade jer se ne moe razbiti
na manje delove - se u celini ili se uopte ne
Ovaj koncept ima vane posledice kada se razmatra pristup podacima u okruenju s
vie korisnika, procesa i niti izvravanja (engl. threads) istovremeno, a vaan je i za obna-
vljanje podataka nakon kvara. Savremenim pristupa vie korisnika
istovremeno. Na njihovim je aktivno vie programa u isto vreme,
a koriste i programe kao to je softver za Web server koji formiraju vie istovreme-
nih procesa ili niti izvravanja. Svakom od tih korisnika, programa, procesa ili niti
izvravanja moe biti neophodan pristup serveru baze podataka.
Vie niti izvravanja ne smeju uticati jedna na drugu kada rade istovremeno. Ako
do greke, pri obnavljanju podataka baza podataka mora zavriti otvorene trans-
akcije. To da se baza podataka mora vratiti u stanje u kojem je bila pre
Poglavlje 10 Upotreba transakcija u lnnoDB tabelama
transakcije, ili mora da izvri celu transakciju do kraja. Uglavnom je bolje izgubiti celu
transakciju koja se sastoji od povezanih izmena nego u stanje deli-
unetih izmena rezultat moe biti sadraja baze podataka.
Ovaj koncept se moe izraziti formalno, ali je verovatno najbolje da na primeru
shvatite o se radi. Recimo da imate vrlo jednostavnu (ali potencijalno
veoma vanu) bazu podataka u kojoj se podaci o prometu na bankovnim
nima. Za svaki postoje barem podaci o identifikatoru i stanju.
Tabelu bankovnih accounts, moemo napraviti sa strukturom:
create table account
number int not null auto increment primary key,
balance float
type = InnoDB;
Verovatno vas iznenaditi na koji otvoriti tri nova
upita:
insert into account (balance) values (O. O);
insert into account (balance) values (1000.0);
insert into account (balance) values (2000.0);
Poto dosad nita nije moglo da krene ba naopako, trebalo bi da rezultati budu sle-
podaci:
+--------+---------+
l number l balance l
+ ------- +---------+
l
l
l
l l
2 l
3 l
o l
1000 l
2000 l
+--------+---------+
Ako nita unapred ne u vezi s brojevima koji se generiu u
koloni tipa auto-increment, nevaan je redosled kojim izvriti ove upite. Sasvim je
nebitno da li ih izvriti istovremeno s tri interaktivna klijentska i ne
moete znati koji upit biti izvren prvi.
To nije kada se izvravaju sloeniji upiti ili grupe upita. Pogledajte
naredne dve komande koje SOO dolara na broj 2:
# najpre stanje na
select balance from account where number = 2;
ll upit daje rezultat od 1000 dolara
ll sada upisujemo novo stanje
\lpdate account set balance = 1500 where number= 2;
Ova dva upita su povezana i moraju se izvriti zajedno. Ako klijentski
programi s drugih mogu da izmene stanje na ovom nae pro-
vere stanja i naeg stanja, moe se dogoditi da ne dobijemo rezultate koje
SiliO
..JI.d j\. ll dllltU\l.ljtll
Ukoliko dva klijentska programa izvravaju parove ovakvih upita istovremeno,
rezultati zavisiti od toga koji se u kom trenutku izvrio. Ako smo ovih
upita pokuali da upiemo uplatu od 500 dolara, a drugi klijentski program je
naredna dva upita pokuao da uplati 1 OO dolara, stanje moe biti 11 OO
dolara ili 1500 -a nijedno od toga biti rezultat.
# najpre stanje na
select balance from account where number = 2;
# upit daje rezultat od 1000 dolara
# sada upisujemo novo stanje
update account set balance = 1100 where number = 2;
Jasno je da bi to bilo neprihvatljivo, ali se u ovom problem moe lako reiti.
Ako izmene zadamo kao relativne a ne kao apsolutne, nedeljive jedinice i reili
smo problem. Naredni upit davati ispravne rezultate, bez obzira na to da li se u isto
vreme izvravaju i drugi upiti:
update account set balance = balance + SOO where number = 2;
U MySQL-u je jedna komanda update uvek nedeljiva. Ne moe je prekinuti
druga komanda, niti se moe izvriti samo se cela, ili u
greke cela biti ponitena.
Sloeniji su malo tee shvatljivi . Pogledajte naredni par upita je svrha
prenoenje iznosa od 1000 dolara sa 2 na l:
update account set balance = balance - 1000 where number = 2;
update account set balance = balance + 1000 where number = l;
Oba upita unose izmenu u relativnom obliku, ali je vano da se oba upita izvre da
bismo dobili smislene rezultate. Trebalo bi da nakon izvravanja upita iznos novca u
sistemu bude isti kao pre izvravanja upita. Novac treba da bude s jednog
na drugi, a ne da se samo pojavi na jednom ili nestane s drugog. Ako
do prekida napajanja izvravanja prvog i drugog upita, podaci vie biti

U jednostavnim problem se moe tako to se oba upita zdrue
u jednu SQL komandu. U ovom prim eru moemo napisati upit:
update account as source, account as dest
set source.balance = source.balance - 1000,
dest.balance = dest.balance + 1000
where source.number = 2 and dest.number = l;
Poto smo upotrebili dva alijasa (source i dest) za istu tabelu, account, obezbedili
smo da izmena postane nedeljiva i da se u potpunosti izvri ili da se uopte ne izvri.
Ne moramo da brinemo da li server prestati da radi tokom izvravanja nekog dela
operacije koju smo zahtevali.
U ovom "stradala" je jedino razumljivost upita. Ovako kombinovan upit je
slabije razumljiv i tee se otkrivaju greke nego u prvoj verziji koju smo naveli.
ruyldVIjt: lU UJJUllt:Ud U IIIIIUUD l.dU'Cidllld
U mnogim biti zdrui vanje svih povezanih upita u jedan
kao u navedenom primeru.Jedino reenje u takvim ukoliko elite razu-
mljiv kod, jeste da koristite MySQL-ovu sintaksu za transakcije. Ako grupu komandi
kao transakciju, time obavetava te bazu podataka da je to povezan i nedeljiv
skup, koji se mora obraditi kao nedeljiva jedinica; moraju se izvriti ili sve komande u
skupu ili nijedna od njih. Pomenuta dva upita moete izvriti kao jednu transakciju
SQL komandi:
s tart transaction;
update account set balance
update account set balance
commit;
balance 1000 where number
balance + 1000 where number
2 o
'
l
'
Vana osobina transakcija jeste da nisu vidljive u drugim sesijama dok ne budu
zavrene i (tj. izmene unete u bazu podataka). Nijedna druga nit izvravanja
(proces) ne moe da podatke iz tabele ili tabela dok se ne zavri
postupak auriranja koji ste
Druga prednost transakcija jeste to da se izvrene transakcije mogu
ponititi. Ako transakciju ponitimo pre nego to je potvrdimo (engl. commit), sve
izmene koje su upiti koji transakciju ponitene.
U naem primeru prenoenja novca na drugi ako dodamo komandu SELECT
da bismo proverili da ne skidamo vie novca sa izvornog nego to ga ima na
njemu, moemo upotrebiti rezervisanu ROLLBACK ukoliko elimo da ponitimo
r clu transakciju. Sintaksa upita izgledala bi ovako:
aLart transaction;
update account set balance = balance - 1000 where number 2;
\lpda t e account set balance = balance + 1000 where number l;
s lect balance from account where number = 2;
ll select kae da je stanje na broj 2 negativno!
ll bolj e da ponitimo promenu
rollback;
Komanda ROLLBACK prekida transakciju i ponitava sve izmene od
transakcij e. Transakcija koja je bila ponitena umesto da bude ne ostavlja
nikakav trag na podacima. da rezultati nisu bili vidljivi iz drugih
lt .msa kcija, stanje baze podataka isto je kao da transakcija nije ni bila
Upotreba transakcija u MySOL-u
l >.t bi ste mogli da koristite transakcije kako je opisano u prethodnom odeljku, morate
upotrebiti tip tabela koji podrava transakcije- to moe biti InnoDB ili BDB. Postoje
sintakse koje daju isti rezultat.
Sintaksa START TRANSACTION je sinonim za BEGIN ili BEGIN WORK. Moda
kori stiti jedan od ovih oblika da bi va kod ostao kompatibilan s drugom bazom poda-
l ;tka koju imate, ali uglavnom se sintaksa START TRANSACTION, da
Jl' propisana standardom SQL- 99.
UjJUllt:Ui:l u IVIY;)UL- U
Podeavanje automatskog transakcije
U MySQL-uje standardno automatsko transakcija (reim rada
autocommit). Svaki upit koji pokrenete, automatski se izvrava u okviru vlastite
transakcije. Moete zamisliti da se sve odvija kao da ste zadali komande START
TRANSACTION i COMMIT ispred i iza svakog upita koji pokrenete. Par jednostavnih upita
kao to su
update account set balance = balance - 1000 where number
update account set balance = balance + 1000 where number
izvrava se kao da su bili napisani u ovom obliku:
s tart transaction;
update account set balance
commit;
s tart transaction;
update account set balance
commit;
Ukoliko upiete
s tart transaction;
balance - 1000 where number
balance + 1000 where number
nita se dogoditi dok ne upiete i
commit;
2
'
l
'
2;
l
'
Automatsko transakcija moete komande SET na

set autocommit=O;
Kao to biste i sami komanda MySQL u reim autocommit:
set autocommit=l;
Poto je promenljiva autocommi t lokalna za sesiju, izmena reima rada vai samo za
upite koje sesija, dok je ta sesija aktivna.
Ako automatsko transakcija, nije potrebno zadati
komandu START TRANSACTION da biste transakciju. Nipoto ne zaboravite da
povremeno izdate komandu COMMIT da biste izmene koje ste trajno preneli u
bazu podataka.
Bez obzira na to da li je reim autocommit ili u slu-
se izmene koje automatski (i prenose u bazu).Ako koristite
tip tabela koji ne podrava transakcije, kao to je My ISAM, sve izmene koje
odmah se u bazu, bez obzira na vrednost promenljive autocommit. Slobo-
dno moete grupisati komande komandi START TRANSACTION i COMMIT, ali to
imati nikakvog uticaja ako tabela ne podrava transakcije. Moete upotrebiti
i komandu ROLLBACK. Time izazvati greku, ali u tabeli koja ne podrava trans-
akcije, ta komanda prosto imati nikakvog efekta ni na ta to ste izmenili.To moe
biti korisno kada testirate kod ili kada iz datoteke slike stanja te podatke na server
koji radi s drugim tipom tabela.
l
ruyldVIJt: lU UfJUllt:Ud U IIIIIUUD ldUt:ldllld
U tabelama koje podravaju transakcije, postoje akcije (osim izdavanja
komande COMMIT) koje automatski pokrenuti komandu COMMIT. Ako zahtevate
podataka, time implicitno potvrditi sve upite.
podataka
Druga da iskoristite deo prednosti transakcija jeste da
i tabele.
Ako zaista elimo da primer koda za deponovanje novca na bankovni napi-
eme s dva odvojena upita, to bi izgledalo ovako:
lock tables account write;
select balance from account where number = 2;
update account set balance = 1500 where number = 2;
unlock tables;
Komanda LOCK TABLES pokuava da sve tabele koje navedete da bi
nit izvrenja mogla da radi s njima bez ometanja. Komanda UNLOCK TABLES sve
blokade koje je nit postavila. Postupak deblokade tabela vrlo je jednostavan.
Ukoliko ste tabel u, imajte u vidu da je morate to pre osloboditi da biste to
manje ometali druge niti. tabela je sloenije pitanje.
Sve tabele koje vam trebaju morate istom komandom. U prethodnom
prim eru zahteva se samo jedne tabele, ali ako nameravate da pristupate
grupi tabela istovremeno, ili alijasima iste tabele, morate ih sve navesti u
istoj komandi, na primer:
lock tables account write, account as a read, othertable low_priority
write;
Poto komanda LOCK TABLES sve blokade koje ste pre nje postavili, ako
pokuate da grupiete blokade koje su vam potrebne za vie komandi, sve prethodne
blokade ukinute a blokada vaiti samo za poslednju komandu u grupi.
Postoje dve vrste blokada: za i za pisanje. Ako vam je potreban pristup tabeli
radi upisivanja podataka i ne moete dozvoliti da druge niti pristupaju tabeli u isto
vreme kad i vi, blokada za pisanje da bilo koja druga nit tabelu ili pie
u nju dok vi ne oslobodite tabelu. Ukoliko nameravate samo da tabelu, nema
nik:lkvc tete ako dozvolite da i druge niti tabelu u isto vreme. Blokada za
sprcbva druge niti da piu u tabel u samo dok je vaa nit blokira.
nlokada za pisanje moe se zadati sa opcijom low_priority (nizak prioritet). U sva-
kon! sistemu koji blokiranje tabela, i MySQL, neophodna su
pr.1v1Ll koja ko u sukobljenih zahteva prvi da postavi blokadu.
MySQL daje prioritet zahtevima za blokade radi pisanja da bi da
mncnc uskladitenih podataka budu obavljene to pre. Ako vam takvo ponaanje ne
odgov:mt, moete zahtevati blokadu za pisanje niskog prioriteta kao to smo uradili
"' tabel u othertable u prethodnom primeru. postoji Kad god
:t.illtcvatc blokadu tabele, moe se dogoditi da morate da ona bude odobrena.
moae1 1nn on
Blokada niskog prioriteta odobrena samo ako nema nijedne druge niti koja je
zahtevala blokadu za ili pisanje u toj tabeli. ako je server veoma opte-
takva situacija se moda nikad dogoditi.
Verovatno upravljati blokadama na ovakav ali postoje
izvesni razlozi zbog kojih biste to ipak Ako imate aplikaciju koja treba da obez-
bedi veoma visoke performanse a transakciona obrada joj je potrebna samo u redim slu-
moe biti isplativije da koristite brze tabele koje ne podravaju transakcije i da
postavljate blokade da biste reili problem transakcione obrade.
Jo jedan u kojem izdavati komande LOCK TABLES jeste kada
direktno manipuliete MySQL-ovim datotekama s podacima. Na primer, ako elite da
obezbedite da sadraj datoteka na disku ostane i nepromenjen dok pravite
njihove rezervne kopije, morate te datoteke.
Najvanije to treba da zapamtite u vezi sa podataka jeste da morate
to pre ukinuti sve blokade koje ste postavili drugi sistemi i korisnici morati
da vas Imajte u vidu da neki poslovi za obavljanje postavljati blokade,
kao to su indeksiranje ili izrada rezervne kopije velike datoteke, mogu potrajati pri-
dugo.
Transakcioni model lnnoDB
Svi transakcioni sistemi za upravljanje bazama podataka nastoje da postignu manje-vie
iste ciljeve ali uz primenu pristupa problemu. Da bi izolovao transakcije
jedne od drugih, InnoDB primenjuje podataka na nivou reda tabele. To
da se transakcije mogu odvijati nad sadrajem iste tabele u isto vreme,
pod uslovom da samo tabelu ili da ne menjaju iste redove kada upisuju podatke.
izmene da druge niti pristupaju samo redovima na koje
deluje transakcija, ali ne i celoj tabeli. toj osobini, InnoDB obezbe-
visoke performanse uz prednosti koje biste od jednog savremenog
sistema za upravljanje bazama podataka.Jedna od tih prednosti jeste s gru-
pom pravila ACID.
sa ACID pravilima
Vaan pojam iz terminologije baza podataka koji jo nismo definisali jeste ACID. To je
akronim od engleskih Atomicity, Consistency, Isolation i Durability (nedeljivost,
izolovanost i trajnost). Mnogima smeta da pri
MyiSAM tabela",MySQL pada na ACID ispitu". Kada se koriste InnoDB tabele,
MySQL je sa ACID pravilima.
Atomicity (nedeljivost) da je svaka transakcija nedeljiva celina. U bazu poda-
taka moraju se uneti sve izmene koje transakcija zahteva, ili nijedna od njih. U
spoljne greke, jasno je da bi bilo savreno kada bi postupak obnavljanja baze podataka
bio u stanju da dovri sve transakcije koje su bile u trenutku greke;
tim, prihvatljivo je i da te transakcije budu ponitene.
Poglavlje 10 Upotreba transakcija u lnnoDB tabelama
Consistency da svaka operacija nad podacima treba da prebaci
bazu podataka iz jednog ispravnog stanja u drugo ispravno stanje. sme biti
stanja" u kojima podaci nisu potpuno Osim toga, trebalo b1 da baza pvodataka
operacije koje naruavaju podataka. Ako u baz1 podataka :u vate
bankovne koji pripadaju klijentima banke, ne b1 trebalo da bude moguce da
neko otvori koji pripada klijentu, niti bi trebalo dozvoliti brisanje
klijenta iz tabele klijenata ukoliko u tabeli ima koji mu pripadaju ....
Isolation (izolovanost) da transakcije ne deluju jedna na drugu dok se odviJaJU.
Svaka transakcija vidi svet oko sebe kao da je jedina koja i menja
nosti to nije uvek tako, ali se blokada moe takav priv1d. U zav1snost1
od podeenosti baze podataka i opcija koje upotrebite, u praksi imati raz-
nivoe izolovanosti. (Opirnije objanjenje u odeljku.)
Durability (trajnost) da izmene koje je transakcija a su bazi
podataka, treba da postanu trajne. Ovaj uslov se moe lako ispuniti u
programu, ali u sloenom sistemu za upravljanje relacionim bazama podataka, kojl
podatke i odrava vie verzija istih podataka u isto vreme, problem se pret-
vara u pravo "minsko polje". Osim toga, trajnost i to da bi u kvara trebalo
da postoji povratka baze podataka u stanje. Ako se napa-
janja, kvar diska ili druga katastrofa dogodi trenutka u kojem klljentski pro-
gram poslao transakciju i trenutka upisivanja izmena na d1sk, trebalo b1 da postOJI
da se, kombinacije rezervnih baze 1 .
transakcija, baza podataka vrati u stanje pre kvara, pa cak 1 da se dovrse transakciJe koje
su bile ali ne i
Ako koristite Inn oD B tabele (ili Berkeley DB tabele), MySQL je sa ACID
pravilima. Nedeljivost je upotrebom za Transakcije i
spoljni podataka. Mozete mvo 1Zolovanost1
transakcija jedne od druge. Binarni dnevnik i alatke za popravlpnJe podataka
trajnost izmena. (Replikovanje izgradnju sistema s vrlo v1sokun
stepenom trajnosti bez ijedne
Izolovanost transakcija
InnoDB tabele mogu da se rade s nivoa izolovanosti transakcija. Redosledom od
ka najslabijem, to su
Serializable (transakcije se serijalizuju)
Repeatable read (podaci su ponovljivi pri svakom
Read committed (dozvoljava se podataka iz transakcija)
Read uncommitted (dozvoljava se podataka iz transakcija)
Kao i u mnogim drugim morate napraviti kompromis robu-
snesti i performansi.
l ransakciOni model lnnoDB
Nivo izolovan osti serializable je savren gledano iz ugla i robusnosti
S podataka i njihove izmene odvijaju
se pnv1dno u mzu, pn cemu se svaka 1zmena cela upisuje u bazu podataka pre nego
to dozvoljeno istog podatka. Transakcije ne moraju da se uvek
?dVIJaJU bez preplitanja da bi se dobio privid serijalizovanih transakcija
Jer su mnoge potpuno nezavisne jedna od druge, ali ako dve transakcije deluju na iste
podatke u isto vreme, one biti serijalizovane. Poto u tom mora do
podataka i na njih, kombinovano s obavezom ispitivanja i pred-
koje se transakcije rezultat je to da je nivo izo-
lovanosti serializable naj sporiji transakcione obrade. Ako elite da radite s tim
nivoom izolovan osti, komanda je
set transaction isolation level serializable;
Podrazumevani nivo za InnoDB je repeatable read. Pri tom nivou izolovanosti svaka
transakcija radi sa zasebnom verzijom tabele u kojoj svaki red ima isti sadraj k;o na
transakcije. Garantuje se da je reda ponovljivo, tj. da se iz istog reda
svaki put isti podaci. Ako na transakcije pozovete
sel ect * from account where number=l;
a zatim isti upit ponovo izvrite kasnije u transakciji, oba puta isti rezultat.
moete dobiti i ono to se zove jm1tomski podaci (engl. phantom reads). Moe
se dogoditi da druga transakcija koja se zavri pre vae doda nove redove u tabelu.Ako
dvaput izvrite isti upit koji sadri uslov, kao
select * from account where balance>lOOO;
moe se dogoditi da pri drugom dobijete nove redove - fantomske redove -
kojih nije bilo prvi put.
Trebalo bi da u praksi vrlo retko na fantomske podatke u MySQL-u.
lnnoDB reava problem algoritma nazvanog blokiranje (engl.
11ext key lock ing) , pod uslovom da je kolona za koju ste zadali uslov u upitu indeksirana.
Verovatno znate da InnoDB primenjuje podataka na nivou redova.
se transakcija odnosi na red tabele, taj red se da bi transakcija
bila Izolovana od drugih. Osim redova na koje se transakcija odnosi,
,tl goritam blokiranja blokira i razmake redova koje u
tndeksu. Poto se problem fantomskih podataka reava na taj nivo izolovanosti
wrializ able da koristite samo u malom broju sistema .
_Kada na serveru podesite nivo izolovanosti read committed, transakcije zapravo vie
nece b1t1 Ako izvrite neki upit, a zatim ga kasnije u transakciji pono-
VIte, dob1cete razhc1te rezultate ukoliko je druga transakcija u izmenila
podatke i prenela izmene u bazu. Ako vam ba to odgovara, komanda je
Hl'L transaction isolation level read committed;
2 Poglavlje 1 O Upotreba transakCIJa u lnnouts taoe1ama
Pri najnieg nivoa izolovanosti, read uncommitted,javljaju se dva pitanja-
da li su transakcije izolovane i pa prema tome, ne kre ACID pravila, i da li
se uopte moe o transakcijama. U ovom reimu rada, transakcije mogu da
izmene koje su druge transakcije a da te izmene jo nisu
(prenete u bazu podataka). To se zove prljavih podataka (engl. dirty reads) i moe
sc prihvatiti samo u zaista posebnim okolnostima, npr. kada znate da sve aktivne niti
samo ili samo upisivati podatke, ali ne i jedno i drugo. Da biste podesili nivo read
uncommitted, upotrebite komandu:
set transaction isolation level read uncommitted;
Tabela 10.1 prikazuje osobine svakog nivoa izolovanosti.
Tabela 10.1 Osobine nivoa izolovanosti transakcija
Prljavi podaci
Read Uncommitted
Read Committed Nisu
Repeatable Read Nisu
Serializable Nisu
Saetak
Neponovljivi podaci


Nisu
Nsu
Fantomski podaci


(ali malo
verovatni)
Nisu
Transakcija je grupa SQL upita koja se kao nedeljiva celina. Izvrava se
u potpunosti ili se ponitava u potpunosti.
Standardna SQL-ova sintaksa za transakcije izgleda ovako
start transaction;
# do work
commit;
ali postoji i vie drugih ekvivalentnih da se postigne isti rezultat.
ACID je akronim za Atornicity, Consistency, Isolation i Durability (nedeljivost,
izolovanost i trajnost). Trebalo bi da zapamtite ta ove
drugi za hteti da razgovaraju s vama.
Redosledom od ka najslabijem, nivoi izolovanosti transakcija su
serializable, repeatable read, read committed i read uncommitted. Podrazumevani nivo u
Inn o DB tabelama je repeatable read.
Pitanja
l. Ako je reim autocommit transakcija biti
a) kada se izda komanda COMMIT
b) kada se zahteva blokada tabele
e) i a) i b)
d) ni u jednom od navedenih
2. Nedeljivost transakcije
a) izvravaju se sve operacije koje transakcija zahteva ili se nijedna ne izvrava
b) operacije prebacuju bazu podataka iz jednog stanja u drugo
e) transakcije ne jedna na drugu
d) izmene koje su transakcije treba da ostanu trajne
3. Izolovanost transakcije
a) se izvravaju sve operacije koje transakcija zahteva ili se nijedna ne izvrava
b) operacije prebacuju bazu podataka iz jednog stanja u drugo
e) transakcije ne jedna na drugu
d) izmene koje su transakcije treba da ostanu trajne
4. Trajnost transakcije
a) izvravaju se sve operacije koje transakcija zahteva ili se nijedna ne izvrava
b) operacije prebacuju bazu podataka iz jednog stanja u drugo
e) transakcije ne jedna na drugu
d) izmene koje su transakcije treba da ostanu trajne
5. U reimu ponovljivog moe se dogoditi da
Vebe
a) prljave podatke
b) neponovljive podatke
e) fantomske podatke
d) nijedno od prethodnog
Dokumentacija za MySQL/InnoDB sadri mnogo saveta za poboljanje performansi
sistema kada se koriste InnoDB tabele. Primenite to broj na svoj sistem.
Moete od ovog mesta:
www.innodb.com/ibman.html#InnoDBTuning
Na serveru koji nije previe vaan za poslovanje firme, sruite MySQL dok ste
usred neke transakcije. Nije neophodno da gurnete diskova s velike
visine, niti da kabi za napajanje iz Dovoljno je da prekinete rad
MySQL-ovog procesa. Pregledajte sadraj dnevnika izmena i posmatrajte ta se
kada ponovo pokrenete server.
154 Poglavlje 10 Upotreba transakcija u lnnoDB tabelama
Odgovori
Pitanja
l. e
2. a
3. e
4. d
5. e
U poglavlju
U poglavlju ll MySQL-ov sloen sistem upravljanja pravima korisnika.
Na raspolaganju je bogat izbor za koju dati korisnicima baze
podataka. U tom poglavlju opcije i na koje se njima
upravlja.
v
Administriranje MySQL-a
11 Upravljanje pravima korisnika
12 Podeavanje MySQL-a
13 Administriranje baze podataka
14 Izrada rezervnih kopija i obnavljanje podataka
15 Zatita MySQL servera
16 Replikovanje baze podataka
11
Upravljanje pravima korisnika
J EDNA OD MYSQL-OVIH NAJBOLJIH OSOBINA jeste njegov sloen sistem prava
korisnika. U ovom poglavlju se pravljenjem naloga, pravima
koja su na raspolaganju i na koji su ta prava predstavljena u MySQL-ovim
l<lbelama. teme:
Pravljenje naloga komandi GRANT i REVOKE
Nivoi prava
Tabele prava
Pravljenje naloga komandi
GRANT i REVOKE
Prava za pristup podacima dodeljuju se nalozima komande GRANT,
n ukidaju se komande REVOKE. To su standardne SQL-ove komande koje
moete izvriti na isti kao i bilo koju drugu komandu navedenu u ovoj knjizi. Svi
podaci o korisnicima MySQL-a i njihovim pravima pristupa se u MySQL-ovoj
bazi podataka, potpuno isto kao i podaci s kojima rade aplikacije koje ste vi napravili.
Da biste mogli da izvravate komande koji se pominju u ovom odeljku, potreban
vam je nivo prava za pristup podacima. Ako ste sami instalirali MySQL,
imate pristup nalogu root, pa prema tome i nivo prava. Ako MySQL
koristite na koji neko drugi administrira (kao to je na poslu ili iznaj-
mljeni moda nemate nivo prava da biste izvravali te upite.
U tom poruku o greci nalik na
ERROR 1045: Access denied for user: 'laura127.0.0.1' (Using pass-
word: YES)
Dodeljivanje prava
Najpre razmotriti komandu GRANT, koja da pravite nove
naloge i da dodeljujete korisnicima prava za pristup bazama podataka, tabelama i funk-
cija mn. Pogledajte primer:
gran l liU (e
158 Poglavlje 11 Upravlj anje pravima kori snika
Ova komanda fomura nalog za korisnika je ime l uke kada on pokua da se pri-
javi na MySQL server s localhost. Tom nalogu dodeljuje lozinku
lozinka, koju je vrlo teko pogoditi - razume se, vi zadati neto bolje!).
usage opisuje pravo koje dodeljujemo korisniku luke. Pravo usage da korisnik
moe samo da se prijavi na server i nita vie. U odredbi ON zadajemo objekte na koje
se odnose prava koja dodeljujemo korisniku. da korisniku dodeljujemo samo
pravo da se prijavi na server, ta odredba je u ovom izlina.
Opti oblik komande GRANT je, kako stoji u MySQL-ovoj dokumentaciji,
GRANT vrsta_prava [(lista_kolona)] [, vrsta_prava [(lista_kolona)]
... ]
ON {ime_tabele l * l *.* l ime_baze.*}
TO ime_korisnika [IDENTIFIED BY [PASSWORD] 'lozinka']
[, ime_korisnika [IDENTIFIED BY 'lozinka'] . .. ]
[REQUIRE
NONE l
[{SSLI X509}]
[CIPHER [AND]]
[ISSUER davalac_sertifikata [AND]]
[SUBJECT subjekt]]
[WITH [GRANT OPTION l MAX_QUERIES_PER_HOUR # l
MAX_UPDATES_PER_HOUR # l
MAX CONNECTIONS_PER_HOUR #]]
U odredbi GRANT treba da navedete prava koja dodeljujete. Koja sve prava postoje,
u narednom odeljku. Neka prava su globalna (odnosno, vae za sve baze
podataka na serveru), dok druga vae samo za objekte (baze podataka, tabele
ili pojedine kolone tabela).
U odredbi ON treba da navedete objekte na koje se odnose prava koja dodeljujete.
To moe biti ime tabele ili ime baze podataka, ili ime baze podataka sa svim njenim
tabelama (oblik ime_baze. *). Umesto imena objekta, moete zadati i *. *, to ozna-
sve baze podataka i sve tabele u njima. Ako zadate samo *, prava koja dodeljujete
vae samo za otvorenu bazu podataka. Ako nije otvorena nijedna baza poda-
taka, prava se dodeljuju kao da ste zadali *. * u odredbi ON.
U odredbi TO treba da navedete korisnika kome dodeljujete prava. Ako taj korisnik
ima nalog, dodaju mu se nova prava. Ukoliko nalog ne postoji, MySQL ga
napraviti . U ovoj odredbi moete zadati vie od jednog korisnika te imena s
kojih se mogu prijavljivati, na primer, fredlocalhost. Ako imate pri prija-
vUivanju kao korisnik za kojeg je upravo napravljen nalog, u komandi GRANT navedite
i ime s kojeg se prijavljujete. Ime MySQL-ovog naloga ne mora
biti jednako imenu pod kojim se korisnik prijavljuje u operativni sistem. Ime kori-
snika moe sadrati najvie 16 znakova.
Odredbom IDENTIFIED BY zadaje se lozinka novog korisnika, ili dodeljuje nova
lozinka korisniku.
Korisnici mogu da menjaju svoje lozinke komande:
seL password = password('novalozinka');
Korisnikovu lozinku moete izmeniti ako izdate komandu, na primer,
set password for fredlocalhost = password('novalozinka');
Da biste to uradili, morate imati pristup bazi podataka mysql.
Nivoi prava
Odredba WITH GRANT OPTION je specijalno pravo koje korisniku da
svoja prava dodeljuje drugim korisnicima. Ako ustanovite da ne moete da dodeljujete
prava drugim korisnicima, razlog je to to vam nedostaje ovo pravo. Osim toga, dru-
gom korisniku ne moete dodeliti pravo koje sami nemate.
Odredbu WITH moete upotrebiti i da biste po satu broj izvrenih upita,
unetih izmena, ili uspostavljenih veza s bazom podataka. Podrazumevana vrednost tih
parametara je nula, to da nema
Odredba REQUIRE da zahtevate da se korisnik prijavljtije
putem veze. Da biste mogli daje koristite, da podesite MySQL na
To podrobnije razmotriti u poglavlju 15, "Zatita MySQL
" servera .
Nivoi prava
Prava koja moete dodeliti komande GRANT dele se u dve osnovne kategorije:
prava za korisnike i prava za adnunistratore.
Prava za korisnike
Prava za korisnike pobrojana su u tabeli 11.1.
Ta bela 11 .1 Prava za korisnike
Pravo
CREATE Korisniku je dozvoljeno pravljenje tabela.
CREATE TEMPORARY TABLES Korisniku je dozvoljeno prav ljene privremenih tabela.
DELETE
EXECUTE
INDEX
INSERT
LOCK TABLES
SELECT
SHOW DATABASES
UPDATE
USAGE
Prava za administratore
Korisniku je dozvoljeno da brie redove iz tabela.
Korisniku je dozvoljeno da izvrava procedure.
Korisniku je dozvoljeno da pravi indekse.
Korisniku je dozvoljeno da nove redove u table.
Korisniku je dozvoljeno da tabele.
Korisniku je dozvoljeno da redove.
Korisniku je dozvoljeno da izdaje komandu SHOW DATABA-
SES da bi dobio listu baza podataka koje postoje na serveru.
Korisniku je dozvoljeno da aurira podatke.
Korisniku je dozvoljeno da se prijavi na server, ali osim toga,
ne moe da radi nita drugo.
U tabeli 11.2 prikazana su prava koja bi trebalo da se dodeljuju samo administratorim3.
Neka njima moete dodeliti i korisnicima, ako procenite da bi to bilo
ispravno, ali nijedno od tih prava ne treba da se podrazumeva za korisnike.
Poglavlje 11 Upravljanje pravima korisnika
Tabela 11.2 Prava za administratore
Pravo
ALL Korisnik ima sva prava osim WITH GRANT OPTION.
ALTER Korisniku je dozvoljeno da menja strukture tabela. Ovo pravo
moete dodeliti korisnicima koji imaju dovoljno znanja, ali
budite oprezni pri tome jer se moe (zlo)upotrebiti i za promenu
sadraja tabela prava.
DROP Korisniku je dozvoljeno da brie tabele. Ovo pravo moete dodeliti
korisnicima u koje imate dovoljno poverenja.
FILE Korisniku je dozvoljeno da podacima iz jedne datoteke dopunjuje ili
menja sadraj druge datoteke. Ovo pravo moete dodeliti
korisnicima u koje imate dovoljno poverenja. Pazite se korisnika
koji pokuavaju da proslede podatke u datoteku koju slobodno
izaberu, kao to je /etc/passwd ili datoteka!
PROCES S Korisniku je dozvoljeno da prikae listu svih procesa- tj. da vidi sve
procese koje MySQL izvrava.
RE LOAD Korisniku je dozvoljeno da izdaje komandu FLUSH. Ova komanda
ima vie namena. U nastavku ovog poglavlja
komandu FLUSH PRIVILEGES, a komandom FLUSH se
detaljnije u poglavlju 13.
REPLICATION CLIENT Korisniku je dozvoljeno da ispituje gde se nalaze glavni i zavisni
serven.
REPLICATION SLAVE Specijalno pravo namenjena specijalnom korisniku replikovanja na
zavisnom serveru.Vie informacija o tome u poglavlju 16.
SHUTDOWN Korisniku je dozvoljeno da izdaje komandu mysqladmin
shutdown.Vie informacija o tome u poglavlju 13.
SUPER Korisniku je dozvoljeno da se prijavljuje na server i kada je s
MySQL-om uspostavljen maksimalni dozvoljeni broj istovremenih
veza i moe da izvrava komande CHANGE MASTER, KILL (thread) ,
mysqladmin debug,PURGE MASTER LOGSiSET GLOBAL.
WI TH GRANT OPTION Korisniku je dozvoljeno da drugima dodeljuje svako pravo koje sam
1ma.
Postoji jo jedno pravo koje se zove REFERENCES. Rezervisano je za upo-
trebu i mada ga moete dodeljivati, zasad nema nikakvog efekta.
ukupnih prava
komande GRANT moete dodeliti prava na nivoa:
Globalna prava koja vae za sve baze podataka na serveru. Zadaju se
niza znakova*.* u komandi GRANT. Na primer:
grant all on*.* to fred;
Prava koja vae samo za bazu podataka. Zadaju se izrazom
irne_ba z e . * u komandi GRANT:
q n mL a ll on empl oyee .* to fred;
.............. ,., ..... .
Pravo pristupa tabeli. Dodeljuje se tako to se navede ime te tabele
u komandi GRANT:
grant select on department to fred;
Prava pristupa koloni. Dodeljuje se tako to se zada ime kolone
u odredbi GRANT komande GRANT. Na primer:
grant select (employeeiD) on employee to fred;
Kada da li korisnik ima pravo da izvri posao, MySQL kombi-
nuje operatora OR korisnikova globalna prava, prava koja ima za bazu poda-
taka, prava koja ima za tabelu i prava koja ima za kolonu.
Upotreba komande REVOKE
Komanda REVOKE suprotna je komandi GRANT i slui za ukidanje prava koja korisnik
ima. Na primer:
revoke all on employee.* from fred;
Opti oblik komande revoke izgleda ovako:
REVOKE vrsta_prava [ (lista_kolona) l [, vrsta_prava [ (lista_kolona) l
... l
ON {irne_tabele l * l ** l ime_baze.*}
FROM ime korisnika [, ime_korisnika ... l
Kao to vidite, odredbe su u sutini iste kao u komandi GRANT i uki-
danje prava.
Tabele prava
Podaci koje menjate komandi GRANT i REVOKE se u bazi podataka koja
se zove mysql. Umesto komandi GRANT i REVOKE, tabele u toj bazi podataka
moete i direktno, ukoliko znate ta treba da uradite. Osim toga,
podatke iz tih tabela moete i da da biste lake reili probleme u vezi s pra-
vima ukoliko se pojave.
Ako sadraj tih tabela menjate direktno, morate izdati komandu
flush privileges;
da bi izmene da vae.
U bazi podataka mysql nalazi se est tabela:
user tables_priv
db columns_priv
host func
Prvih pet tabela koristi se za podataka u vezi s pravima korisnika. (U tabeli
func skladite se podaci koji se funkcija koje korisnici piu, ali to je tema koja
izlazi izvan okvira ove knjige.)
t"091CIVIjt: ll Uf.HCIVIJCIIIjt: fHCIVIIIICI I'.UII)IIII'.d
Prve tri tabele- user, db i host -koriste se kada se da li imate pravo pri-
stupa bazi podataka. Svih pet tabela se koristi kada se imate li pravo da
izvrite komandu.
Tabela user
Tabela user sadri podatke o globalnim pravima korisnika.
Ova tabela ima kolone:
Kolone za opseg vidljivosti Na osnovu sadraja ovih kolona se koji red
treba Ovoj grupi pripadaju kolone:
Host: Ime s kojeg korisnik uspostavlja vezu
user: Ime korisnika
Password: Korisnikova lozinka, u formatu ifrovanom funkcije
PASSWORD ()
Kolone za prava Svaka kolona odgovara jednom globalnom pravu i moe
sadrati vrednost y (korisnik ima to globalno pravo) ili N (korisnik nema to glo-
balno pravo). Ovoj grupi pripadaju kolone:
Select_priv
Insert _pri v
Update_priv
Delete _pri v
Index _pri v
Alter _pri v
Create_priv
Drop _pr iv
Grant _pri v
References _pri v
Reload_priv
Shutdown_priv
Process_priv
File _pri v
' i'
'shOW'_ db _pri v
Super _pr iv
Create_tmp_table_priv
Lock_tables_priv
Execute _pr iv
Repl_slave_priv
Repl_client_priv
Kolone za uspostavljanje veze Odgovaraju podacima koji se zadaju
u odredbi REQUIRE komande GRANT. Ovoj grupi pripadaju kolone:
ssl_type
ssl_cypher
x509_issuer
x509_subject
Kolone za upotrebe resursa Sadre podatke o eventualnim
njima upotrebe resursa koje zadajete na kraju komande GRANT. Ovoj
grupi pripadaju kolone:
max_ questions
max_updates
max_ connections
Tabela db
U ovoj tabeli se podaci o pravima korisnika za pojedine baze podataka. Tabela
se sastoji od kolona:
Kolone za opseg vidlj'ivosti Na osnovu njihovog sadraja, MySQL koji
red treba Ako imate pravila za ostavite polje
host prazno, a u tabeli host dodajte grupu redova da biste obezbe-
dili detaljnije podatke. Ovoj grupi pripadaju kolone:
Host
Db
User
Kolone za prava Njihov sadraj koja sve prava ima kombinacija Host,
Db i User. Ove kolone mogu sadrati samo vrednosti Y ili N. Kolone za
prava su
Select_priv
Insert _pr iv
Update_priv
Delete _pri v
Index _pri v
Alter _pri v
Tabela host
Create _pri v
Drop _pri v
Grant_priv
Create_tmp_table_priv
Lock_tables_priv
MySQL pretrauje tabelu host kad god na prazno polje u tabeli db. Takvo
ponaanje ne moete zadati komandom GRANT, ali moete ga podesiti. Tabela
ima kolone:
Kolone za opseg vidljivosti Na osnovu njihovog sadraja, MySQL koji
red treba u Svaki red u ovoj tabeli sadri podatke o jednoj bazi podataka
kojoj se pristupa s jednog Ovoj grupi pripadaju kolone:
Host
Db
Kolone za prava Njihov sadraj koja sve prava ima kombinacija Host i
Db. Ove kolone mogu sadrati samo vrednosti Y ili N. Kolone za prava su

Select _pri v
Insert_priv
Update_priv
Delete_priv
Index _pr iv
Alter _pri v
Create _pri v
Drop _pr iv
Grant_priv
Create_tmp_table_priv
Lock_tables_priv ou-.
Tabela tables_priv
U tabeli tables_priv se podaci o pravima koje korisnici imaju za pojedine
tabele. Ova tabela ima kolone:
Kolone za opseg vidlj"ivosti Imaju istu namenu kao i u prethodne tri tabele. U
ovom imamo i kolonu Table_name, koja sadri podatke o tabeli na koju
se pravo odnosi. Kolone za opseg vidljivosti su
Host
Db
User
Table name
Kolone o dodeli podatke o tome ko je i kada dodelio pravo. Ovoj grupi
pripadaju kolone:
Gran tor
Time stamp
Kolona Table_priv podatak o pravu koje je dodeljena kombinaciji
Host/Db/User za tabelu navedenu u koloni Table_name. Kolona moe sadrati
jednu iz skupa vrednosti: Select, Insert, Update, Delete, Create,
Drop, Grant, References, Index i Al ter.
Kolona Column _pri v podatak o pravu koje korisnik ima za sve kolone
tabele. Moe sadrati jednu iz skupa vrednosti: Select, Insert, Update
i References. Ako je ova kolona prazna, MySQL potraiti u tabeli
columns_priv detaljnije podatke o tome ta jeste a ta nije dozvoljeno
u kolonama tabele.
Tabela columns_priv
U tabeli columns _pri v se podaci o pravima korisnika za pojedine kolone.
Tabela ima kolone:
Kolone za opseg vidlj"ivosti Na osnovu njihovog sadraja, MySQL koji
red treba Ovoj grupi pripadaju kolone:
Host
Db
User
Table name
Column_name
Kolona column _pri v podatak o pravu dodeljenom kombinaciji vrednosti
navedenoj u kolonama za opseg vidljivosti. Moe sadrati jednu iz skupa sle-
vrednosti: Select, Insert, Update i References.
Kolo/la Time stamp Pokazuje kad je pravo bilo dodeljena.
Sa ela
Saetak
GRANT i REVOKE
Komanda GRANT da korisniku dodelite prava pristupa ili da napravite
nov nalog. Format komande je
GRANT vrsta_prava [ (lista_kolona) J [, vrsta_prava [ (lista_kolona) J
... ]
ON {ime_tabele l * l *.* l ime_baze.*)
TO ime_korisnika [IDENTIFIED BY [PASSWORD] 'lozinka']
[, ime_korisnika [IDENTIFIED BY 'lozinka'] ... ]
[REQUIRE
NONE l
[{SSLI X509}J
[CIPHER [AND]]
[ISSUER davalac_sertifikata [AND]]
[SUBJECT subjekt]]
[WITH [GRANT OPTION l MAX_QUERIES_PER_HOUR # l
MAX_UPDATES_PER_HOUR # l
MAX_CONNECTIONS_PER_HOUR #JJ
Komanda REVOKE ukida prava dodeljena korisniku. Format komande je
REVOKE vrsta_prava [ (lista_kolona) l [, vrsta_prava [ (lista_kolona) J
... ]
ON {ime_tabele l * l *.* l ime_baze.*)
FROM ime_korisnika [, ime_korisnika ... ]
Prava
Prava se mogu dodeljivati korisnicima
Ovo su prava namenjena korisnicima:
CREATE
CREATE TEMPORARY TABLES
DELETE
EXECUTE
INDEX
INSERT
LOCK TABLES
SELECT
SHOW DATABASES
UPDATE
U SAGE
Ovo su prava administratorima:
ALL REPLICATION CLIENT
ALTER
DROP
FILE
PROCES S
RE LOAD
REPLICATION SLAVE
SHUTDOWN
SUPER
WITH GRANT OPTION
G Poglavlje 11 Upravljanje pravima korisnika
Tabele prava
Podatke o nalozima i njihovim pravima MySQL u bazi poda-
taka mysql.
Postoji pet tabela prava.
U tabeli user se imena korisnika, njihove lozinke i podaci o globalnim
pravima .
U tabeli db se podaci o pravima za pojedine baze podataka.
U tabeli host se podaci o tome kojoj se bazi podataka s kojeg
moe pristupati.
U tabeli tables _pri v se podaci o pravima za pojedine tabele.
U tabeli columns_priv se podaci o pravima za pojedine kolone
u tabelama.
Pitanja
l . Pravo GRANT OPTION korisniku da
a) podatke iz datoteke
b) drugima dodeljuje prava koja sam ima
e) se prijavljuje na server, ali nita vie
d) izdaje komandu FLUSH
2. Pravo USAGE korisniku da
a) podatke iz datoteke
b) drugima dodeljuje prava koja sam ima
e) se prijavljuje na server, ali nita vie
d) izdaje komandu FLUSH
3. Pravo RELOAD korisniku da
a) podatke iz datoteke
b) drugima dodeljuje prava koja sam ima
e) se prijavljuje na server, ali nita vie
d) izdaje komandu FLUSH
4. Pravo FILE korisniku da
a) podatke iz datoteke
b) drugima dodeljuje prava koja sam ima
e) se prijavljuje na server, ali nita vie
d) izdaje komandu FLUSH
U po!Jiavl u
5. Podatak u koloni tables_priv.table_priv
a) opisuje pravo koje korisnik ima za tu tabel u u obliku jedne iz skupa
vrednosti
Vebe
b) ima vrednost Y ili N kada je korisniku dozvolj en pristup toj bazi podataka
e) opisuje jedno od prava koje korisnik ima za tu tabel u
d) pokazuje da li za tu tabelu postoji red u tabeli columns_priv
l. Napiite komandu GRANT koja pravi nalog bill, je lozinka
secret i kome je dozvoljeno da podatke iz tabele department, aurira ih,
dodaje u tabelu i brie iz
2. Napiite komandu REVOKE koja ukida prava tog korisnika.
Odgovori
Pitanja
l. b
2. e
3. d
4. a
5. a
Vebe
l.
2.
grant select, update, insert, delete
on employee.department
to billlocalhost
identified by 'secret';
revoke select, update, insert, delete
on employee.department
from bill;
U poglavlju
U poglavlju, "Podeavanje MySQL-a", mnogobrojne opcije
za podeavanje MySQL-a.
12
Podeavanje MySOL-a
U OVOM POGLAVLJU nadovezujemo se na kratak uvod u podeavanje MySQL-a iz
poglavlja l, "Instaliranje MySQL-a". razne opcije za podeavanje
MySQL servera, s posebnim osvrtom na internacionalizovanje servera.
teme:
Podeavanje MySQL-ovih konfiguracionih opcija
Konfiguracione opcije za vie servera na istom
Internacionalizovanje
Podeavanje MySQL-ovih konfiguracionih opcija
Kao to ste iz dosadanjeg ove knjige saznali, mnogi programi za rad s MySQL-
-om imaju konfiguracione opcije. Njihove vrednosti zadajete na komandnoj liniji,
ali u mnogim moete ih zadati i u obliku datoteke opcija. U istoj datoteci
opcija moete zadati vrednosti opcija za komandne linije vie programa za rad s
MySQL-om, kao to su mysql, mysqladmin, mysqld, mysqld_safe, mysql.server,
mysqldump, mysqlimport, mysqlshow, mysqlcheck, myisamchk i myisampack.
Prednost upotrebe datoteke opcija jeste to to vam da na jednom
mestu zadate standardne vrednosti za sve opcije. Kada je instaliran na Unixu, MySQL
podrava i upotrebu zasebnih datoteka opcija koje vae za ceo server i za
korisnike.
Reenje s datotekama opcija je pogodno kada upravljate s vie servera.
Ako svi serveri imaju istu konfiguraciju, to je kada se primenjuje replika-
vanje, moete koristiti istu konfiguracionu datoteku za svaki server.
Konfiguracione opcije prvi put smo pomenuli u poglavlju l. Sada ih ponovo
razmotriti, ali opirnije. Datoteku ili datoteke opcija u direktorijumima
navedenim u nastavku teksta.
Kada je MySQL instaliran na Windowsu, datoteku opcija moete smesti ti u sistem-
ski direktoriju m Windowsa i nazvati je my. ini, a moete je smesti ti i u kore nski
din:ktorijulll diska na koji je instaliran server (na primer, C:\) i nazvati my. cnf. To
glob.dn.t .1 opcija tj. vrednosti opcija u njoj vah 1' <1 sve korisnike
170
Poglavlje 12 Podeavanje MySQL-a
Kada je MySQL instaliran na Unixu, moete imati jednu globalnu datoteku opcija,
po jednu datoteku opcija za svaki MySQL server instaliran na i po jednu
datoteku opcija za svakog korisnika. (Na jednom moe raditi
istovremeno vie MySQL servera, to je objanjeno u nastavku ovog poglavlja.)
Globalna datoteka opcija nalazi se u direktorijumu /etc/my. cnf. Datoteke opcija
za pojedine servere nalaze su direktorijumima data svakog servera, a datoteke opcija za
pojedine korisnike nalaze se u direktorijumu svakog korisnika. Imajte u
vidu da imena datoteka opcija za korisnike imaju prefiks tj. ime datoteke je
.my.cnf a ne my.cnf.
Pogledajmo ponovo datoteku opcija koju smo u poglavlju 1 naveli kao primer
sintakse za tu vrstu datoteka. Njen sadraj ponovo prikazujemo u listingu 12.1.
Listing 12.1 Primer datoteke opcija my.cnf
[mysqld]
# binarno beleenje i beleenje sporih upita
log-bin
log-slow-queries
# podeavanje za InnoDB tabele
# ovo je osnovna datoteka opcija predloena u dokumentaciji.
# Datoteke za podatke treba da
# skladitenje podataka i indeksa.
# obezbedite dovoljno slobodnog
# prostora na disku.
innodb_data_file_path = ibdatal:lOM:autoextend
# podesite rezerve za bafere na
# so-so% memorije
# na
set-variable = innodb_buffer_pool_size=70M
set-variable = innodb_additional_mem_pool_size=lOM
# podesite dnevnika na priblino
# 25% rezerve za bafere
set-variable = innodb_log_file_size=20M
set-variable = innodb_log_buffer_size=BM
# podesite .. flush_log_at_trx_commit
# na o ako moete da prihvatite gubljenje
u nekoliko poslednjih transakcija
innodb_flush_log_at_trx_commit=l
Pogledajmo format ove datoteke.
Prvi red u datoteci je
[mysqld]
To da su opcije navedene iza ovog reda namenjene programu mysqld. Ako
elite da zadate opcije za drugi program, navedite njegovo ime na grupe
opcija. Imc mora biti napisano unutar uglastih zagrada.
ruut:)iiVilllJt: IVJy.::>uL-uvul J<.uruJyurill:IUillll upnJA
Na isti kao to zadajete opcije za pojedine programe, moete zadati i grup11
opcija [client], koje vaiti za sve programe.
Redovi koji znakom # su komentari .
Postoje tri oblika sintakse za zadavanje vrednosti opcija:
Moete navesti ime opcije koju elite da na primer:
log-bin
Ovo je ekvivalentno pozivanju mysqld --log-bin s komandne linije.
Moete navesti ime opcije i vrednost koju joj dodeljujete; na primer:
innodb_flush_log_at_trx_commit=l
Moete navesti ime opcije i do deli ti joj vrednost sintakse set -vari a-
ble; na primer:
set-variable = innodb_log_buffer_size=BM
oblik sintakse smatra se zastarelim, ali smo ga naveli radi celovitosti. Poto
nailaziti na ovaj oblik sintakse u nekim datotekama primera, trebalo bi da
znate ta on Na primer, to je s primerom datoteke my. cnf, koju
smo preuzeli iz MySQL-ove dokumentacije kao jednostavnu datoteku opcija
za lnnoDB.
Neke opcije koje kako se koristiti datoteke opcija vae za sve programe:
--no-defaults da nema datoteka opcija bi sadraj trebalo
- -print-defaults prikazuje sve vrednosti opcija koje vae za program.
--defaults-file=/putanja/do/datoteke nalae programu da koristi zadatu
datoteku umesto standardnih datoteka opcija. To je korisno pri testiranju izmena
konfiguracije.
--defaults-extra-file=/putanja/do/datoteke navedenu datoteku
nakon globalne datoteke opcija, ali pre datoteka opcija za
korisnike.
Opcije za mnoge programe koje moete podesiti datoteka opcija opisane
su na drugim mestima u ovoj knjizi. Izuzetak je mysqld. U narednom odeljku razmo-
najvanije i najkorisnije opcije za komandnu liniju programa MySQL server.
Opcije za program mysqld
Naredna lista opcija nije potpuna, a svrha joj je da opcije
za mysqld. Svaka opcija se moe zadati na komandnoj liniji pri pokretanju programa
mysqld ili, kao to smo pomenuli, putem datoteke opcija.
Listu svih opcija (upozorenje: je ako na komandnoj
liniji otkucate
mysqld --help
1/2 Poglavlje 12 Podeavanj e MySQL-a
Evo nekoliko korisnih opcija:
ansi: server u reimu kompatibilnosti sa standardom ANSI. U tom slu-
MySQL prihvata samo sintaksu koja je u skladu sa standardom ANSI-99 SQL.
basedir: Zadaje kerenski direktorijum instalacije ukoliko elite da server radi
u nestandardnom direktorijumu.
datadir: Isto kao basedir, ali za direktorijum data.
log-bin: binarno beleenje u dnevnik izmena. Moete zadati ime
i direktorijum datoteke dnevnika izmena.
log-error: beleenje greaka. Moete zadati ime i direktorijum dato-
teke dnevnika greaka.
log-slow-queries: beleenje sporih upita.
port: Zadaje TCP na kojem server oslukuje. Podrazumeva se
broj 3306.
user: Zadaje ime naloga pod kojim MySQL server treba da radi.
Tokom ovog poglavlja jo nekoliko drugih opcija, a to uraditi
i u poglavlju 17, "Optimizovanje MySQL Servera".
Opcije za lnnoDB
U primeru datoteke koji smo naveli, postoji i nekoliko opcija koje se odnose na
InnoDB. Komponentu InnoDB moete koristiti i ako ne zadate vrednosti za
te opcije, ali trebalo bi da ih podesite radi boljih performansi . Ranije smo podesili sle-
opcije:
innodb_data_file_path = ibdatal : lOM:autoextend
Ova opcija opisuje MySQL-u gde da smeta podatke kojima upravlja InnoDB.
Za razliku od My ISAM tabela koje su smetene svaka u svojoj datoteci, InnoDB
tabele se u deljenom prostoru za tabele, koji se moe sastojati od jedne ili
od vie datoteka. U ovom primeru nalaemo MySQL-u da sve InnoDB podatke
smeta u istu datoteku je ime ibdatal, a 10 MB automatski
se (u koracima od po 8 MB) kada se prostor za tabele popuni.
Opti format ove opcije je
[; .. . ] [ :autoex-
tend [:max:
Opcija autoextend da se prostora za tabele prema
potrebama. Opcija max da zadate maksimalnu do koje dato-
teka moe da naraste.
innodb_buffer_pool_size=70M
Ova opcija podeava bafera koji se koristi kao ostava za (ke) pri radu
s podacima u InnoDB tabelama i indeksima. Kao i svaka druga ostava, to
to bolja- manje direktnih pristupa disku. Koliko memorije
odvojiti za rezervu bafera od toga da li na serveru ima i drugih aplikacija
i kmisnik.l, ali i ml memorijl' s kojo111 raspolaete.
innodb_additional_mem_pool_size=lOM
Ova opcija odvaja memoriju koja sluiti za MySQL-ovih internih
struktura podataka. Ako MySQL- u ponestane ove vrste memorije, da
upisuje upozorenja u dnevnik greaka .
innodb_log_file_size=20M
Ova opcija podeava datoteka dnevnika. InnoDB popunjava n
datoteka dnevnika- gde je n vrednost zada ta opcijom innodb_log_files_
in _group; podrazumevana vrednost je 2 i se.
innodb_log_buffer_size=8M
Ova opcija podeava bafera u koji sc upisuje dnevnik izmena pre nego
to se upie na disk.
innodb_flush_log_at_trx_commit=l
Ako ovoj opciji zadate vrednost 1, to da se sadraj dnevnika izmena iz
bafera upisuje na disk kad god potvrdite transakciju. To je normalno ponaanje.
Kada je ova opcija podeena na vrednost nula, dnevnik se upisuje i prenosi na
disk otprilike jedanput u sekundi. Ako je vrednost ove opcije 2, podaci se upi-
suju u dnevnik kad god potvrdite transakciju, ali se sadraj bafera prazni i upisuje
na disk jedanput svake sekunde.Vrednosti o ili 2 poboljavaju performanse, ali
verovatno ne treba da objanjavamo koliko je to
Postoje i druge konfiguracione opcije za InnoDB. Vie informacija o tome
u MySQL-ovoj dokumentaciji.
Konfiguracione opcije za vie instalacija
na istom
je korisno da vie MySQL servera radi na istom Na pri-
mer, korisnici Internet usluga mogu imate vlastite instalacije. Ovu odliku
MySQL-a koristimo kada elimo da polaznicima kursa o MySQL-u da
svako podeava svoj server.
Za svaki server koji morate zadati vrednosti opcija za
mysqld:
port: Svaki server mora oslukivati na drugom TCP
socket: Na Unixu, svaki server mora koristiti drugu datoteku Na
Windowsu, opcijom socket zadaje se ime imenovanog cevovoda koji server
koristi. U oba vrednost opcije socket mora biti za svaki server.
shared-memory-base-name (samo na Windowsu): Svaki server mora koristiti
drugi blok deljene memorije.
pi d- file (samo na Unixu): Svakom serveruje potrebna vlastita datoteka u koju
upisuje identifikator svog procesa (picl).
Opcije za beleenje podataka u dnevnike izmena: Ako zadate vrednost bilo koje
opcije koja se odnosi na datoteke dnevnika, za svaki server da
1h 111-1i direktorij um za datoteke dnevnika.
1 14 Poglavlje 12 Podeavanje MySUL-a
Jednostavan da to postignete jeste da opciji basedir dodelite vred-
nost za svaki server. Tako direktorijumi data i datoteke dnevnika automatski biti
Toplo da svaki server ima svoj direktorijum data, tako izbe-
gavate razne neprijatnosti.
Opcija --defaults-fileje veoma korisnajer da se svaki server
pokrene s skupom podrazumevanih vrednosti opcija (ili da se svaki server
instalira kao Windowsov servis s vlastitim skupom podrazumevanih vrednosti opcija).
Vano je da zapamtite kada na istom radi vie servera, klijentskim
programima i drugim programima koji uspostavljaju veze sa serverom, kao to je mys-
qladmin, morate zadati server s kojim treba da se poveu. U takvim situacijama moe
biti veoma pametno da za svakog korisnika napravite po jednu datoteku my. conf u
kojoj zadati broj TCP tako korisniku da
automatski uspostavi vezu sa svojim serverom.
lnternacionalizovanj e
Postoje dve opcije za mysqld koje da se zada podrazumevani skup zna-
kova i pravila. Skup znakova je skup simbola koji se moe koristiti na serveru.
pravila na koji se parede nizovi znakova iz tog skupa- se
i redosled sortiranja- to zavisi od govornog jezika.
Podrazumevani skup znakova moete zadati opcije --default -charac-
ter-set. Svakom skupu znakova pridruen je i podrazumevani skup pravila,
ali moete zadati i neki drugi opcije --default-collation option. Ako
kombinacija skupa znakova i skupa pravila nije ispravna, mysqld prikazati
poruku o greci.
Ako nijedna od ovih opcija nije zadata, podrazumeva se skup znakova latin l i skup
pravila latinl_swedish_ci. Taj skup znakova se kao IS0-
-8859-1 West European. pravila latinl_swedish_ci redosled sor-
tiranja teksta na vedskom i finskom jeziku koji se sastoji od znakova iz skupa latin l.
(Moda niste znali da za napisane istim slovima vae pravila sortiranja u
jezicima.) Postoje i pravila koja se mogu pridruiti skupu znakova
latinl koja opisuju kako se sortira tekst na danskom i norvekom jeziku.
Vie informacija o skupovima znakova koje MySQL podrava, ako vas
ba skup, potraite u MySQL-ovoj dokumentaciji.
Saetak
MySQL-ovi programi mysql, mysqladmin, mysqld, mysqld_safe, mysql.server,
mysqldump, mysqlimport, mysqlshow, mysqlcheck, myisamchk i myisampack
podravaju upotrebu datoteka opcija.
Opcije moete podesiti tako da vae na globalnom nivou, na nivou
nog servera i/ ili korisnika, ili na svim navedenim nivoima istovremeno.
Sintaksa datoteke imenom programa uglastih zagrada,
slede opcije koje se odnose na taj program. Komentari znakom ll. Sv.d.;,1
opcija moe se zadati u obliku opcija, opcija=vrednost, ili set-variabl
opcija=vrednost.
Listu svih opcija za program mysqld moete dobiti komande mysqlcl
--help.
Vie MySQL servera moe raditi na istoj maini u isto vreme, pod uslovom da
podesite opcije tako da serveri ne ometaju jedan drugog. Za svaki server morate
zadati brojeve TCP i datoteka dnevnika.
U datoteci opcija moete zadati podrazumevani skup znakova i pravila
koja vaiti na serveru. Skup znakova se sastoji od skupa dozvoljenih simbola.
pravila redosled sortiranja.
Pitanja
l. Opcija --no-defaults za mysqld
a) ne vae podrazumevane vrednosti, samo vrednosti zadate u datoteci
opcija
b) ne nita iz datoteka opcija
e) vrednosti samo iz globalnih datoteka opcija
d) nijedno od prethodnih
2. Opcija za Inn oD B koja podeava prostora za tabele je
a) innodb_buffer_pool_size
b) innodb_data_file_path
e) innodb_log_buffer_size
d) nijedna od prethodnih
3. Opcija za InnoDB koja podeava bafera za podatke je
a) innodb_buffer_pool_size
b) innodb_data_file_path
e) innodb_log_buffer_size
d) nijedna od prethodnih
4. Kada vie servera radi na istom nUe neophodno da elementi
budu odvojeni:
a) datoteke dnevnika
b) TCP
e)
d) klijentski programi Poglavlje 12 Podeavanje MySOL-a
S. ta je od
Vebe
a) Jedan skup pravila moe se pridruiti samo jednom skupu znakova.
b) Jedan skup pravila moe se pridruiti svakom skupu znakova.
e) Jednom skupu znakova moe se pridruiti samo jedan skup pravila.
d) Nijedno od prethodnih.
Instalirajte stariju verziju MySQL-a (na primer, 3.23) na svoj Podesite sistem
tako da imate i i stariju verziju servera koje rade na istom
Pokuajte da uspostavite vezu sa obe verzije. .
Odgovori
Pitanja
l. b
2. b
3. a
4. d
S. a
U poglavlju
U poglavlju, "Administriranje baze podataka",
t svakodnevne poslove odravanja koje treba obavljati u MySQL-ovoj bazi podataka.
1
Administriranje baze podataka
u OVOM POGLAVLJU poslove koji su neophodni za
upravljanje MySQL-ovom bazom podataka. To obuhvata aktivnosti:
Pokretanje i sputanje srevera
Prikazivanje podataka o serveru i bazama podataka na njemu
Podeavanje serverskih promenljivih
Unitavanje niti
Pranjenje ostava
Analiziranje tabela
Pregledanje datoteka dnevnika izmena
Mada prvenstveno objanjava poslove koje treba da obavlja administrator baze
podataka, ovo poglavlje opisuje i jedan vaan skript, mysqladmin, koji da
automatizujete neke od tih poslova.
Zadavanjem parametara, skript mysqladmin se moe upotrebiti za
obavljarUe velikog broja administrativnih poslova. Na kraju ovog poglavlja
njihov spisak.
U ovom poglavlju i upotrebu skriptova mysqlshow i mysqlcheck, te
SQL-ovih komandi KILL, RESET, CHECK, REPAIR i ANALYZE TABLE.
Pokretanje i sputanje MySQL servera
Kao to smo napomenuli u poglavlju l ",Instaliranje MySQL-a", svoj server naj-
verovatnije podesiti tako da se automatski zajedno sa operativnim sistemom.
postoje situacije u kojima morati da spustite, pa da ponovo pokrenete
server jer je dolo do greke.
smo objasnili kako se MySQL server. na koji to uraditi
zavisi od vaeg operativnog sistema, sadraja standardnih putanja i opcija koje ste
izabrali kada ste instalirali MySQL server. Na Linuxu, server moete pokrenuti
komande
/t Lc/lnit ,d/ mysqld start
18 Poglavlje 13 Administriranje baze podataka
ali samo ako imate kopiju izvrne datoteke mysqld u direktorijumu koji se podrazu-
meva u distribuciji Red Hat. Ako se ta datoteka nalazi na drugom mestu, da
zadate putanju. Vie informacija o tome u poglavlju l. Server moete
pokrenuti i skripta
safe_mysqld
Ovaj skript najpre pokuava da automatski odredi opcije za pokre-
tanje MySQL-a, a zatim MySQL s tim opcijama.Ako skript nije na vaoj
podrazumevanoj putanji, da zadate celu putanju na kojoj se on nalazi.
Da biste na Linuxu spustili MySQL server, imate dve Moete izdati
komandu
/etc/init.d/mysqld stop
ili
mysqladmin -u root -p shutdown
Razume se, moete koristiti i neki drugi adm.inistratorski nalog, ali nalog root je
uvek upotrebljiv. Nalozi pod kojima rade korisnici ne bi trebalo da imaju pravo
sputanja servera.
Na Windowsu, ukoliko ste mysqld instalirali kao Windowsov servis, najjednostavniji
da pokrenete bilo koji servis jeste da otvorite Control Panel i u Admini-
strative Tools, Services. Ako izaberete servis MySQL,Windows vam za njega ponuditi
opcije Stop (sputanje), Pause (zaustavljanje) ili Restart (ponovno pokretanje), kao to je
prikazano na slici 13.1. (Poto je ovo ekranska slika iz Windowsa XP Professional, sadraj
vaeg ekrana se moda malo razlikovati, to zavisi od verzije operativnog sistema.)
Server moete spustiti i skripta mysqladmin za Linux, na opisani
Prikazivanje podataka o serveru i bazama podataka
na nJemu
Skript mysqlshow i SQL-ova komanda SHOW pruaju vam, kao administratoru, puno
informacija o onome to se odvija u bazama podataka i na samom serveru.
Prikazivanje podataka o bazama podataka
Skript mysqlshow prikazuje podatke o bazama podataka. Ako ga pokrenete bez para-
metara, na
mysqlshow
se lista baza podataka u koje vam je dozvoljen pristup pod vaim
nalogom. Rezultat je isti kao kada zada te
show databases;
u programu mysql ili u nekom drugom interfejsu.
f'i'"""" ... '-""''"'..,- ... ...,,._,_.
1'1-0Yidosn.., .......
... ........
(alecb ..... ..

Cohdtpe ...
fnobiH ... 51:ted
Atltritvw:t... 51:ted ........
loadJNe. ... Stted
-
l'rl;wlcle$p. . Stted ... .-
........
.......
Crut 5tted ........
Mlnoqei: ... .......
PnNidest ...
...
ENbletrl ... Stttd .........
.........
Offeru-. ..
...
5lted .........
su..-... ..... ........
Sl4IPCIUI'i... .....
- Stt..:l
- ... .......
fNtllessu.. .
.. 5tt..:l
..... ... .-
.....
-
Slika 13.1 Prozor Services alatke Windows
Administrative Tools.


'"""""' Lout5o,ostem
NetWOik.S...
,...,"..,.

, .... "..,
Locals-,.tem
LCIUIISyod:em
"""""- Loct/Sysl:.-!1
LQ(also,stem
"""-
Net.-lo.S ...
lCIUIISerw;
, .... "._
Lou!So,lt.,..
, .... "....
Loul System
, .... "._
Loul Sylt ..
LouoiSeMc:e
, .... ,.,...
loc .. s.r.t:e
Lauls,.st ..


Kao i skriptova koji se s komandne linije, skript mysqlshow moete
pokrenuti s parametrom -u kojem sledi ime naloga, i parametrom -p,
kojim se lozinka tog naloga. Postoje i druge korisne opcije. Ako zadate
mysqlshow --help
se lista svih opcija na raspolaganju.
Jedna od njih da zadate ime baze podataka da biste prikazali podatke
samo o bazi koja vas zanima. Na primer, ako ime baze podataka zadate u
obliku, se lista tabela u toj bazi podataka:
mysqlshow -u ime_korisnika -p ime_baze
Ako na kraj ovog reda dodate i parametar --status, detaljnije podatke
o tabelama. Isprobajte to na bazi podataka employee, na
mysqlshow -u imekorisnika --status employee
Rezultati su malo tee zbog redova, ali se za svaku tabelu prika-
zuju podaci o maini za skladitenje podataka koja se koristi, podataka u tabeli,
vrednosti u koloni tipa auto-increment (ukoliko postoji takva kolona) i podaci
o skupu znakova koji vai za tabelu.
l tlU
Podatke o bazi podataka i stanju servera moete pribaviti i SQL-ove
komande SHOW koju zadate unutar MySQL-ovog klijentskog programa. Dosad bi tre-
balo da znate da izdate komande
show databases;
show tables;
da biste prikazali podatke o bazama podataka i tabelama u njima. komanda
SHOW ima veliki broj drugih opcija koje moete iskoristiti.
Na primer, zadajte
show columns from ime_tabele;
da biste dobili iste podatke kao komande DESC. tome, moete zadati
show table status
da biste dobili iste podatke kao skripta mysqlshow --status.
Prikazivanje statusa servera i vredn..asti serverskih promenljivih
Da biste dobili podatke o !l!!rveru i na koji radi, pogledajte status servera i vred-
nosti serverskih promenljivih
Da biste saznali kakav je MY_SQL-a, moete izdati komandu
SHOW STATUS
unutar MySQL-a, ili komandu
mysqladmin -u imekorisnika -p -extended-status
na komandnoj liniji.
Time dobiti podataka o tome ta se sve na
serveru od trenutka pokretanja. Moe vas zanimati da pogledate vrednosti svih pro-
menljivih ime s com_*- na primer, promenljiva com_ select pokazuje
koliko je server izvrio komandi select.
Ovo su neke od najzanimljivijih vrednosti:
threads_connected: Broj otvorenih i aktivnih veza korisnika i servera.
slow _queries: Ukupan broj upita koje je server izvrio i je izvravanje trajalo
due od vrednosti zadate u serverskoj promenljivoj long_query_time.
Ti upiti se belee u dnevnik sporih upita (Slow Query Log). Sporim upitima
se vie u poglavlju 19",0ptimizovanje upita".
uptime: Broj sekundi koji je protekao od trenutka pokretanja servera.
Da biste videli vrednosti serverskih promenljivih, moete izdati komandu
show variables;
unutar MySQL-a, ili komandu
mysqladmin -u imekorisnika -p variables
na komandnoj liniji.
l 111'-U"-IWUIIJ"'- t'"'._.._. ..... ,....,.""'-- -- ..,._"_,.._. .,,.,_. -''l "'
Vrednosti serverskih promenljivih moete zadati u konfigur a<:tonoj datoteci,
na komandnoj liniji kada server ili unutar MySQL ,t,
kon1ande SET. Podeavanje servera opisano je u poglavlju 12",Podeavanjc .t'',
a upotreba komande SET opisana je u nastavku ovog poglavlja.
Prikazivanje podataka o procesima
Koji su sve procesi aktivni na serveru moete videti ako unutar MySQL-a izdate sle-
komandu:
show processlist;
se podaci barem o upitu koji ste upravo poslali (show processlist).
Iste podatke moete dobiti i s komandne linije, ako zadate
mysqladmin -u imekorisnika -p showprocesslist
Prikazivanje podataka o dodeljenim pravima
Koja su sve prava dodeljena korisniku moete saznati
komande
show grants for
Rezultat je izraen u obliku komande GRANT koje moete zadati drugom
korisniku ista prava kao korisnik. Na primer,
mysql> show grants for root@localhost;
na mom sistemu daje rezultate:
+--------------------------------------------------------------------+
l Grants for root@localhost l
+--------------------------------------------------------------------+
l GRANT ALL PRIVILEGES ON* * TO 'root'@'localhost' WITH GRANT OPTION!
+--------------------------------------------------------------------+
l row in set (0.40 sec)
Moete se podsetiti i koja sve prava postoje ako zadate
show privileges;
Time prikazati spisak svih prava koja postoje u sistemu.
Prikazivanje sistemskih podataka o tabelama
koji se sve tipovi tabela mogu koristiti u sistemu ako zadate
show table types;
Ako vas zanima kako bi izgledala komanda create koja formira tabelu
koja postoji u sistemu, zadajte
show create table ime_tabele;
Na primer, ako u bazi podataka employee zadate
show create table department;
182
Poglavlje 13 Administriranje baze podataka
rezultat:
CREATE TABLE 'department'
'departmentiD' int(ll) NOT NULL auto_increment,
name' varchar(30) default NULL,
PRIMARY KEY ('departmentiD')
TYPE=InnoDB CHARSET=latinl
(Obratite panju na to da su, za svaki imena polu-
navodnika i naveden je podrazumevani skup znakova, koj l rusmo lZnClto zadah kada
smo napravili tabel u).
Podeavanje serverskih promenljivih .. . .
Komanda SET da zadajete vrednosti serverskih promenljlVlh - koje ste
mogli da vidite komande show variables. Sintaksa komande izgleda ovako:
set promenljiva=vrednost;
Na primer, moete zadati:
set sql_safe_updates=l;
Time se bezbedno auriranje podataka (isto se postie i ako na koman-
dnoj liniji zadate --i-am-a-dummy). v. . . .
Ovu komandu kada budemo dosh do opt1m1zovanp servera u
poglavlju 17 ",Optimizovanje MySQL Servera".
Unitavanje niti .
Komanda show processlist koju smo pomenuli u prethodnom delu ovog poglavlja
da vidite koje se sve niti izvravaju na serveru. ostalog, komanda
prikazuje i jedinstveni identifikator dodeljen svakoj niti. za da
je uzrok problema (na primer, upit koji s; izv.rava "celu vecnos: ih klljentskl pro-
gram zbog kojeg je nastao problem), mozete je prekinuti pomocu komande
kill id_procesa;
Pranjenje ostava v . . ,
MySQL koristi pri radu grupu internih ostava (keova), koje m.ozete
komandi FLUSH i RESET. Na primer, ako ste izmenili prava konsmka tako sto ste rucno
izmenili sadraj tabela prava, te izn1.ene da vae u celom sistemu tek kad izdate
komandu:
flush privileges;
Druga upotreba komande FLUSHjeste pranjenje bafera za upite:
(lush query cache;
Time defragmentirati bafer za upite, se poboljavaju performanse.
Uatoteke dnevnTk.t
Komanda RESET koristi se na isti kao komanda FLUSH. Na primer, moete
zadati
reset query cache;
Umesto da samo defragmentira ostavu za upite, ova komanda je prazni.
Listu svih promenljivih na koje deluju komande FLUSH i RESET u
MySQL-ovoj dokumentaciji.
Datoteke dnevnika
MySQL odrava vie datoteka dnevnika koje mogu biti korisne. da beleenje
u tih datoteka dnevnika nije u standardnoj konfiguraciji servera,
to morati sami da Svaki dnevnik se aktivira opcije zadate na
komandnoj liniji pri pokretanju servera ili komande set.
Moete odravati dnevnike:
Dnevnik greaka (engl. Error log): tu se belee sve greke nastale pri radu servera.
Ovaj dnevnik je standardno aktivan a njegova datoteka se nalazi u direktorijumu
data. U Linuxu, ime te datoteke je hostname. err, a u Windowsu, njeno ime je
mysql. err. Moete je smestiti i u neki drugi direktorij um, koji morate navesti u
opciji log-error=imedatoteke u konfiguracionoj datoteci my. ini ili my. cnf.
Dnevnik upita (engl. Query log): tu se belee svi upiti koji se izvravaju u sistemu.
Ovaj dnevnik moete aktivirati i zadati direktorijum za njegovu datoteku
opcije log=imedatoteke.
Dnevnik izmena (engl. Binary log): tu se belee rezultati svih upita koji menjaju
podatke. Ovaj dnevnik zamenjuje nekadanji Update log, koji ostati na raspo-
laganju i u MySQL-ovoj verziji 5.0, ali se smatra zastarelim. Ovaj dnevnik
moete aktivirati i zadati direktorijum za njegovu datoteku opcije
log-bin=imedatoteke.
Dnevnik sporih upita (engl. Slow query log): tu se belee svi upiti izvravanje
traje due od vremena zadat og u promenljivoj long_ query _t ime. Ovaj dnevnik
moete aktivirati i zadati direktorijum za njegovu datoteku opcije
log-slow-queries=imedatoteke
Svi navedeni dnevnici, osim dnevnika izmena, su tekstualne datoteke.
Sadraj dnevnika izmena moete videti komande
mysqlbinlog logfile
Upotrebu dnevnika sporih upita u poglavlju 19.
Poto datoteka dnevnika raste, trebalo bi da ih zamenjujete dru-
gim datotekama. Ako koristite Linux, uz MySQL dobijate i skript mysql-log- rota te
koji formira grupu datoteka za upotrebu.
R4 Poglavlje 13 Administriranje baze podataka
Ako koristite neki drugi operativni sistem, stare datoteke dnevnika moete
premestiti na bezbedno mesto a zatim naloiti MySQL-u da upisivanje u
novu datoteku dnevnika, komande
mysqladmin flush-logs
Opcije za skript mysqladmin
Za skript mysqladmin postoje mnogobrojne, manje ili vie korisne opcije.
Neki poslovi, kao to je pravljenje i brisanje baza podataka, mogu se obaviti
SQL-ovih komandi ili skripta mysqladmin:
mysqladmin create databasename
mysqladmin drop databasename
Skript mysqladmin se upotrebljava za prikazivanje podataka o serveru i
njegovom. stanju. Podatak moe biti bilo ta u opsegu od vrlo jednostavnog,
npr. "Da li server radi?'' (ping), do znatno detaljnijeg, kao to je lista vrednosti
serverskih promenljivih ili aktivnih procesa. U nastavku je opisana upotreba skripta
mysqladmin za mnoge takve poslove.
Da biste saznali da li server uopte radi, zadajte
mysqladmin ping
Da biste saznali koja je verzija softvera za MySQL server instalirana na
zadajte
mysqladmin version
Da biste prikazali kratak ili opis statusa servera, zadajte
mysqladmin status
mysqladmin extended-status
Da biste prikazali listu aktivnih niti na serveru, zadajte
mysqladmin processlist
Ako se prikae lista procesa (niti), neeljene niti moete unititi na
mysqladmin kill idl,id2,id3 ...
Da biste prikazali vrednosti MySQL-ovih serverskih promenljivih, zadajte
mysqladmin variables
Saetak
Server se moe pokrenuti skripta mysqladmin, pokretanjem izvrne
datoteke mysqld, ili Windowsove alatke Services manager.
Server se moe spustiti komande mysql. server stop ili
skripta mysqladmin shutdown .
Komanda mysqlshow prikazivanje podataka o bazi ili
o MySQL serveru.
Vrednosti serverskih promenljivih moete zadati konlalhh
menlj iva=vrednost;.
Listu aktivnih niti moete prikazati komande show proceoo l l t
1
1 11
moete unititi komande kill id_procesa.
Ostave se prazne komandi FLUSH i RESET.
Brzinu upita u kojima se spajaju tabele moete komandl" 111,
lyze table ime_tabele; .
MySQL belei podatke u dnevnik greaka, dnevnik upita (svi upiti), dnevnik
izmena (upiti koji menjaju podatke) i dnevnik sporih upita (upiti izvrava liJI'
traje due nego to je zadato upromenljivoj long_query_time).
Pitanja
1. Koji su od dnevnika standardno aktivni?
a) dnevnik upita
b) dnevnik sporih upita
e) dnevnik greaka
d) dnevnik izmena
e) svi prethodni
2. SQL-ova komanda SHOW moe se upotrebiti za prikazivanje
a) liste svih baza podataka na serveru
b) liste svih tabela u bazi podataka
e) liste svih kolona u tabeli
d) svega prethodnog
3. Skript mysqladmin moe se upotrebiti za
a) prava nakon izmena da bi se obezbedile da izmene da
vae
b) prikazivanje statusa servera
e) sputanje i pokretanje servera
d) zatvaranje i ponovno otvaranje datoteka dnevnika
e) sve prethodno
Vebe
Aktivirajte sva dnevnika. Poto izvrite vie upita, pregledajte sadraje dnevnika.
Ako nemate pristup bazi podataka, moda da se neto upie u
dnevnik sporih upita. Definicija "sporog" je najmanje jedna sekunda .
186 Poglavlje 13 Administriranje baze podataka
Odgovori
Pitanja
l. e
2. d
3. e
U poglavlju
U poglavlju 14, "Izrada rezervnih kopija i obnavljanje podataka", objanjavamo izradu
rezervnih kopija baza podataka i ta treba uraditi kad neto krene naopako.
Izrada rezervnih kopiJ
i obnavljanje podatak
u OVOM POGLAVLJU KAKO SE prave kopije baze podataka, bko
se one mogu preneti na drugi i kako se podaci obnavljaju kada neto krene
naopako.
teme:
Izrada rezervnih kopija baze podataka
Obnavljanje baze podataka iz rezervne kopije
Proveravanje i popravljanje tabela
Izrada rezervnih kopija baze podataka
Razume se, kao i za svaku drugu datoteku koju na nekom elektronskom ure-
morate praviti rezervne kopije datoteka baze podataka. To moete i radi
replikovanja baze podataka ili prelaska na drugi
Rezervnu kopiju MySQL-ove baze podataka moete napraviti na
skripta mysqldump napravite datoteku slike stanja (engl. dump file), tj.
datoteku koja sadri sve SQL komande koji su neophodne da biste obnovili
stanje baze podataka.
skripta mysqlhotcopy napravite datoteku s podacima. Ovaj skript
direktno kopira datoteke u kojima se nalaze podaci koji pripadaju bazi.
Sami direktno napravite kopiju datoteka s podacima. Time zapravo
radite ono to skript mysqlhotcopy radi. Ako se opredeli te za ovu
da zatvorite bazu podataka, ili da ispraznite ostave za podatke i da
tabele da biste obezbedili da podaci u njima ostanu uskla
Poto skriptovi mysqldump i mysqlhotcopy prazne ostave i u
tabele umesto vas, oni su bezbednije reenje .
Upotrebite komande BACKUP TABLE i RESTORE TABLE da biste napravili rezervne
koptjt :tadatc tabele ili grupe tabela.
188 Poglavlje 14 lzraaa rezervnih Koplja 1 oonaviJanje poaataKa
redom sve navedene
Ako je izrada rezervnih kopija od vanosti, imajte u vidu da se za vreme tog
postupka korisnicima pristup podacima. Zbog Da bi se napravila uskla-
kopija stanja baze podataka, baferi tabela moraju se isprazniti a sadraj
tabela mora ostati nepromenjen dok traje kopiranje. To se moe obezbediti
njem tabela (u ili servera iz upotrebe (to se ne prepo-
ali u oba pristup bazi podataka biti dok traje izrada kopije
podataka.
Jedno reenje problema jeste replikovanje. Jedan od zavisnih servera moete
iz upotrebe i napraviti kopiju njegovih podataka, dok za to vreme korisnici obavljaju
svoje poslove. Replikovanje razmotriti u poglavlju 16",Replikovanje
baze podataka".
Izrada rezervnih kopija i obnavljanje podataka
skripta mysqldump
izrade rezervnih kopija baze podataka jeste skripta
mysqldump koji pokrenete s komandne linije svog sistema. Ovaj skript uspostavlja vezu
s MySQL serverom i formira datoteku slike stanja, koja sadri sve SQL komande
potrebne za rekonstruisanje stanja baze podataka.
primer upotrebe ovog skripta izgledao bi ovako
mysqldump --opt -u imekorisnika -p lozinka employee > backup.sql
U ovom primeru zadali smo samo opciju--opt; ona grupie nekoliko drugih
opcija, koje su opisane u nastavku teksta. Naveli smo ime baze podataka, a rezultat
preusmeravamo u datoteku rezervne kopije koju elimo da napravimo.
Ako skript pri meni te na jednostavnu bazu podataka employee, rezultu-
datoteku sadraj biti nalik na listing 14.1.
Listing 14.1 Primer rezultata skripta mysqldump
MySQL dump 10.2
Host: localhost Database: employee
Server version 4.1.0-alpha-max-debug
Table structure for table 'assignment'
DROP TABLE IF EXISTS assignment;
CREATE TABLE assignment (
clientiD int(ll) NOT NULL default '0',
employeeiD int(ll) NOT NULL default '0',
workdate date NOT NULL default '0000-00-00',
ILiaUO 1\..L\..1 VIlli l "VtJIJU t VVIIU"IJUIIJ'- t-'vuu .. uou.o ,.....,,,,._..._ _ _.._,, ..... .,_ ,,, , -,.---..-
hours float default NULL,
PRIMARY KEY (clientiD,employeeiD,workdate)
TYPE=InnoDB CHARSET=latinl;
Dumping data for table 'assignment'
/*!40000 ALTER TABLE assignment DISABLE KEYS */;
LOCK TABLES assignment WRITE;
INSERT INTO assignment VALUES (1,7513, '0000-00-00' ,5), (1,7513, '2003-
-01-20' ,8.5);
UNLOCK TABLES;
/*!40000 ALTER TABLE assignment ENABLE KEYS */;
Table structure for table 'client'
DROP TABLE IF EXISTS client;
CREATE TABLE client (
clientiD int(ll) NOT NULL auto_increment,
name varchar(40) default NULL,
address varchar(lOO) default NULL,
contactPerson varchar(80) default NULL,
contactNumber varchar(12) default NULL,
PRIMARY KEY (clientiD)
TYPE=InnoDB CHARSET=latinl;
Dumping data for table 'client'
/*!40000 ALTER TABLE client DISABLE KEYS */;
LOCK TABLES client WRITE;
INSERT INTO client
VALUES
(1, 'Telco Inc', 'l Collins St Melbourne', 'Fred Smith', '95551234'),
(2, 'The Bank', '100 Bourke St Melbourne', 'Jan Tristan', '95559876');
UNLOCK TABLES;
/*!40000 ALTER TABLE client ENABLE KEYS */;
Table structure for table 'department'
DROP TABLE IF EXISTS department;
CREATE TABLE department (
departmentiD int(ll) NOT NULL auto_increment,
name varchar(30) default NULL,
PRIMARY KEY (departmentiD)
TYPE=InnoDB CHARSET=latinl;
l l ""t ILl dUCI ICLCIVIIIII r\Uf.IIJCI l UUildVIJdiiJC JJUUdldr\d
Dumping data for table 'department'
/*!40000 ALTER TABLE department DISABLE KEYS */;
LOCK TABLES department WRITE;
INSERT INTO department
VALUES
(42, 'Finance'),
(128, 'Research and Development'),
(129, 'Human Resources'),
(130, 'Marketing'),
(131, 'Property Services');
UNLOCK TABLES;
/*!40000 ALTER TABLE department ENABLE KEYS */;
Table structure for table 'employee'
DROP TABLE IF EXISTS employee;
CREATE TABLE employee (
employeeiD int(ll) NOT NULL auto_increment,
name varchar(80) default NULL,
job varchar(30) default NULL,
departmentiD int(ll) NOT NULL default '0',
PRIMARY KEY (employeeiD)
TYPE=InnoDB CHARSET=latinl;
Dumping data for table 'employee'
/*!40000 ALTER TABLE employee DISABLE KEYS */;
LOCK TABLES employee WRITE;
INSERT INTO employee
VALUES
(6651, 'Ajay Patel', 'Programmer',128),
(7513, 'Nora Edwards', 'Programmer',128),
(9006, 'Candy Burnett', 'Systems Administrator',128),
(9842, 'Ben Smith', 'OBA' ,42),
(9843, 'Fred Smith', 'OBA' ,131);
UNLOCK TABLES;
/140000 ALTER TABLE employee ENABLE KEYS */;
Table structure for table 'employeeSkills'
DROP TABLE IF EXISTS employeeSkills;
CHF.ATE TABLE employeeSkills (
ILl dUd ICLCI V lilJI l UUIIc:tYIJOIIJ\. tJUUQUII\CI tJUIIIU\..U .:JI" l tJ lO
employeeiD int(ll) NOT NULL default '0',
skill varchar(l5) NOT NULL default
PRIMARY KEY (employeeiD,skill)
TYPE=InnoDB CHARSET=latinl;
Dumping data for table 'employeeSkills'
/*!40000 ALTER TABLE employeeSkills DISABLE KEYS */;
LOCK TABLES employeeSkills WRITE;
INSERT INTO employeeSkills
VALUES
(6651, 'Java'),
(6651, 'VB'),
(7513, 'C'),
(7513, 'Java'),
(7513, 'Perl'),
(9006, 'Linux'),
(9006, 'NT'),
(9842, 'DB2');
UNLOCK TABLES;
/*!40000 ALTER TABLE employeeSkills ENABLE KEYS */;
Bazu podataka employee moete da rekonstruiete na drugom ako uradite

l. Napravite bazu podataka sa imenom na ciljnom
2. ovu datoteku komande
mysql -u imekorisnika -p < backup.sql
Skript mysqldump ima vie opcija koje moete upotrebiti. U ovom zadali
smo --opt, koja grupie opcije:
--quick: Nalae MySQL-u da podatke upisuje direktno u datoteku, umesto da
ih prethodno upie u memorijski bafer (to je standardni rada).Time se
postupak kopiranja ubrzava.
--add-drop-table: Nalae MySQL-u da ispred svake komande CREATE TABLE
u datoteci doda komandu DROP TABLE. (To vidite u listingu 14.1.)
--add-locks: Dodaje komande LOCK TABLES i UNLOCK TABLES koje se poja-
vljuju u datoteci.
--extended- insert: Nalae MySQL-u da koristi sintaksni oblik s vie redova da
bijednom komandom INSERT uneo vie zapisa u tabelu. Na primer, u listingu to
izgleda ovako:
INSERT INTO employeeSkills
VALUES
(6651, 'Java'),
(6651, ' VB'),
(7513,'C'),
J t'OglaVIJe '14 Izraela rezervn1n kopiJa 1 oonaviJanJe podataka
Ako vam zatreba da ove datoteke ponovo formirate bazu podataka i njen
sadraj, postupak biti bri nego kada zadate niz komandi INSERT.
--lock-tables: Nalae MySQL-u da sve tabele pre nego to
izradu datoteke slike stanja.
Imajte u vidu da opcija --opt (koja optimizovati) optimizuje vreme potrebno
za rekonstruisanje baze podataka datoteke slike, a ne vreme potrebno za izradu same
datoteke slike. Postupak izrade datoteke slike moe biti spor.
Evo jo nekoliko korisnih opcija:
--databases: da zadate vie odjedne baze podataka slike stanja
elite da napravite.
--all-databases: Nalae MySQL-u da napravi slike stanja svih baza podataka
na serveru.
--allow-keywords: Ako u tabelama imate polja sa istim imenima kao rezervi-
sane MySQL-a (ili onima koje u mogu postati rezervisane
ova opcija nalae MySQL-u da svakom imenu kolone pridrui i ime tabele kojoj
kolona pripada.
-d ili --no-data: Formira samo sliku strukture baze podataka, ali ne i njenog
sadraja. To je veoma korisno kada testirate baze podataka ili ih instalirate na
druge
Prednosti skripta mysqldump jesu u tome to se jednostavno upotrebljava i auto-
matski reava problem tabela umesto vas.
ima i nekoliko nedostataka. Prvi je to to skript tabele: kada
skript pokrenete na serveru, korisnicima pristup tokom vie sekundi ili
minuta, to zavisi od tabela. Ako planirate izradu slike stanja na serveru koji se
ne replikuje, trebalo bi da pokuate da taj postupak obavite u vreme manje
nosti sistema da ne biste previe ometali korisnike. Ako u svako doba dana imate velike
podataka i veliki broj korisnika, trebalo bi da se opredelite za drugi
izrade rezervnih kopija.
Drugi nedostatak je poto skript mysqldump za svoj rad koristi
MySQL server, postupak je sporiji nego kada koristite skript mysqlhotcopy. Skript
mysqlhotcopy ne zavisi mnogo od MySQL servera, se pri svom radu
direktno sistemu datoteka na
Izrada rezervne kopije i obnavljanje baze podataka
skripta mysqlhotcopy
Skript mysqlhotcopy razlikuje se od skripta mysqldump po tome to direktno kopira
datoteke baze podataka, umesto da podatke preko veze koju uspostavi sa serve-
rom. On se povezuje sa serverom da bi ispraznio bafere tabela i tabele, ali
da komunicira sa sistemom datoteka na i ne izvrava upite na serveru,
trebalo bi da bude neto bri od skripta mysqldump.
IL.IUUU 1'-L.'-1 or ooooo '"""I"''J..,. o."..,..,,_,.,)-'')- r---oo-- r--.----.--..... ..-----
Ovaj skript se na
mysqlhotcopy -u imekorisnika -p ime_baze ciljni_direktorijum
Skript je napisan na jeziku Perl. Ako imate Unix ili srodni operativni sistem, golovn
je sigurno da negde imate i izvrnu datoteku perl. Ukoliko imate Windows, morale
instalirati Perl da biste mogli da koristite ovaj skript. Ako ga jo nemate, moete p rl'
uzeti verziju Perla za Windows s Web lokacije kompanije ActiveState:
www.activestate.com/Products/ActivePerl
Datoteke koje pravi skript mysqlhotcopy su kopije datoteka baze poda
taka. Da biste mogli da upotrebite te kopije za restauriranje baze podataka, morate
spustiti MySQL server i zameniti tim kopijama datoteke u MySQL-ovom direkto-
rijumu data.
izrada rezervnih kopija i obnavljanje podataka
Umesto skripta mysqlhotcopy, moete i sami uraditi sve to taj skript radi. To
podrazumeva pranjenje bafera, tabela i kopiranje datoteka s podacima
u odredini direktorij um, pri tabele moraju biti
To da morate otvoriti novu sesiju na MySQL serveru. Moete najpre izdati
komandu LOCK TABLES da biste sve tabele za koje nameravate da napravite
rezervne kopije:
lock tables
employee read,
department read,
client read,
assignment read,
employeeSkills read;
Parametri komande LOCK TABLES su lista imena tabela i vrsta blokade koju posta-
vljate, READ ili WRITE. Za izradu rezervnih kopija je dovoljna blokada tipa
READ. To da druge niti (otvorene veze sa serverom) mogu neometano da
tabele ali ne mogu nita da menjaju u njima dok traje postupak kopiranja.
tabela je vano u ovakvim situacijama jer kopiranje moe da potraje
dugo. U naem primeru baze podataka employee, bilo bi veoma nezgodno da
nakon izrade rezervne kopije tabele, a pre kopiranja tabele department, neko izbrie
sve zaposlene iz neke slube, a zatim izbrie i samu slubu. Rezultat bi bio
kopija podataka u kojoj bismo imali zaposlene koji rade u slubi.
korak je izdavanje komande FLUSH TABLES:
flush tables;
Ako pravite rezervnu kopiju svih baza podataka na serveru, ovaj korak moete
kombinovati s prethodnim komande:
flush tables with read lock;
Sada moete kopiranje datoteka s podacima.Veoma je vano da vaa sesija
(u kojoj ste tabele i ispraznili njihove bafere) ostane otvorena tokom celog
I!J4 PoglavlJe 14 Izrada rezervni h kOpiJa 1 obnavlJanJe podataka
postupka jer tako blokade koje ste postavili biti odrane. Kada zatvorite tu sesiju,
tabele biti
Kada zavrite kopiranje, trebalo bi da oslobodite tabele:
unlock tables;
Opisani postupak je ono to radi skript mysqlhotcopy, a podatke moete obnoviti
iz kopija na isti kao da ste kopije napravili tog skripta.
Izrada rezervni h kopija i obnavlj anj e podataka komandi
BACKUP TABLE i RESTORE TABLE
Osim primenom postupaka koje smo opisali u prethodnim odeljcima, isti rezultat
moete i dve SQL-ove komande, BACKUP TABLE i RESTORE TABLE.
Te komande deluju samo na tabele tipa MyiSAM.
Rezervnu kopiju MyiSAM tabele moete napraviti na
backup table tl to 'putanja/do/kopije';
Ako koristite Windows, imajte u vidu da morate zadati slovnu oznaku diska kao u
primeru: '
backup table tl to 'c:/putanja/do/kopije';
Ova komanda na zadatu putanju kopira datoteku u kojoj se nalazi zadata My ISAM
tabela. Tabela se automatski tako da bude dozvoljeno samo i pravi se
njena kopija.
Moete zadati i listu imena tabela razdvojenih zarezima; u tom se
tabele i kopiraju jedna za drugom.Ako elite da podaci u svim navedenim
tabelama budu izdajte najpre komandu LOCK TABLES (pogle-
dajte prethodni odeljak, izrada rezervnih kopija i obnavljanje podataka") .
Da biste iz rezervne kopije obnovili tabelu, izdajte komandu:
restore table tl from 'c:/tmp';
Rezultat biti uspean samo ako tabele koje obnavljate ne postoje u bazi
podataka. Ako imate tabel u sa istim imenom, morate je prethodno izbrisati
komandom DROP TABLE da biste zatim mogli da upotrebite komandu RESTORE.
Komanda RESTORE deluje samo na MyiSAM tabele.
Restauriranje podataka iz dnevnika izmena
l<;1da obnavljate bazu podataka iz rezervne kopije, vrlo se deava da korisici
dodaju nove podatke i auriraju nakon izrade poslednje rezervne kopije.
U tom se stanje baze podataka moe restaurirati iz rezervnih kopija na jedan
od opisanih u prethodnim odeljcima, a zatim treba ponovo primeniti sve
i;-mene nakon izrade rezervne kopije.
Tc izmene se u dnevniku izmena (engl. binary log), to ga izuzetno
va7n im. Listu izvrenih operacija moete u iz dnevnika izme na komande
mysqlbinlog logfile > updates.sql
O O-' -- O - --.-e .... _....., ____ _
Korisno je da pregledate tu listu pre nego to ponovo izvrite upite ev1dclllll.lll
u dnevniku jer neke njima moda ele ti da izvrite. je d.1 \l
zbog loe osmiljenog upita morali da restaurirate stanje baze podataka iz reze t Vl H
kopije.
Na primer, imali smo da je program er zadao upit nalik na
update user set password='password';
Jasno je da kada obnav ljate tabelu, ne biste eleli da se ovakav upit ponovo izvri
i da lozinka svakog korisnika sistema ponovo bude password!
Testiranje rezervne kopije
Bez obzira na metod izrade rezervne kopije za koji se opredelite, veoma je vano da je
testirate ili, da ispitate njenu upotrebljivost za obnavljanje podataka.
Nisu retki administratori koji redovno prave rezervne kopije ali nikad ne proveravaju
da li bi iz tih kopija mogli da restauriraju podatke ako zatreba.
Postupak izrade rezervne kopije morate paljivo razmotriti kada analizirate rizike
i o tome ta raditi. Gde smestiti datoteke rezervnih kopija
da bi bile na drugom disku? Kako obezbediti da rezervna kopija ostane
na udaljenoj lokaciji gde je Ako donesete odluke
na osnovu ovih pitanja i da pravite rezervne kopije u redovnim vremenskim
razmacima, nema razloga da brinete da li te kopije biti upotrebljive. Ukoliko resta-
urirate bazu podataka kao vebu, moete otkriti eventualne probleme pre nego to
postanu nereivi.
Izuzetno vaan element pri instaliranju MySQL-a, kao i za postupak obnavljanja
podataka, jeste da beleenje izmena u dnevnik izmena. Taj dnevnik stan-
dardno nije aktivan, ali je neophodan za res ta urirane baze podataka u
poslednje ispravno stanje.
Proveravanje i popravljanje tabela
Proveravanje da li su tabele deo je standardnog postupka odravanja tabela
a deo je i postupka restauriranja baze nakon katastrofalne greke, na primer, u
prekida napajanja
U MySQL-u postoje tri da proverite ispravnost tabela: komande
CHECK TABLE, skripta myisamchk (ili isamchk) i skripta mysql-
check.Tabele u kojima otkrijete problem moete popraviti komande REPAIR
TABLE ili skripta myisamchk (ili isamchk) ili mysqlcheck.
Kada razmatrate koju primeniti, trebalo bi da imate u vidu
nekoliko Komande CHECK i REPAIR moete izdati iz samog MySQL-a, dok sc
druge mogu primeniti samo s komandne linije. Komande CHECK i REPAIR
deluju i na MyiSAM i na InnoDB tabele. Skript isamchk upotrebljiv je za ISAM tabele,
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
Ako se tabele upravo koriste, nemojte pokretati skript myisamchk ili isamchk.
Bolje je da spustite server pre nego to pokrenete jedan od tih skriptova, ali ako je
neophodno, moete i tabele. Ako te skriptove pokrenete za tabele s kojima
u isto vreme moda rade druge MySQL-ove niti, podaci se mogu otetiti. Komande
CHECK, REPAIR i skript mysqlcheck mogu se slobodno koristiti dok server radi i tabele
se koriste.
redom navedene alatke.
Proveravanje i popravljanje tabela komandi CHECK i REPAIR
Ispravnost tabele moete proveriti komande CHECK TABLE, kao u ovom
primeru:
check table department;
Komanda CHECK TABLE deluje i na MyiSAM i na InnoDB tabele.
Trebalo bi da dobijete rezultat nalik na (ako je sve u redu):
+---------------------+-------+----------+----------+
l Table l Op l Msg_type l Msg_text l
+---------------------+-------+----------+----------+
l employee.department l check l status l OK
+---------------------+-------+----------+----------+
l row in set (0.00 sec)
Moe se pojaviti i poruka Table is already up to date, koja da je
sve u redu.
Ako se pojavi bilo kakva poruka, to da imate problem pa pokuajte
da popravite tabel u. To moete komande REPAIR TABLE (ako je u
pitanju MyiSAM tabela) na
repair table tl;
Ako se postupak popravljanja zavri uspeno (ili ako popravljanje zapravo nije ni
bilo poptrebno), trebalo bi da dobijete rezultat nalik na
+---------+--------+----------+----------+
l Table l Op l Msg_type l Msg_text l
+- --------+--------+----------+----------+
test.tl l repair l status l OK
l -- ------+--------+----------+----------+
l row in set (0.03 sec)
Ako se pojavi poruka od OK, komanda REPAIR nije delovala i morate da
upotrebite alatku myisamchk.
Proveravanje i popravljanje tabela alatke myisamchk
U ovom poglavlju samo alatku myisamchk a alatku
isamchk. Ako jo radite sa ISAM tabelama, predlaemo da ih pretvorite u My ISAM
tabele (videti poglavlje 9",Tipovi tabela u MySQL-u").
Program myisamchk izuzetno je koristan i vas iz neprilika u koje ste
moda upali. Za program myisamchk vai da se ne sme pokrenuti dok se server
jo koristi. Bezbednije je da ga spustite.
Najjednostavniji da pokrenete myisamchkjeste da na komandnoj liniji
otkucate l
myisamchk tabela
Vrednost parametra tabela mora biti putanja do.MYI datoteke u kojoj je smetena
MyiSAM tabela.
Ovaj program prikazuje podatke o svim grekama do kojih
moe vam se da ne uspeva da rei va problem, pokuajte da ga pokrenete
sa opcijom -m. Standardno ponaanje je da progran1 ispituje da li su indeksi
kada zadate ovu opciju, ispituju se i redovi tabele.
Alatka myisamchk i ispravljanje otkrivenih greaka. Tako se moe ispra-
viti velika greaka do kojih dolazi u MyiSAM tabelama. Program myisamchk
moete pokrenuti sa opcijama -q -r za brzo popravljanje, kao u primeru:
myisamchk -q -r tabela
Ako je rezultat neuspean, napravite rezervnu kopiju datoteke s podacima a zatim
pokuajte potpuno obnavljanje tabele:
myisamchk -r tabela
Ako i to bude bezuspeno, pokuajte opciju --s af e- recover, koja ispravlja neke
greke koje opcija -r ne moe da ispravi:
myisamchk --safe-recover tabela
Program myisamchk ima veliki broj opcija, koje videti ako na
komandnoj liniji otkucate myisamchk bez parametara.
Proveravanje i popravljanje tabela alatke mysqlcheck
Program mysqlcheck moe se upotrebiti za proveravanje i popravljanje MyiSAM
i InnoDB tabela, kao i za popravljanje MyiSAM tabela dok se server koristi.
Da biste alatke mysqlcheck proverili tabele baze podataka, pokrenite je
kao u primeru:
mysqlcheck -u imekorisnika -p employee
Iza ovih parametara moete navesti imena tabela koje elite da proverite, ali ako
nita ne zada te, proverene sve tabele u bazi podataka (to je korisna odlika). Ako
se sve zavri bez greaka, trebalo bi da dobijete rezultate nalik na
employee.assignment
employee.client
employee.department
employee.employee
employee.employeeSkills
OK
OK
OK
OK
OK
8 Poglavlje 14 Izrada rezervn1n KOpija 1 flUUCILCIII.d
Opcijom --databases moete zadati listu baza podataka koje treba proveriti,
a opcija --all-databases da se proveravaju sve baze podataka na serveru.
Programu mysqlcheck moete zadati opciju -r da bi popravio sve
MyiSAM tabele na koje
Saetak
Izrada rezervnih kopija
mysqldump pravi datoteku slike stanja koja sadri SQL komande.
mysqlhotcopy kopira datoteke baze podataka u odredini direktorijum.
BACKUP TABLE kopira datoteku tabele u odredini direktorijum.
Rezervne kopije moete napraviti i tako to tabele, ispraznite
njihove bafere a zatim napravite kopije datoteka baze podataka.
Restauriranje podataka
Izvrite komande iz datoteke slike stanja napravljene skripta mysqldump.
Vratite kopije datoteka koje ste napravili skripta mysqlhotcopy ili

komande RESTORE TABLE obnovite stanje iz datoteke koju ste napravili
komandom BACKUP TABLE.
Ponovo izvrite sve operacije evidentirane u dnevniku izmena nakon izrade
poslednje rezervne kopije.
Proveravanje i popravljanje tabela
Proverite stanje tabela komandi CHECK TABLE ili skriptova myisamchk,
isamchk ili mysqlcheck.
Popravite tabele komande REPAIR TABLE ili skriptova myisamchk,
isamchk ili mysqlcheck.
Nemojte pokretati skript myisamchk dok se server koristi.
Pitanja
l. Ako elite da napravite rezervnu kopiju baze podataka, morate prethodno
a) spustiti server
b) tabele i isprazniti njihove bafere
e) i a) i b)
d) nijedno od prethodnog
U poglaVlJU l'
2. Trebalo bi da tabele pre nego to
a) izradu rezervne kopije
b) pokrenete skript mysqldump
e) pokrenete skript mysqlhotcopy t' J
d) nijedno od prethodnog
3. Koji se tipovi tabela mogu proveravati komande CHECK
a) InnoDB i MyiSAM
b) samo MyiSAM
e) MyiSAM i BDB
d) InnoDB i BDB
4. Koji se tipovi tabela mogu popravljati komande REPAIR
a) InnoDB i MyiSAM
b) samo MyiSAM
e) MyiSAM i BDB
d) InnoDB i BDB
TABLE?
TABLE?
5. Ako je rezultat komande CHECK TABLE poruka Table is already up
a) morate upotrebiti komandu REPAIR TABLE
to date
Vebe
b) komanda CHECK TABLE ne podrava mainu baze podataka
e) tabela je dobra
d) nijedno od prethodnog
Napravite rezervnu kopiju baze podataka primenom svih metoda opisanih u
ovom poglavlju. RestaunraJte bazu podataka iz svake kopije koju ste napravili.
Odgovori
Pitanja
1. b
2. a
3. a
4. b
5. e
U poglavlju
U poglavlju",Zatita MySQL servera", kako da izbegnete
bezbednosne propuste.
15
Zatita MySQL servera
U OVOM POGLAVLJU opte probleme zatite o kojima bi trebalo da
vodite kada koristite MySQL server. Iako je jedno poglavlje nedovoljno da se
objasne i najsitniji detalji, prilaemo spisak najvanijih preporuka o tome ta ne treba
raditi. teme:
Kako sistem prava korisnika deluje u praksi
Zatita naloga
Zatita instaliranih datoteka
Filtriranje podataka koje alju korisnici
Drugi saveti
Kako sistem prava korisnika deluje u praksi
U poglavlju ll",Upravljanje pravima korisnika", objasnili smo pravljenje
naloga, dodeljivanje i ukidanje prava pristupa podacima, kao i tabele prava. Ovo
poglavlje opisom na koji MySQL server primenjuje prava koja
dodelite korisnicima.
Sistem kontrola prava pristupa sastoji se od dva koraka. U prvom koraku, MySQL
da Ji je korisniku uopte dozvoljeno da uspostavlja veze sa servera m. Tome
slui tabela user u bazi podataka mysql. MySQL trai u toj tabeli red koji sadri kori-
ime i lozinku koje ste zadali te ime s kojeg pokuavate da se poveete
sa serverom. Ako ne red, vam dozvoliti da uspostavite vezu.
da kolona host tabele user prihvata i dokerske znake, kombinacija kori-
ime/ime moe se nalaziti u vie redova te tabele. MySQL
koji je red najvaniji za identiteta tako to prvo ispituje redove koji sadre
konkretna imena Na primer, ako tabela sadri red za korisnika test koji se
prijavljuje s localhost i red za korisnika test koji u koloni host sadri % (to
bilo koji MySQL uzima u obzir red koji sadri ime localhost.
202 Poglavlje 15 Zatita MySQL servera
Imajte u vidu da dva reda mogu sadrati lozinke. To moe biti uzrok velike
zabune. (Primer takve situacije u odeljku "Brisanje anonimnih naloga",
u nastavku ovog poglavlja.)
Drugi korak se odvija kada pokuate da izvrite upite ili komande. Pre
izvrenja svakog upita, MySQL proverava u tabelama prava da li je vam dozvoljeno
izvravanje upita koji ste poslali.
Ako je za upit koji pokuavate da izvrite potrebno globalno pravo - npr. kao za
komande LOAD DATA INF ILE ili SHOW PROCESSLIST - ispituje se tabela user. Pri izvr-
avanju upita u bazi podataka, najpre se ispituje tabela user. Kad korisnik
ima pravo pristupa u sve baze podataka na serveru, to pravo je dovoljno. Ako nema to
pravo, ispituju se tabele db i host. Ako korisnik nema prava ni na tom nivou, na kraju
se da li moda ima pravo pristupanja tabelama i kolonama.
Zatita naloga
Postoji nekoliko optih bezbednosnih principa koji vae i za upravljanje
nalozima na MySQL serveru. ih u narednom odeljku.
Zadavanje lozinke za nalog Root
Kada zavrite instaliranje MySQL-a, korisnik root nema lozinku. Obavezno zadajte
lozinku za tog korisnika pre nego to da koristite MySQL za bilo ta drugo
osim za eksperimentisanje. Dok ne zadate lozinku za korisnika root, svako
se moe prijaviti na va server i raditi s vaim podacima ta god pocli.To gotovo nikad
nije prihvatljiva situacija. Ako jo niste zadali lozinku, to odmah.
Brisanje anonimnih naloga
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
anonimna, odnosno predstavljaju nalog koji vam se dodeljuje kada ne zadate svoje
ime. Ime jednog naloga je localhost a drugo je % (predstavlja bilo koji
to uspostavljanje veza sa udaljenih Ti nalozi stan-
dardno nemaju lozinke.
Verovatno ste shvatili zbog ali ipak da izbriete te
naloge. To moete uraditi na
delete from user where User='';
delete from db where User='';
Nakon ovih komandi treba da izdate i komandu FLUSH PRIVILEGES da biste ispra-
znili tabele prava.
Drugi razlog za brisanje tih naloga jeste to to mogu izazvati zbrku kada regularan
korisnik pokua da uspostavi vezu sa serverom. Primera radi, recimo da ste napravili
nalog je ime laura i koji sme da se prijavljuje s bilo kojeg kada
1 ura pokua da se prijavi s localhost, MySQL server trai
Zatita instaliranih datoteka
redove u tabeli user. Tamo kombinacije laura% i (anonymous) localhost.
da MySQL daje prvenstvo redovima koji sadre konkretna imena
uzima red (anonymous) localhost. Kao to vidite, iako je laura navela svoje kori -
ime, u ovom ono ne slui Za anonimne naloge nije potrebno
zadati ime. Anonimni nalog verovatno ima lozinku od naloga
korisnika laura (anonimni nalozi standardno nemaju lozinke, tj. korisnik koji se tako
prijavljuje ne mora da zada lozinku).To da laura, kada pokua da se pod svo-
jim imenom i lozinkom prijavi s localhost, dobiti poruku
Access Denied (pristup nije dozvoljen) bez razloga.
Najbolji da izbegnete tu vrstu problema jeste da izbriete anonimne naloge
i zaboravite da oni uopte postoje.
Opasna prava
MySQL ima veoma detaljan sistem prava korisnika, to je opisano u poglavlju ll.
Morate vrlo paljivo razmotriti kome dodeliti neka od tih prava. Budite veoma
oprezni s pravima FILE, PROCESS i WITH GRANT OPTION.
Pravo FILE korisnicima da izdaju komandu LOAD DATA INF ILE. Ta
komanda moe se zloupotrebi ti za menjanje sadraja datoteka na serveru (kao to je
datoteka za lozinke, /etc/passwd) ili za menjanje datoteka baza podataka, se
zaobilazi sistem prava pristupa.
Pravo PROCESS korisnicima da izdaju komandu SHOW PROCESSLIST.
Tako u svakom trenutku mogu videti koji se sve upiti izvravaju, to im da
do poverljivih podataka o drugim korisnicima.
Pravo WITH GRANT OPTION korisnicima da svoja prava dodeljuju dru-
gim korisnicima. Ako znate kakve mogu biti posledice tog prava, moete ga oprezno
dodeljivati drugima.
ifrovanje lozinki
MySQL lozinke korisnika u ifrovano m obliku. Pre verzije 4.1, mogli ste pri pri-
javljivanju na server da zadate i ifrovani oblik lozinke.To je sada ispravljeno i
je zatita lozinki i mehanizma prijavljivanja.
Ako piete aplikaciju koja skladiti imena i lozinke svojih korisnika (ne korisnika
MySQL-a), nemojte ih ifrovati funkcije PASSWORD ().Umesto nje, prepo-
funkciju MDS () ili ENCRYPT ().Te funkcije su detaljnije objanjene u pogla-
vlju 8",Upotreba MySQL-ovih funkcija u komandi SELECT".
Zatita instaliranih datoteka
Osim zatite MySQL-ovih naloga, morate kontrolisati i pristup MySQL-
-ovim binarnim datotekama, skriptovima i datotekama s podacima. neko
liko preporuka koje moete primeniti na svoj sistem.
Poglavlje 15 Zatita MySQL servera
Nemojte pokretati mysqld pod nalogom Root . .
Ovo se na Linuxu i drugim operativnim sistemima srodrum sa
Nemojte pasti u iskuenje da pokrenete MySQL server (program mysqld) pod .kon_-
nalogom root. Isto kao za Web server, napravite poseban nalog pod kojlm ce
raditi samo MySQL server. Tako prava pristupa koja MySQL server
imati u sistemu datoteka.
Pristup datotekama i prava upotrebe u operativnom sistemu
Nema svrhe da troite vreme na pravilno podeavanje prava naloga za pristup
MySQL-u ukoliko nemate kontrolu nad pristupom operativnom sistemu.
je da korisnicima p_ristup MySQL-ovim binarnim datotekama, skr.1ptov1ma, a
direktorij umu data. Cest bezbednosni propust je da se nekom konsruku dozvoh
pristup na kojem radi MySQL server, ali ne i, na primer, bazama dr.u-
gih korisnika. Ako taj korisnik ima pristup u direktorijum data, moe da naprav1 koplje
datoteka s podacima i da ih otvori na nekom drugom MySQL serveru.
Trebalo bi da uvek preduzimate opte bezbednosne mere:
Samo i pouzdani korisnici treba da imaju pravo da mysqld. To
pravo moete dodeliti jedino nalogu koji ste napravili za
mysqld .
Samo i pouzdani korisnici treba da imaju pristup MySQL-ovim pridru-
enim programima i skriptovima, kao to su, na primer, mysqladmin, mysqldump
i mysqlhotcopy. Najbolje je da o tome od programa do programa.
Samo i pouzdani korisnici treba da imaju pristup u MySQL-ov direk-
torijum data. Ako server radi pod nalogom mysql, tom nalogu je
neophodan pristup u direktorijum data. Poto nijednom drugom konsmku to
nije neophodno, najbolje da im zabranite pristup tamo.
Filtriranje podataka koje korisnici alju .
Pre nego to MySQL-u prosledite bilo koji podatak k? ji je une.o: treb.al.o b1
dn klijentska aplikacija izvri provere. Kako cete to tacno obav1t1, zav1s1 od .
razvojne platforme s kojom radite, ali pogledajmo primer koji objanjava zbog b1
ttd)nlo da proveravate ulazne podatke. v . v .
Problem se moe pojaviti i pri tako jednostavnom kao sto je unosenje
1
w(Ijcg imena i prezimena- npr. Patrick O'Leary- u vau aplikaciju. te po?atke
pmslcdite direktno MySQL-u, problem nastati zbog apostrofa u prez1menu O Leary.
u zlonamernijem kontekstu, mogu se pojaviti korisnici koji pokuavaju da unesu
MySQL-ove komande putem interfejsa vae aplikacije ili Web obrazaca.
Postupak kojim proveriti prihvatljivost ulaznih podataka zavisi od programskog
.JL':nb na kojem radite, a u MySQL-ovoj dokumentaciji nekoliko optih
pn:poruka za veliki broj programskih jezika.
Drugi savet l
Drugi saveti
Razmotrili smo sistem prava pristupa, obradili naloge, opisali datoteke u
sistemu datoteka i ukratko pomenuli filtriranje ulaznih podataka. Ako vas brine zatita
vae mree (to bi verovatno trebalo da vas brine imate bilo kakvu vezu sa spolj-
nim svetom), MySQL da se prenoenje podataka zatiti protokola
S SL. Trebalo bi da razmotrite i zatitu
Upotreba SSL veza
Ako elite da da neko zlonameran "njuka" pakete podataka koje razmenjuju
MySQL server i klijenti, podesite MySQL za uspostavljanje veza
protokola SSL (Secure Sockets Layer).
Da biste mogli da koristite SSL, treba da instalirate biblioteku OpenSSL (na raspo-
laganju je na www. openssl. org), pokrenete server sa opcijama --with-vio i --with-
ssl i obavite podeavanja na komandnoj liniji. Dobar primer skripta koji
obavlja potrebne operacije nalazi se u MySQL-ovoj dokumentaciji; ovde ga nismo
reprodukovali.
Poto obavite neophodna podeavanja, komande GRANT zahtevajte da se
korisnici prijavljuju putem SSL veza ili da imaju sertifikate. Evo jedno-
stavnog primera upotrebe komande GRANT:
grant all on employee.*
to testuser identified by 'password'
require ssl;
Ova komanda pravi (ili menja) nalog testuser, je lozinka pass-
word. Taj korisnik moe da se prijavljuje na server samo putem SSL veza. Moete
zahtevati da se na taj prijavljuju svi korisnici servera ili moda samo korisnici
koji se prijavljuju sa udaljenih
zatita instalacije
Opta preporuka glasi: ako ste se potrudili da paljivo podesite naloge u
MySQL-u i u operativnom sistemu, pa i zahtevate da se korisnici prijavljuju
putem SSL veza, najbolje je i da zatitite instalaciju. Ako postoji da
neko obori server zato to se sapleo o njegov kabi za napajanje, ili ako neko moe da
ukrade podatke tako to odnese ceo imate ozbiljan problem. zatita se
zaboravlja, u malim i srednjim kompanijama.
Moda manje kada je u pitanju Windows, ali i bezbedni Unix/
Linux sistemi postaju ranjivi kada se zanemari zatita. Na primer, na Linuxu je
postupak izmene lozinke naloga root trivijalno jednostavan kada imate
pristup Naravno, kada neko podacima moe da pristupa kao korisnik
root, moe da menja koje god podatke u MySQL-ovim bazama podataka .
:ICI
Poglavlje 15 Zatita MySQL servera
Saetak
Sistem prava pristupa
Korak 1: Provera da li ima pravo pristupa s lozinkom koju je
zadao.
Korak 2: Provera svakog upita da bi se utvrdilo da li ima
pravo. Najpre se pretrauju tabele user i host, zatim db, a onda
tables_priv i columns _pri v.
MySQL daje prednost redovima u tabeli User koji sadre konkretna imena

Bezbednosne preporuke
Obavezno zadajte lozinku za MySQL-ov nalog root.
Izbriite anonimne naloge; oni pristup korisnicima
i mogu da pristup regularnim korisnicima.
Veoma paljivo razmotrite kome dodeliti prava FILE, PROCESS i WITH
GRANT OPTION.
Lozinke koje se koriste samo za pristup aplikacijama ifrujte funkcija
MOS () ili CRYPT () a ne funkcije PASSWORD () .
Nemojte pokretati mysqld pod Unixovim nalogom root. Napravite poseban
nalog s vrlo pravima koji upotrebljavati samo za
mysqld.
Pristup programu mysqld dozvolite samo MySQL-ovom korisniku s
nim pravima.
Korisnicima pristup programima i skriptovima prema potrebama.
Drite se principa najmanjeg prava: dozvolite korisnicima pristup samo onome
to im zaista treba!
Dozvolite pristup direktorijumu data samo MySQL-ovom korisniku .
Nikad ne prihvatajte podatke direktno od korisnika. Uvek ih prethodno filtri-
rajte u aplikaciji u kojoj se unose .
upotrebu SSL veza ako su potrebne ifrovane veze.
Ne zanemarujte zatitu MySQL servera!
Pitanja
l . Koj a se tabela u bazi podataka mysql pretrauje kada se da lije korisniku
dozvoljeno da uspostavi vezu sa serverom?
a) tables_priv
b) db
e) columns_priv
d) li Sl' r
2. Koja se tabela prva pretrauje kada se da li je korisniku dozvoljeno d,1
izvri upit?
a) user
b) host
e) db
d) tables_priv
3. Ako MySQL u tabeli user vie redova koji sadre isto ime korisnika,
koji red uzima za proveru identiteta korisnika?
a) Red koji sadri ime
b) Red koji sadri ime
e) Svaki red koji sadri lozinku.
d) Nijedno od prethodnog.
4. Koja od prava verovatno ne bi trebalo da dodeljujete korisnicima?
a) FILE
b) PROCESS
e) WITH GRANT OPTION
d) Sva prethodna
S. Koji je nalog pogodan za mysqld?
a) Nalog s vrlo pravima
b) Root
e) a) ili b)
d) Ni a) ni b)
Vebe
primera podeavanja opisanog u MySQL-ovoj dokumentaciji, instalirajte
OpenSSL za upotrebu na svom MySQL serveru.
Odgovori
Pitanja
l. d
2. a
3. a
4. d
S. a
Poglavlje 15 Zati ta MySQL servera
U poglavlj u
U poglavlju16",Replikovanje baze podataka", kako se dva servera .
podataka mogu podesiti da rade sa istim podacima. Time se opterecenJe,
robusnost sistema i olakava izrada rezervnih kopija podataka.


16
Replikovanj e baze podataka
J EDNA OD VEOMA KORISNIH KOJE PRUA MYSQL jeste replika-
vanje. ostalog, replikovanje da iste podatke na vie servera .
To moete raditi iz vie razloga,_npr. da biste postigli bolje performanse,
pouzdanost sistema ili da biste lake pravili rezervne kopije baze podataka. Osim toga,
moete se opredeliti za replikovanje kao reenje kada elite da raspodelite
baze podataka na vie servera koje imate, umesto da nabavite jedan (nov) server.
Replikovanje baze podataka moe obezbediti otpornost sistema na greke (engl.
tolerance). Ako se glavni server pokvari,jedan od zavisnih servera moete tretirati
kao njegovu kopiju i odmah ga proglasiti za glavni server.
U sistemima gde se operacija svodi na podataka, a ne na pisanje, tepli-
kovanje moe da pobolja performanse jer se izvravanje upita raspodeljuje na vie
nara. Ukupno sistema moete pokuati da smanjite tako to izvravanje
upita rasporedi te na broj manje optere a druga je da
pokuate da smanjite u mrei tako to svaki upit usmerite na geografSki naj-
blii server. Ako su upiti koji se izvravaju u vaoj bazi podataka uglavnom jed-
nostavni, i jednostavan algoritam koji moe biti
efikasno reenje. Ako neki upiti zahtevaju sloenu obradu, verovatno morati da
osmislite sloenije algoritme koji na nivou aplikacije.
Druga primena replikovanja jeste izrada rezervnih kopija baze podataka. Kao to
smo napomenuli u poglavlju 14",Izrada rezervnih kopija i obnavljanje podataka",
izrada rezervne kopije obimne baze podataka moe da potraje dugo. Kada
koristite replikovanje, moete spustiti zavisni server i napraviti kopiju njegovih poda-
taka bez ometanja korisnika glavnog servera.
Principi replikovanja
Replikovanje se moe odvijati u vie oblika. U MySQL se koristi usmerena veza glavni-
-zavisni server.Jedan od servera je glavni (engl. master).Jedan ili vie servera tretiraju sc
kao zavisni (engl. slaves) od glavnog servera. Glavni server koji sc
podaci u sistemu, dok zavisni serveri pokuavaju da preslikaju njegov sadr,j.
IV
Postupak replikovanja oslanja se na sadraj dnevnika izmena na glavnom serveru.
U tom dnevniku se podaci o svakom upitu koji je bio izvren na serveru od
beleenja u dnevnik. Zavisnim serverima se alju upiti iz dnevnika izmena
glavnog servera a oni ih primenjuju na svoje podatke.
Sve operacije upisivanja podataka uglavnom se odvijaju direktno na glavnom serveru,
dok se operacije raspodeljuju zavisnih servera, ili glavnog
i zavisnih servera. To se postie ugradnjom logike u aplikacije.
Vano je imati u vidu da kada da repliku jete bazu podataka koja sadri
podatke, dnevnik izmena moda biti potpun. da beleenje izmena u dnev-
nik standardno nije podaci koje ste uneli u sistem moda nisu zabeleeni u
dnevniku izmena. Kada replikovanje, svi zavisni serveri moraju sadrati pot-
puno iste podatke kao glavni server na beleenja u dnevnik izmena.Ovu temu
detaljnije u nastavku poglavlja.
Poto zavisne servere napunite podacima i pokrenete ih, oni usposta-
vljaju veze s glavnim serverom i na svoje podatke primenjuju izmene zabeleene u
dnevniku izmena glavnog servera. Jedna nit izvrenja na zavisnom serveru uspostavlja
vezu s glavnim serverom i ispituje da li ima novih izmena. Te izmene se smetaju u
prenosni dnevnik (engl. relay log) na zavisnom serveru. Druga nit izvrenja na zavisnom
serveru izmene iz prenosnog dnevnika i primenjuje ih na lokalnu kopiju podataka.
da glavni i zavisni serveri mogu biti dostupni u vremena (npr. zato
to se u sistem mogu dodati novi serveri ba u trenutku izvravanja upita, ili zato to je
mrea postala zaguena, ili je prestala da radi), neophodno je da zavisni serveri belee
dokle su stigli sa unoenjem izmena.Vano je da se sve transakcije 'izvre u celini i da se
izmene primenjuju pravilnim redosledom. U aplikacija, ako se garantuje da baza
podataka uvek prelazi iz jednog stanja u drugo, manje je vana da
se ponekad podaci zastareli nekoliko sekundi ili minuta.
Ako razmatrate primenu replikovanja, morate shvatiti ta se Auriranje
podataka odvija se asinhrono, a ne u realnom vremenu. Poto aurirate podatke u bazi
na glavnom serveru, upiti poslati zavisnim serverima nakon toga mogu izvesno
vreme davati rezultate. To se moe smatrati nedostatkom, ali prednost je u tome
to zavisni server koji radi na prenosivom ili u nepouzdanoj mrei, sasvim
lepo raditi u intervalu dva auriranja s glavnog servera.
Napomena o verzijama MySOL-a
je prvi put u jednu od novijih verzija MySQL-a (3 .23 .15), to
da se ta jo uvek razvija gotovo sa svakom novom izdatom verzijom.
Ako nameravate da koristite replikovanje, dobro je da na svim koji u tome
instalirate aurnu i istu verziju MySQL-a.
su kombinacije verzija MySQL-a glavnog i zavisnih
servera, ali poto time samo uvodite stepen nepouzdanosti, najbolje je da to
izbe gava te ako je ikako Primera radi, moete na problem da se funkcij e,
kao to j e PASSWORD (),razlikuju dve verzije MySQL- a s kojima pokuavate da
radit e.

Ako su vam zaista neophodne dve verzije MySQL-a u istom sistemu, na
adresi dokumentaciju s matricom verzija glavnih i zavisnih servera koje
mogu raditi zajedno:
www.mysql.com/doc/en/Replication_Implementation.html
Podeavanje sistema za replikovanje
U sistema u kojima se primenjuje replikovanje koristi se vie pove-
zanih u jednu internu mreu. Ako imate are povezane putem javnog Interneta,
paljivo razmotrite bezbednosne mere. Za obavezno proverite da li je TCP
koji ste odredili za MySQL dostupan kroz zatitni zid svim koji
treba da komuniciraju sa serverom (podrazumevani broj TCP za MySQL
server je 3306) .
Pod pretpostavkom da na svojim imate noviju verziju MySQL-a i
jednu ili vie baza podataka koje elite da replikujete, naredni koraci su obavezni da
biste napravili sistem s jednim glavnim serverom i jednim ili vie zavisnih servera.
Napravite nalog koji upotrebljavati samo pri replikovanju
Umesto da za sve to radite koristite nalog root, da za poslove repE-
kovanja napravite naloge koji imati samo prava neophodna za te poslove,
to smo napomenuli u poglavlju 1, "Instaliranje MySQL-a" . Dakle, potreban vam
je poseban nalog na glavnom serveru, namenjen poslovima replikovanja.
Ako nameravate da stanje zavisnih servera generiete komandi
LOAD TABLE FROM MASTER ili LOAD DATA FROM MASTER, nalogu za
replikovanje potrebna su specijalna prava. Naredna komanda GRANT (koju izdate na
glavnom serveru) pravi nalog s pravima koja su potrebna alatkama za
uspostavljanje veza servera:
grant replication slave, reload, super, select
on logs.*
to replication"%" identified by 'password';
(U ovom primeru koristi se baza podataka logs. Izmenite komandu tako da odgo-
vara imenu vae baze podataka i, razume se, obavezno odaberite bezbedniju lozinku.)
Poto zavrite kopiranje podataka s glavnog servera na zavisni server,
nalogu za replikovanje vie biti potrebna tako velika Ako
zavisne servere punite iz rezervne kopije ili nameravate da smanjite kori-
naloga za replikovanje nakon zavretka kopiranja, tom nalogu je
dovoljno samo pravo replikovanja. Naredni upit pravi nalog je ime
replication i koji ima pravo da uspostavlja vezu s glavnim serverom sa svakog zavisnog
servera (kao i sa svakog drugog
grant replication slave on logs.* to replication"%" identifi e d by
'password' ;
' l .it
rUyli:tVIJC l 0 UdLC
Sintaksa komande GRANT opisana je u poglavlju 11 ",Upravljanje pravima korisnika".
Pravo replication slave (zavisni server pri replikovanju) uvedeno je u MySQL 4.0.2
upravo za tu namenu. U starijim verzijama MySQL-a koristite pravo file.
Navedena komanda samo pristup bazi podataka logs. Ako elite da doz-
volite replikovanje svih baza podataka na serveru, u komandi zamenite logs. * sa * . *.
Proverite da li je glavni server podeen za replikovanje
Na glavnom serveru mora biti beleenje izmena u dnevnik. Ako ste
uputstva za instaliranje MySQL-a iz ove knjige, verovatno st.e dnevnik .
izmena jer on slui i za druge svrhe osim replikovanja. Da b1ste provenli da li Je uklju-
beleenje izmena u dnevnik, moete izdati komandu SHOW VARIABLES. Dovoljno
je da zadate
show variables;
da biste prikazali vrednosti svih serverskih promenljivih, ali za rezultat zadajte

show variables like "log_bin";
Ako je beleenje izmena u dnevnik dodajte opciju log-bin u datoteku
opcija, kako je prikazano u listingu 1.1. Ime datoteke opcija my. ini ili my. cnf,
u zavisnosti od konvencije operativnog sistema koju ste primenili.
U datoteci my . ini/my. cnf zadajte glavnom serverujedinstven identifikator. Trebalo
bi da vaa datoteka opcija sadri barem redove:
[mysqld]
log-bin
server-id=1
Opcija server- id je jedinstven identifikator koji treba da svakom MySQL
serveru. To mora biti pozitivna celo brojna vrednost, a u ovom pnmeru sasv1m pro-
izvoljno zadali smo 1. . .
Ako izmenite sadraj datoteke opcija, morate ponovo pokrenut1 server da bl
izmene da vae.
Napravite kopiju stanja glavnog servera
Da biste replikovanje, obezbedite
potpunu i kopiju stanja baze podataka na glavnom serveru
ime datoteke dnevnika izmena na glavnom serveru
pomak od dnevnika koji odgovara stanju servera.
postupak kojim obaviti navedene poslove moe s.e malo
u zavisnosti od toga da li koristite MyiSAM ili InnoDB tabele 1 od toga kohko vam
.Jl! neprijatna pomisao da za vreme morati da zabranite pristup bazi
podataka.

Podeavanje sistema za replikovanjr
Za My ISAM tabele, kopiju stanja svakog zavisnog servera moete napraviti
nakon njegovog pokretanja. Pogledajte odeljak "Pokretanje zavisnih servera", u
nastavku ovog poglavlja. ova metoda nije posebno efikasna, kad
imate veliku podataka i veliki broj zavisnih servera. Komanda LOAD DATA FROM
MASTER izdata sa svakog zavisnog servera podatke na glavnom serveru do
zavretka kopiranja. Baze podataka biti znatno vreme ako kopiju
stanja napravite komandi operativnog sistema. To vam
da istom kopijom stanja glavnog servera inicijalizujete koliko god
vam zavisnih servera treba, ete interval u kojem je server
Za InnoDB tabele ne moete izdati komandu LOAD DATA FROM MASTER. Kopiju
stanja morate napraviti komandi operativnog sistema ili nabavite
softver i opremu koji izradu kopije podataka dok se server koristi .
Ako kopiju stanja servera pravite komandi operativnog
sistema, morate se uveriti da su podaci i aurni, tako to
izdati komandu:
flush tables with read lock;
Time tabel u i upisivanje izme na dok je ne oslobodite.
Ime datoteke dnevnika i pomak od njenog moete dobiti
komande:
show master status;
Trebalo bi da dobijete rezultate nalik na
+-------------------+----------+---- - ---------+------------------+
l File l Position l Binlog_do_db l Binlog_ignore_db l
+-------------------+----------+--------------+------------------+
l server-bin.000007 l 211 l
+-------------------+----------+--------------+------------------+
Zapiite podatke iz prve kolone (ime datoteke dnevnika izmena) i iz druge kolone
(pomak od te datoteke). Ako nema podataka, umesto imena datoteke zadajte
prazan znakovni niz, a vrednost pomaka treba da bude 4.
Da biste napravili kopiju stanja My ISAM tabela, neke alatke za
arhiviranje datoteka kopirajte sadraj direktorijuma u kojem se nalaze datoteke tabela.
Na Unixu, zadajte neto nalik na da biste napravili kopiju stanja baze
podataka logs:
tar -cvf /tmp/snapshot.tar /path/mysql/data/logs
Na Windowsu, upotrebite WinZip ili neku alatku da biste napravili kopiju
sadraja direktorij uma C: \mysql\data \lo gs.
Kada zavrite kopiranje, moete ponovo dozvoliti upisivanje u bazu podataka ako
izdate komandu:
unlock tables;
214
Poglavlje 16 Replikovanje baze podataka
Tabela employee koju koristimo u celoj knjizi (kao i tabela koje autori kori-
ste u svojim projektima) tipa je InnoDB.Ako imate (komercijalni) softver za kopiranje
InnoDB tabela dok se koriste, onje savren za ovu namenu. Moe se nabaviti od firme
Innobase Oy na adresi
www.innodb.com/hotbackup.html
Ako nemate takvu alatku, najbolje reenje je da ispraznite bafere baze podataka i da
ispraznite njene tabele narednih komandi. Prvo zadajte komandu
flush tables with read lock;
a zatim prikaite i zapiite podatke o datoteci dnevnika izmena i pomaku u njoj (na isti
kao za MyiSAM tabele):
show master status;
Bazu podataka iz upotrebe a da je ne oslobodite, a sadraj direktorij uma
u kojem se nalaze tabele te podataka kopirajte u MySQL-ov direktorijum data.
Ako imate InnoDB tabele, morate kopirati datoteke s podacima i datoteke dnevnika.
Kada zavrite kopiranje, moete ponovo pokrenuti bazu podataka i osloboditi njene
tabele.
Podesite zavisne servere
Svakom serveru treba jedinstven identifikator. U datoteci opcija (my . cnf/my. ini)
dodajte red nalik na
server-id=2
Identifikator mora biti celobrojna pozitivna vrednost, ali dok ne zadate dva jednaka,
potpuno je nevano koje vrednosti izabrati. Ako imati broj servera, niz
vrednosti je najverovatnije najbolji da identifikatori imaju jedinstvene
vrednosti.
Ukoliko koristite kopije koje ste napravili u sistemu datoteka, morate kopi-
rati datoteke na mesta na zavisnom server u. Ako radite s vie
operativnih sistema, vodite o razlikovanju malih i velikih slova.
Nakon auriranja datoteke opcija ili kopiranja InnoDB datoteka na zavisni server,
morate ga ponovo pokrenuti.
Pokretanje zavisnih servera
Da biste pokrenuli zavisni server podeen kako je opisano u prethodnim odeljcima,
treba da izdate komande:
change master to master_host='server',
master_user='replication',
master_password='password',
master_log_file='server-bin.000007',
master_log_pos=211;
start slave;
Sloenije topologlj
U ovom primeru, server je ime na kojem radi glavni server.
replicationje ime naloga koji ste napravili za poslove replikovanja.
Umesto password upite lozinku tog naloga. Zadajte i ime datoteke dnevnika
izmena (parametar master_log_file) i pomak (parametar master_log_pos).
Komanda START SLAVE na zavisnom serveru nit koja obavlja replikovanjc,
usled zavisni server pokuava da uspostavi vezu sa glavnim serverom i preuzme
1zmene.
Ako ste napravili kopiju stanja komandi operativnog sistema, tre-
balo bi da pokrenete izvravanje upita koji ispituju razlike glavnog servera i
zavisnih servera, da biste se uverili da se replikovanje odvija kako treba. Napravite
malu izme nu na glavnom serveru, a zatim p rover i te da li je zavisni server i preuzimaju.
Ako repliku jete relativno male My ISAM tabele, moete ih napraviti i popuniti
podacima komande nalik na
load table logs.logJan2003 from master;
kada elite da kopirate samo jednu tabel u, ili
load data from master;
da biste kopirali sve tabele na zavisni server.
Kada postupak replikovanja da se normalno odvija, vie biti zgodno da
izdajete komande za podeavanje replikovanja, ako zbog toga retko ponovo
server. Iste podatke koje biste zadali tih komandi moete uneti u
datoteku opcija, uz malo sintaksu.
Datoteka my. ini ili my. cnf na zavisnom serveru moe sadrati neto nalik na
[mysqld]
server-id = 2
master-host server
master-user replication
master-password password
replicate-do-db = logs
Sloenije topologije
pr imena replikovanja jeste (engl. load balancing)
u sistemu u kojem se obavlja veliki broj operacija podataka a relativno mali broj
operacija upisivanja podataka. Mnogi sistemi s replikovanjem sastoje se od jednog
glavnog servera i manjeg broja zavisnih servera, ali postoje i u kojima je
opravdana upotreba sloenijih konfiguracija.
Ako da imati broj zavisnih servera ili su vai razmeteni
na broju geografskih lokacija, moe biti pogodno reenje u obliku
hijerarhijskog sistema u kojem jedan server igra ulogu glavnog servera za broj
zavisnih servera. Jedan ili vie tih zavisnih servera igraju ulogu glavnog servera za drugu
grupu zavisnih servera. Na slici 16.1 prikazanje jedan glavni server broj l) koji
je gl:wni ?: a od 2 do 6. Neki od tih zavisnih servera igraju ulogu glavnih
servl't .1 :t.t grupe zavisnih servera.
216 Poglavlje 16 Replikovanje baze podataka
Slika 16.1 Replikovanje s hijerarhijski organizovanim glavnim serverima.
Raspored kao na slici smanjuje glavnog servera na najviem nivou i
smanjuje obim na mrenim vezama koje vode ka tom U zavisno-
sti od odnosa broja operacija i upisivanja podataka u vaoj aplikaciji,
tako moete obezbediti dobru skalabilnost bez prevelike sloenosti sistema.
jednostavno moete formirati sistem s proizvoljnim brojem zavisnih ser-
vera i moda vie glavnih servera, pod uslovom da je svaki glavni server
u jednoj vezi i zavisni server u drugoj vezi. Ako pri projektovanju aplikacija vodite
da ponekad na serveru nedostajati najnovije izmene, ceo sistem
moete tretirati otprilike kao da je u pitanju samo jedan server baze podataka.
Stvari da se komplikuju kada imate cirkularne veze u kojima vie servera
primaju komande za auriranje podataka a izmene se u vie smerova.
Najjednostavnija cirkularna veza sastoji se od dva koji se ponaaju i kao glavni
i kao zavisni server. Svaka izme na koju na jednom se dru-
gom. Kada piete aplikacije za tu vrstu sistema, morate biti veoma oprezni.
da se izmene unose asinhrono, moe do dupliranja vrednosti u poljima
tipa auto increment ili jedinstvenih identifikatora i do podataka. U nekim
aplikacijama to moe biti prihvatljivo. Na primer, u aplikaciji koja samo evidentira
podatke i u kojoj imate manji broj jednostavnih veza tabela, a zahteva se veliki
protok podataka i raspoloivost za upotrebu, moda prihvatiti da tome rtvujete
podataka.
replikovanja
u vidu sve to je moramo napomenuti da su u pitanju relativno nove
koje nisu do kraja "izbruene". Kao to ste videli, postupak inicijalizovanja
novog zavisnog servera kopijom stanja glavnog servera nije ba Nije uskla-
ni na koji se radi s MyiSAM tabelama i InnoDB tabelama.
n:plikovanja u MySQL-u nisu ba najrobusnije. su u standardnu distribuciju
(za razliku od komercijalnih baza podataka) i redovno se upotrebljavaju u okru-
1cnjima gde sc obraduju velike podataka.Verovatno da su kori
Sllltim.l kompanije kao to su Slashdot,Yahoo! i Googlc.
Pitanja
. Uglavnom, replikovanju treba pristupiti sa izvesnom rezervom. Mehanizam radi,
1
to dob:_o,ali podeavanje moe biti zapetljane zbog razlika sistema.
da koristite najsveije verzije MySQL-a koje moete nabaviti.
Neki od tih problema reeni kada My ISAM dobije alatku za kopiranje podataka
dok .se tabele te, kao .. to postoji za InnoDB tabele. koje su
plamrane za buduce verZIJe MySQL-a nalazi se povezivanje zavisnog servera s vie
glavmh Istovremeno (engl. multimastering) radi reavanja sukoba, i
preklapanJa (engl.failover) i
Zasad se o na vruce dva servera i
morate starati sami u svojim aplikacijama, ili moete nabaviti alatku za
grupiSal1Je servera, kao to nudi kompanija Emic Application Cluster na adresi
www.emicnetworks.com.
U .datoteci opcija P?stoji nekoliko parametara koji se replikovanja ali zasad
nemaJumkakvog UtiCaJa. To su opcije za podeavanje SSL veza glavnog servera
I zav1smh Ukoliko podatke repliku jete putem javne mree, postupak tako
biti Ako vam veze, zasad je jedino reenje da nabavite
odgovaraJUCI proiZvod, kao sto je Stunnel.
Saetak
nije pogodno za. sve situacije, ali ako imate aplikaciju s
vodnosom broja operacija j upisivanja podataka, to moe
b1t1 odhcna mogucnost da obezbedite skalabilnost aplikacije.
Imajte u vidu da se izmene ne izvravaju na zavisnim serverima u isto vreme.
Svaka kopija tabele mora prelaziti iz jednog stanja u drugo, ali
vanJe podataka sa servera moe dati zastarele rezultate dok se zavisni
serveri ne auriraju.
Najkorisnije komande koje se odnose na replikovanje su START SLAVE LOAD
TABLE imetabele FROM MASTER,LOAD DATA FROM MASTER,SHOW STA-
TUS, SHOW SLAVE STATUS i SHOW SLAVE HOSTS.
Pitanja
l. Na MySQL serveru replikovanje se moe upotrebiti za
a) punjenje podacima razvojnog servera koji sluiti za bezbedno testiranje
novih programa na stvarnim podacima
b) poboljavanje performansi
e) postupak izrade rezervnih kopija podataka koji manje ometa korisnike
d) poboljavanje stepena raspoloivosti sistema
e) sve prethodno navedeno
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
3. Operacije i upisivanja podataka se odvijaju
a) na zavisnim serverima, upisivanje na zavisnim serverima
b) na zavisnim serverima, upisivanje na glavnim serverima
e) na glavnim serverima, upisivanje na zavisnim serverima
d) na glavnim serverima, upisivanje na glavnim serverima
e) nijedno od prethodnih
4. Replikovanje MySQL-ovih podataka da
a) su podaci uvek aurni
b) serveri moraju biti povezani preko pouzdane mree, a ako jedan od servera
postane nedostupan, drugi moraju da dok se on ponovo
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 se glav-
nom serveru, a zatim svim ostalim zavisnim serverima
Odgovori
Pitanja
l. e
2. b
3. b
4. e
17
18

19
VI
Optimizovanje MySQL-a
Optimizovanje MySQL servera
Optimizovanje baze podataka
Optimizovanje upita

17
Optimizovanje MySQL servera
u OVOM POGLAVLJU NEKOLIKO ubrzavanja
MySQL servera. Podeavanje servera je opsena tema i ima izvesnih sa ezote-
Naa namera je da vam u ovom poglavlju predstavim o osnove
podeavanja servera. teme:
i povezivanje koda radi brzine rada
Podeavanje parametara servera
Podeavanje drugih
Najvanije je imati u vidu da za sve izmene koje uvodite na serveru
u cilju njegovog optimizovanja morate primeniti empirijski pristup. Poku-
ajte jednu po jednu izmenu i meri te performanse pre i posle nje. Jedino tako
utvrditi da li izmena koju ste zaista poboljava performanse.
Ako elite da pri ispitivanju dobijete zaista kvalitetne rezultate, najbolje je da due
vreme U edan sat, jedan dan ili neki period) beleite upite koji se izvravaju na
serveru i da zatim te iste upite ponovo izvrite na izmenjenoj konfiguraciji servera.
i povezivanje koda radi
brzine rada
U poglavlju l, "Instaliranje MySQL-a", opisali smo instaliranje samo iz binarnih ver-
zija instalacionih datoteka alatke RPM na Unixu). Ako tek upotrebu
MySQL-a, to je svakako najjednostavniji ako nemate iskustva s pre-
softvera koji imate na svom kao to je s korisnika
Windowsa.
Performanse svog servera moete poboljati ako preuzmete izvornu verziju koda i
sami ga prevedete. Ukoliko imate s procesorom Pentium koji radi pod opera-
tivnim sistemom Linux, primetno poboljanje performansi ako izvorni
1.22 Poglavlje 17 Optimizovanje MySQL servera
kod MySQL-a prevedete prevodioca pgcc, koji optimizuje kod
samo za procesor Pentium. (Tako dobijena izvrna datoteka nije kompatibilna sa
AMD-ovim procesorima, zato je binarna verzija koju preuzimate s MySQL-ove Web
lokacije prevedena prevodioca gcc.) Autor MySQL-a, firma AB, tvrdi da ser-
ver moete ubrzati od 10% do 30% ako sami prevedete kod
prevodioca i pravilno podeenih opcija- vie informacija o tome u MySQL-
-ovoj dokumentaciji.
Drugo poboljanje u s MySQL-ovom gotovom izvrnom datotekom
jeste da prevedete MySQL s podrkom samo za skup (ili skupove) znakova koji name-
ravate da koristite. U binarne datoteke koje preuzimate s Web lokacije je
podrka za sve skupove znakova. (Vie informacija o skupovima znakova
u poglavlju 12",Podeavanje MySQL-a" .)
MySQL-ova dokumentacija sadri predloge o optimizovanju binarnih datoteka
koje korisnici sami prevode za razne operativne sisteme. Osim toga, u diskusionim
grupama na Internetu MySQL-u moete miljenja i savete u vezi
s mnogim problemima za operativne sisteme i prevodioce koda.
Arhive se nalaze na adresi
http://lists.mysql.com
Ukoliko elite da se pridruite diskusijama o prevodiocima, potraite forum na adresi
www.lukelaura.com
Podeavanje parametara servera
Da biste optimizovali svoju konfiguraciju, pokuajte da podesite parametre MySQL
servera.
radi, vrednosti parametara servera na
show variables;
Uticaj vrednosti parametara na konfiguraciju servera sle-
komande:
show status;
Druga korisna alatka koja da vidite ta se na serveru jeste Perl
skript mytop, je autor Jeremy Zawodny.
Ta alatka deluje kao ekvivalent Unixove komande top i prikazuje aktivne procese,
procesa, trajanje itd. Osim toga, ta alatka da prikaete detalje
MySQL-ovog procesa i vidite koji se upit izvrava.
Skript moete preuzeti sa adrese
http://jeremy.zawodny.com/mysql/mytop
Sve navedene alatke da evidentirate izmene koje ste uneli i
koj e one imaju na sistem.
..
t'oaesavanJe parametar. 11
Datoteka opcija my.cnf sadri toliko veliki broj opcija da se moda pitati
odakle da Uz verzija MySQL-a dobijate i prime re datoteka my. en t ,
koje se nalaze u direktorijumu support-files instalacije. U tom direktorijumu
predloga za datoteku my. cnf: my-huge. cnf, my-large. cnf,
my-medium. cnf i my- small. cnf. Izaberite jednu od njih kao datoteku op ci jn
za svoj sistem.
Najvaniji parametri koje treba da podesite jesu oni koji kako MySQL
troi memoriju. Za svaki server baza podataka vai pravilo "to vie memorije, to
bolje", ali je vano i da ta memorija bude na raspolaganju serveru baze podataka i da
se pravilno raspodeljuje njegovih procesa.
MySQL odrava grupu internih bafera i ostava. Moete podesiti memorije
koja se odvaja za tu namenu. Dva najvanija parametra koja treba da podesite su
key_buffer_size i table_cache. Poto te bafere dele sve niti koje rade na serveru,
njihovo podeavanje ima veoma veliki uticaj na performanse servera.
U baferu nazvanom bafer za (engl. key buffer) se blokovi MyiSAM
indeksa. Kada aplikacija zatrai blok iz datoteke indeksa, on se u taj
bafer. Kad god se izvrava neki upit, ako se blok indeksa nalazi u baferu,
podaci se iz njega. U suprotnom, blok indeksa mora da se iz datoteke
na disku u bafer za to je, razume se, sporije. Za bafer vai pravilo da
to je to bolje slui svojoj svrsi .
Kada razmatrate vrednost koju dodeliti parametru key_ bu ff er_ s i ze, treba da
uzmete u obzir ukupnu memorije s kojom raspolaete, da li se koristi
kao MySQL server ili slui i za druge poslove, a vana je i datoteka
indeksa (tj. ukupna .MYI datoteka).Jeremy Zawodny, poznati koji
odrava servere kompanije Yahoo!, da na koji radi kao
MySQL server,parametru key_buffer_size dodelite vrednost u opsegu 20% i
50% ukupne memorije na je u pitanju deljen jasno je da
vrednost tog parametra treba da bude manja. Ukoliko podaci vaih indeksa zauzimaju
samo 20 MB, bilo bi besmisleno da bafera za podesite na 128 MB.
Imajte u vidu i to da se bafer za koristi za MyiSAM tabele. Za
druge tipove tabela postoje drugi parametri koje treba podesiti. Nema svrhe da znatno
bafer za ako, na primer, radite sa InnoDB tabelama. U
tom vaniji je parametar innodb_buffer_pool_size. U baferima za InnoDB
se i podaci indeksa i podaci tabela. (Vie informacija o podeavanju za rad sa
InnoDB tabelama u poglavlju 12 i u MySQL-ovoj dokumentaciji.)
Drugi zaista vaan parametar je ostava za tabele (engl. table cache) kojom se upravlja
opcije table_cache.Vrednost te opcije maksimalan broj tabela koje
mogu biti otvorene u isto vreme. Kod My ISAM tabela, svaka tabela i svaki indeks su
zasebne datoteke u operativnom sistemu. da je otvaranje i zatvaranje dato tc b
spora operacija, te datoteke ostaju otvorene dok ne budu zatvorene, server spu
ten, ili dok ukupan broj otvorenih tabela ne premai vrednost parametra table_cache.
Poglavlje 17 Optimizovanje MySQL servera
vrednosti parametra table_cache korisno je kada na serveru imate veliki
broj tabela. da va operativni sistem ukupan broj otvorenih datoteka
u isto vreme, ili ukupan broj datoteka koje jedan proces ili korisnik moe drati otvo-
rene u isto vreme, utvrdite tu vrednost u svom operativnom sistemu pre nego to izme-
nite vrednost parametra table_ cache.
Osim tih globalnih memorijskih bafera, pojedinim nitima se dodeljuju
blokovi memorije- kao to su, na primer, bafer za sortiranje (engl. sort buffer)
i br.ifer za (engl. read tih b afera je jednaka za svaku nit, ali svaka nit
moe koristiti tu memorije za drugu namenu.
U bafer za se parametrom read_buffer_size, sme-
taju se podaci iz tabele kada se njen sadraj sekvencijalnim redosledom (engl. table
sca11). to se vie podataka iz tabele moe smestiti u bafer, to biti manji broj opera-
cija sa diska; ako je vrednost tog parametra previsoka, grupa bafera
za koje niti koriste moe potroiti previe memorije. Moda se da se u
ranijim verzijama ovaj parametar zvao bafer za zapise (engl. record buffer) a muje
parametar record_buffer.
Bafer za sortiranje, parametar sort_buffer, koristi se pri
izvravanju upita koji sadre odredbu ORDER BY, tj. slui za sortiranje podataka. Ako
sorti rate velike podataka, bafer za sortiranje, ali i za njega vai isto
upozorenje kao i za bafer za zapise.
Podeavanje drugih
Na kraju, jo nekoliko saveta koji vam mogu pri podeavanju konfigu-
racije sistema.
to se operativnog sistema MySQL Solaris kada elite da
maksimum od s vie procesora. Iako postoje verzije MySQL-a za razne ope-
rativne sisteme, razvoj i testiranje obavljaju se na Solarisu,
bi to po logici stvari trebalo da bude najbolje optimizovana platforma.
Ukoliko moete da nabavite vie diskova, performanse ako baze poda-
taka rasporedite na diskove. U tom moete koristiti i RAID
konfiguracije - RAID O poboljava performanse pri i pisanju, a RAID l ili 5
poboljavaju performanse pri Osim toga, SCSI diskovi bolje per-
foJillanse od IDE diskova.
Moete razmotriti i upotrebu urnalskog sistema datoteka (engl.journalingjile
1ystc'111), kao to je Reiserfs ili XFS. Tako moete jo vie poboljati performanse.
Rnume se, boljitak moe se povezivanjem klijenata i servera preko
bt7C mree, to vai i za glavne i zavisne servere u replikovanju.
Saetak
da je tema optimizovanja MySQL-a toliko opsena da zasluuje zasebnu
obavcwo nastavite s prikupljanjem informacija i istraivanjem te oblasti.
..
Performanse poboljati ako sami prevedete izvorni kod MySQI ,,
11
11
1
illi
datoteku, ako imate koji radi pod Linuxom ili ima JlllH l'''"
Pentium.
Podesite parametre servera za bolje performanse, one koje sc odnosa
na potronju memorije. Velika memorije na uvek Jt'
korisna, ali je vanije kako se ona raspodeljuje. Evo nekoliko posebno va n ih
parametara:
key _buffer_size: memorije koja biti odvojena za skladitenje
MyiSAM indeksa.
table_cache: Ukupan broj tabela koje mogu biti otvorene u isto vreme.
read_buffer_size: memorije koja se koristi pri sekvencijalnom
tabela.
sort_buffer: memorije koja se koristi za skladitenje podataka iz
tabela kada se odredbe ORDER BY zahteva sortiranje podataka.
Poboljajte hardver ugradnjom dodatne memorije, RAID grupe diskova, upo-
trebom urnalskog sistema datoteka i brze mree klijenata i servera, te
glavnih i zavisnih servera.
Pitanja
l. Parametar koji koliko memorije biti odvojeno za skladitenje
indeksa Inn oD B tabela je
a) key_buffer_size
b) innodb_buffer_pool_size
e) innodb_key_buffer_size
d) read_buffer_size
2. Parametar koji koliko memorije biti odvojeno za keiranje podataka
Inn oD B tabela je
a) key_buffer_size
b) innodb_buffer_pool_size
e) innodb_key_buffer_size
d) read buffer size
3. Parametar koji koliko memorije biti odvojeno za keiranje podataka
My ISAM tabela je
a) key_buffer_size
b) table cache
e) innodb_key_buffer_size
d) read_buffer_size
u Poglavlje 17 Optimizovanje MySOL servera
4. Parametar koji koliko memorije biti odvojeno za keiranje podataka
My ISAM indeksa je
a) key_buffer_size
b) table_cache
e) innodb_key_buffer_size
d) read_buffer_size
S. Vrednost parametra read_buffer_size ne bi trebalo da bude previsoka jer
a) ako broj niti sekvencijalno pretrauje tabele, problem
b) uvek se moe dodati nov indeks, pa zato MySQL nikad morati da
sekvencijalno pretrauje tabele
e) time se rasipa prostor na disku
d) nijedno od prethodnog
Vebe
Eksperimentiite programa za merenje performansi dok parametre navedene
u ovom poglavlju podeavate na vrednosti . Moete li optimalnu
vrednost svakog od tih parametara za svoj sistem?
Odgovori
Pitanja
l. b
2. b
3. d
4. a
S. a
U poglavlju
U sled poglavlju," Optimizovanje baze podataka", optirnizovanje
l' ll1 C baze podataka, indeksa i pojedinih tabela.
..
18
Optimizovanje baze podataka
U POGLAVLJU 17",0pimizovanje MySQL servera", opisali smo kako se server
podeava za optimalne performanse. U ovom poglavlju kako moete
optimizovati tabele baze podataka.
Standardna pravila i preporuke za strukture i normalizovanje tabela pobolj-
avaju performanse. Postoje i drugi izbori koje moete napraviti kada projektujete
bazu podataka, zbog kojih proizvod biti bri ili sporiji. U ovom poglavlju
te izbore.
teme:
ta usporava MySQL-ove baze podataka
Napravite pravilne izbore pri projektovanju
Upotreba indeksa za optimizovanje performansi tabela
Komanda OPTIMIZE TABLE
ta usporava MySQL-ove baze podataka
Poto ste prethodno poglavlje o optirnizovanju servera, moete na opti-
mizovanje baze podataka. U narednom poglavlju se optirnizovanjem upita.
Ako ste optirnizovali server (moda po cenu ugradnje dodatnog hardvera), sle-
korak je da razmotrite da li se bilo koja od navedenih odnosi i na va
Nemam dovoljno indeksa. Uzrok broj jedan loih performansi jeste upotreba tabela
kojima nije pridruen nijedan indeks ili nema indeksa za kolone koje pretrau-
jete.To ne da treba imati to broj indeksa jer preterivanje u suprotnom
smeru moe biti uzrok problema na listi.
Imam previe indeksa. Da bi se aurirao veliki broj indeksa, svaki put se u belu
upie nov red ili aurira a to potraje. Kada podatke, indeksi '> ll
veoma korisni. Kada upisujete nove redove, odnosno aurirate ili brit:lc pm111
redove, indeksi postaju problem. Kad god aurira te neki podatak, 11101 .q11
aurirati i indeksi, to produava obradu i si slCill ;l
ll
Poglavlje 1 B Optimizovanje baze podataka
Dodeljujem prava za tabele i kolone tabela. Ako prava dodeljujete pojedi-
za tabele ili kolone bilo kog resursa, kad god korisnik poalje upit na izvra-
vanje, MySQL mora da koja su sve prava za tabele i kolone tabela zadata.
Struktura baze podataka nije optimalna. Postoje da se struktura baze podataka
projektuje tako da se upiti bre izvravaju.
U naredna dva odeljka strukture baze podataka i indekse koji omo-
ubrzavanje rada s bazom podataka.
Pravilni izbori pri projektovanju baze podataka
Postoji vie pravilnih izbora koji, ako ih napravite pri projektovanju baze podataka,
doprinose poboljanju njenih performansi. To su
Uvek upotrebite najmanji tip podataka koji je dovoljan za podatke s kojima
raditi. Na primer, ako u koloni tabele samo brojeve od 1 do 10, nemojte
zadati tip INT, tip TINYINT. to su redovi i manje tabele, to se one
bre pretraivati. to su podaci manji, vie se redova moe keirati u memoriju.
Koristite zapise fiksne duine gde god je Ako su svi redovi tabele jed-
nake duine, MySQL bre pristupa redovima u sredini tabele. Da bi tabela imala
redove fiksne duine, tipovi podataka u svim kolonama moraju biti fiksne duine.
To da ne sme biti kolona tipa VARCHAR, TEXT, niti BLOB.
Ako vam je neophodan tip TEXT i BLOB, moda biste mogli da denormalizujete
emu tabele tako da polja tipa TEXT ili BLOB izdvojite u zasebnu tabelu.
Ukoliko imate kolone tipa VARCHAR, razmislite o tome da ih zamenite
kolonama tipa CHAR. To je kompromis,jer podaci tipa CHAR zauzimaju vie mesta
na disku, to je u suprotnosti s prvom preporukom na ovoj listi.
Gde god je deklariite kolone kao NOT NULL. Ako je priroda vaih
podataka takva da su vrednosti NULL sasvim i prihvatljive, slobodno ih
koristite. imajte u vidu da zbog toga gubite malo brzine i prostora,
pa zato zadajte odredbu NOT NULL gde god je
Birajte tip tabela za svaku tabel u Tabele koje ne podravaju transak-
cije (na primer, My ISAM) manje sistem i zato su bre od tabela koje
podravaju transakcije (InnoDB i BDB). MySQL podrava meanje vie tipova
tabela u istoj bazi podataka. Izaberite najbri tip koji je pogodan za
posao. (Vie informacija o pojedinim tipovima tabela u poglavlju 9,
"Tipovi tabela u MySQL-u" .)
Izaberite indekse. Ovu temu detaljno u narednom
odeljku.
U teim razmislite o denormalizovanju tabela da biste smanjili broj
spojeva koji se uspostavljaju u upitima. da zbog toga vaa
baza podataka postati mora za odravanje, to se ne
..
u cilju optimizovanja
.ste pratili gr:divo i vebe iz ove knjige, trebalo bi da imate bazu pod.lt.lka kn
1
,1
pnmarne kljuceve. To da imate barem po jedan indeks za svaku tnbdll
MySQL automatski pravi indekse za kolone koje deklariete kao PRIMARY KEY
1h UNIQUE. ,
pokuavat.e da optimizujete bazu podataka, korisno je ispitati da Ji ll'
u nJ. OJ vdefimsan bilo kakav mdeks. Izostavljanje indeksa je greka pri projekta o
vanJU. seme baze podataka. SQL-ova komanda DESCRIBE prikazuje koji sve indeksi
postoje za tabelu.
Dakle, ta je indeks i slui?
Indeks je referentnoj tabeli po tome to da se brzo odrc-
red tabel1. Ako napravite indeks za kolonu X, pronalaenje traene vrednosti u
tOj .. zna.tno je bre indeksa. Indeks pokazuje gde se u tabeli nalazi red
kOJI sadrz1 to da se direktno na taj red.
. Ako tabeh mJe pndruzen nijedan indeks, MySQL mora da pretrauje jedan po
Jedan red tabele dok ne redove koje ste zahtevali. Zamislite da morate da
u ovoj knjizi tako to od prve stranice i
svaku ree na stran1e1. tn o je bre da u indeksu knjige potraite temu koja vas
zamma 1 da zat1m direktno na stranicu koja vam treba.
U MySQL-u se po.daci indeksa u obliku b-stabala (binarna stabla); to su
strukture podataka koje se vrlo brzo pretrauju.
. mogu kolonu ili vie njih (isto kao tabela). Pri
IzvrsavanJU up1ta, b1ce upotrebljen mdeks ukoliko se pretrauje jedno od
Kolona kojoj _je jednokolonski indeks- na primer, ako je u tabeli
mdekmana kolona departmentiD i treba izvriti upit slede-
cem: SELECT .. . WHERE departmentiD=n.
Grupa za koju postoji indeks - na primer, ako za tabelu
postoji indeks za kolone (client ID, employeeiD work-
date) 1 treba izvriti upit SELECT .. . WHERE client AND
employeeiD=y AND workdate=z .
ili grupa kolo.na koja je deo viekolonskog indeksa, pod uslovom da je to
levz grupe. mdeks1ramh kolona - na primer, ako za pomenutu tabelu assign-
ment Imamo mdeks za kolone (clientiD, employeeiD, workdate) on biti
upotrebljen u upitima vrste: '
SELECT ... WHERE clientiD=x
SELECT ... WHERE clientiD=x AND employeeiD=y
Ali ne i u upitima nalik na
SELECT ... WHERE employeeiD=y AND workdate=z
Sutina cele je u ako da se izvravati veliki broj upita
kolonama 1h grupama kolona koje ne ispunjavaju navedene uslove, trebalo bi da
Izdate komandu CREATE INDEX da biste napravili indeks. Imajte u vidu
- r .. ---.J- ----
da MySQL moe da koristi samo po jedan indeks po tabeli u upitu. Nije
automatsko kombinovanje vie indeksa.
Ovo pitanje detaljnije razmotriti u poglavlju 19",0ptimizovanje upita",
kada budemo doli do komande EXPLAIN.
Komanda ANALYZE TABLE
Izdajte komandu ANALYZE TABLE da biste prikazali i snimili raspored u tabeli.
MySQL te podatke i koristi ih pri donoenju odluke o tome kako spojiti
tabele u upitu. Komanda se izdaje na
analyze table imetabele;
Komanda OPTIMIZE TABLE
Na kraju, moramo pomenuti komandu OPTIMIZE TABLE. Njena vrlo jednostavna
sintaksa izgleda ovako:
OPTIMIZE TABLE imetabele;
To je MySQL-ov ekvivalent komande za defragmentiranje diska. Tokom
upotrebe baze podataka, u datotekama u kojima se podaci raste broj praznina
blokova podataka na mestima gde su ranije bili izbrisani zapisi ili odakle su
zapisi premeteni zato to su nakon auriranja postali Te praznine su uzrok slabije
efikasnosti.
Trebalo bi da povremeno upotrebite komandu OPTIMIZE TABLE ukoliko ste izbri-
sali podataka, ili ako ste dodali, izbrisali ili aurirali broj redova pro-
menljive duine. Tako preurediti podatke u datotekama, ponovo sortirati indekse
i aurirati podatke o tabeli.
U vreme pisanja knjige, ova komanda je delovala samo na MyiSAM i BDB tabele.
Saetak
Strukturu baze podataka moete optimizovati tako to odabrati tipove poda-
taka manje i fiksne duine, definisati indekse i koristiti
tipove tabela.
Indeksi brzo pronalaenje zapisa traenih na osnovu vrednosti u
indeksiranim kolonama.
Indeks biti upotrebljen u upitu kada se u njemu referencira indeksirana kolona
ili kolone, ili levi kraj grupe indeksiranih kolona.
Komanda OPTIMIZE TABLE imetabele obavlja za tabele operaciju defrag-
mentiranju diska.
Pitanja
Pitanja
1. Koja je od tvrdnji o indeksima
a) Indeksi zauzimaju previe prostora na disku i zato ih ne treba koristiti.
b) Ako tabeli nije pridruen nijedan indeks, upit se moe izvravati sporije.
e) Trebalo bi da indeksirate to broj kolona.
d) Nijedna od prethodnih.
2. Kada birate tipove podataka za kolone tabele
a) trebalo bi da koristite iste tipove u celoj bazi podataka jer tako ona postaje
efikasnija
b) trebalo bi da koristite tipove podataka promenljive duine gde god je
jer se tako optimizuje upotreba prostora na disku
e) trebalo bi da koristite tipove podataka fiksne duine gde god je da
biste ubrzali pristup podacima
d) nijedno od prethodnog
3. Kada birate tip tabela
a) uvek birajte InnoDB ili BDB zato to podravaju transakcije
b) uvek birajte MyiSAM zato to su najbre
e) koristite meavinu tipova, u zavisnosti od svrhe tabele
d) nijedno od prethodnog
4. Indeks biti upotrebljen ako se u upitu
a) koristi levi kraj grupe indeksiranih kolona
b) koriste sve kolone indeksa po redosledu od njihovog redosleda
u indeksu
e) koriste sve kolone indeksa po redosledu jednakom njihovom redosledu
u indeksu
d) koristi desni kraj grupe indeksiranih kolona
5. Upotrebite komandu OPTIMIZE TABLE
a) definiete tabelu, da biste poboljali njenu strukturu
b) kada koristite InnoDB tabele, da biste smanjili sistema
e) nakon izvravanja broja komandi SELECT nad tabelom
d) nakon izvravanja broja komandi DELETE nad tabelom
... 1"" ___ ...........
Vebe
U kojem od upita u bazi podataka employee biti upotrebljeni indeksi?
(Potraite u poglavlju 4, "Pravljenje baza podataka, tabela i indeksa", strukturu
baze podataka. Ili, ako ste je instalirali na svoj pogledajte komande
describe koje su sve kolone indeksirane.)
a)
b)
e)
select *
from employee
where departmentiD=128;
select employeeiD
from assignment
where clientiD=l;
select skill, count(skill)
from employeeSkills
group by skill;
Ako ovi upiti treba da se izvravaju, koje biste dodatne indekse napravili?
Odgovori
Pitanja
l. b
2. e
3. e
4. b
S. d
Vebe
[ndeks se koristi samo u upitu pod b).
Trebalo bi indeksirati kolone employee . department ID i employeeSkills. skill.
U poglavlju
U (i poslednjem) poglavlju, "Optimizovanje upita", kako
moete utvrditi da li se upit izvrava brzo ili sporo, i zbog kao i to kako
reiti problem.
19
..
Optimizovanje upita
M YSQL DA ANALIZIRATE upit da biste saznali za koje se vreme
izvri i kako se izvrava nad sadrajem baze podataka. Na osnovu tih podataka
i poznavanja na koji MySQL pokuava da optimizuje upite, ponekad moete
da poboljate performanse upita. U ovom poglavlju teme:
Otkrivanje sporih upita
Merenje performansi upita
Upotreba dnevnika sporih upita
Upotreba komande EXPLAIN za prikazivanje na koji se upiti izvravaju
MySQL-ov mehanizam za optimizovanje upita
Saveti o optimizovanju upita
Otkrivanje sporih upita
Da biste optimizovali aplikaciju, morate najpre utvrditi koji njeni delovi imaju
udeo u ukupnom vremenu izvravanja. To moete obaviti na nekoliko
Posmatranjem: daje neophodno optimizovanje zbog toga to
se upit izvrava brzinom premorenog pua.
Merenjem: Testirajte aplikaciju da biste saznali koji se njeni delovi sporije
izvravaju.
Uvidom u dnevnik sporih upita: U ovaj dnevnik belee se spori upiti, kao to biste
i na osnovu njegovog imena.
Poto identifikujete spori upit, komande EXPLAIN moete saznati kako ga
MySQL izvrava da biste zatim pokuali da ga optimizujete.
nije potrebno da ubrzate ba sve upite koji se koriste u aplikaciji .
samo manji deo koda oduzima deo ukupnog vremena izvravanja. Ukoliko
va sistem nije izuzetno besmisleno je da gubite vreme da
ubrzate delove aplikacije je udeo u ukupnom vremenu relativno mali .
Merenje performansi upita
Merenje performansi (engl. benchmarking) korisno je za reavanje svih vrsta problen:a
optimizovanja. Merenje performansi u ovom merenje vremena za koje
se upit izvri. Najbolje je da upit izvrite vie puta i da zatim
vreme njegovog izvravanja. da trajanje jednog izvravanja upita zavisi od
ukupnog sistema, samo jedno merenje moe dati rezultate.
i to da bi upit trebalo da se bre izvri kada ga pokrenete drugi put jer je
smeten u ostavu (ke).
Razume se, moete koristiti spoljne skriptove ili programe posebno napisane tako
da isti upit izvravaju vie puta. Ako vas zanima primer takvog programa, preuzmite
distribuciju MySQL-a sa izvornim kodom i potraite programe za merenje perfor-
mansi u direktorijumu sql-bench.
U MySQL-u moete meriti brzinu vrednosti bilo kojeg izraza
i upita) funkcije BENCHMARK(). Na primer:
select benchmark(lOOOOOO, 6*9);
Ova komanda daje rezultate nalik na
+-------------------------+
l benchmark (1000000, 6*9) l
+-------- -----------------+
o l
+-------------------------+
1 row in set (0.25 sec)
Funkcija prihvata dva parametra: koliko puta treba vrednost izraza
(u ovom primeru, milion puta) i izraz koji se (u ovom primeru, est puta
deve0. ..
da nas pri merenju performansi ne zanima rezultat upita SELECT, funkclJa
BENCHMARK () uvek rezultat nula. Pri merenju nas zaista zanima za koje vreme se
upit izvrio. Iz navedenog primera rezultata vidi se daje proizvoda 6 x 9
milion puta na mom trajalo sekunde.
Funkciji BENCHMARK () moete proslediti i tekst upita, na primer:
select benchmark(lOOOOOOO,
'select employee.name, department.name
from employee, department
where employee.departmentiD=department.departmentiD');
Upotreba dnevnika sporih upita . v
dnevnika sporih upita moete utvrditi koji se upiti presporo IzvrsavaJU.
ddiniete ta je "sporo", ali taj parametar morate izraziti u sekundama, kao celobroJnU
vrednost.
upotreoa komande EXPLAIN za prikazivanje na koji sc upili l1vr .!Valu
Beleenje sporih upita u dnevnik moete opcije --log- slow
-queries=imedatoteke, koju zadate kada MySQL, ili u datoteci opcija.
Ako i opciju --log-long-format, evidentirani i svi upiti pri sc
izvravanju ne koristi nijedan indeks. To vam moe da lake utvrdite
treba da f>osvetite najvie panje pri optimizovanju.
Zadavanjem vrednosti promenljivoj long_query_time ta je za vas
spor upit. Moete je zadati u konfiguracionoj datoteci ili komande SET.
Vrednost te promenljive izraava se u sekundama.
Dnevnik sporih upita moete neposredno jer je to tekstualna datoteka.
Moda smatrati korisnijim saet spisak upita koji se sporo izvravaju. Takav spisak
moete prikazati skripta mysqldumpslow (u direktorijumu scripts instalacije
MySQL-a). Poto je to skript napisan na jeziku Perl, ako koristite Windows, morate
prethodno instalirati Perl ukoliko gaj o nemate. (Preuzmite ga sa adrese www. active-
state. com.)
Jedno od MySQL-ajeste to da ne belei spore upite
izvravanje traje manje od sekunde. Na sistemima koji relativno veliki broj
jednostavnih upita, jedna sekunda "traje" veoma, veoma dugo. Administrator
moda eleti da zna kojim je upitima potrebno vie od desetinke ili nekog drugog dela
sekunde. To biti u jednoj od verzija MySQL-a.
Upotreba komande EXPLAIN za prikazivanje
na koji se upiti izvravaju
Komanda EXPLAIN nalae MySQL-u da "objasni" kako namerava da izvri upit. Kao
jednostavan primer, moete zadati
explain
select e.name, d.name
from employee e, department d
where e.departmentiD = d .departmentiD;
Kao to vidite, ispred jednog sasvim upita samo smo dodali re EXPLAIN.
Zbog toga se upit izvriti,jedino se prikazati podaci o tome kako MySQL pla-
nira da izvri upit. Trebalo bi da se prikau rezultati nalik na
... --- +------------ +-- ---- -+------- -+--------------- +-------- -+-------- -+--------------- -+------ +------ -+
1 id 1 select_type 1 table l type l possible_keys l key l key_len l ref l rows l Extra l
+---- +------------- +------- +------- -+-------------- -+--- ----- -+- -------- +--------------- -+------ +------ -+
l l l SIMPLE l e l ALL l NULL l NULL l NULL l NULL l 5 l l
l 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)
ta sve ovo je da se u skupu rezultata pojavljuje po jedan red
za svaku tabel u u upitu. Redosled redova je jednak redosledu kojim tabele biti s po
jene u upitu.
Tabela rezultata ima kolone:
id Redni broj. Ako jedan upit sadri vie komand1 !.J EI . EC" I' - 11 ,1 JliiiiH:I, bd.1
je u upit podupit- svaka komanda SELECT dobtj.l rLdni broj .
select type Vrsta komande SELECT koja se izvrava. U ova
kolona SIMPLE, kao u prethodnom primeru, to daje u pitanju
sasvim upit SELECT. Ako imate podupite, spoljni upit biti
PRIMARY a unutranji upiti SUBSELECT ili DEPENDENT
SUBSELECT u koreliranih upita.
table Ime tabele na koju se red odnosi .
type Ovo je najvanija kolona pri optimizovanju i prikazuje na koji
tabela biti spojena s drugim tabelama u upitu.
possible_keys Ova kolona pokazuje koji bi se indeksi mogli upotrebiti u
upitu. Ako nema nijednog upotrebljivog indeksa, u ovoj koloni prikazuje se
NULL.
key Ova kolona pokazuje koji je indeks izabran za upit. Ako nije izabran nije-
dan, u koloni se prikazuje NULL.
key len Duina indeksa koji je MySQL da upotrebi.
ref Vrednost s kojom se poredi sadraj kolone pri koji se
redovi izdvajaju u skup rezultata upita.
rows Pro cena broja redova koje MySQL morati da iz jedne tabele da
bi se dobio rezultat upita. Mnoenjem vrednosti broja redova moete utvrditi
koliko redova biti Time dobijate red brzine izvravanja upita.
Extra Ova kolona moe sadrati dodatne podatke. Na primer, komentar
using index da MySQL moe u potpunosti rezultate upita iz jednog
od indeksa i nema potrebe da podatke iz tabele.
Dakle, ta nam rezultati govore u ovom primeru?
Tip spoja ALL za tabelu employee da biti pretraeni svi redovi te tabele.
Razume se, to biti spora operacija ako tabela sadri veliku podataka. U
stvari, spoj tipa ALL je najgori rezultat. Njega dobiti kad god tabela nema
nijedan indeks koji bi se mogao upotrebiti u upitu. optimizac4ija u tom slu-
jeste da dodate indeks. To je objanjeno u nastavku ovog poglavlja.
U redu koji se odnosi na tabelu department stoji daje spoj tipa eq_ref, to da
se iz tabele department po jedan red za svaki red iz tabele employee. To je
jedan od najboljih tipova spojeva. Jedine bolje vrednosti u koloni type _su system i
cons t, to da u tabeli postoji samo jedan red koji odgovara uslov1ma up1ta l da
sc zato ta tabela moe tretirati u upitu kao konstanta. tip spoja u upitu
nam odgovara.
y-'u'--uv uyraaen1 mehamzam optimizovanja upita
Ovo su ostale vrednosti koje se mogu pojaviti u koloni type:
ref Iz tabele biti svi redovi koji sadre vrednosti jednake vredno-
stima u indeksu. To je prva slabija opcija od eq_ref i predstavlja situaciju u kojoj
radite s vrednosti nisu jedinstvene .
range Ovaj tip spoja je slabiji od tipa eq_ref , pa i od ref, a da iz
tabele biti svi redovi iz odredenog opsega.
index Ovo je bolje od tipa ALL, ali slabije od svih dosad navedenih tipova spo-
jeva. Kada se prikae tip index, to da biti pretraen ceo indeks. To je
bolje od pretraivanja cele tabele, ali daleko je od savrenog.
Pogledajmo vrednosti u kolonama possible_keys i key. Za tabelu department
prikazana je opcija PRI MARY i ime kolone primarnog to je kolona koja
biti upotrebljena. Red tabele employee sadri vrednost NULL u obe navedene
kolone, to da nema koji se moe upotrebiti i zato biti upotrebljen
nijedan. To je jo jedna jasna naznaka da tabeli treba dodati nov indeks!
Na osnovu tih podataka i pod pretpostavkom da taj upit biti relativno
izvravan, pa bismo zbog toga eleli da bude bri, indeks:
create index ename_did on employee(name, departmentiD);
Ako ponovo izdamo komandu EXPLAIN, rezultati izgledaju ovako:
+--- -+--- --------- -+------ -+---- ---- +-------------- -+---------- -+- ------- -+--- ------------ -+----- --------- ---- -
l id l select_type l table l t ype l possible_keys 1 key l key_len l ref 1 rows 1 Extra 1
+--- ---- ---------- +----- --+-- -- --- ------ --------- -+-- -------- -+-------- - +------- ------- --+----- -+----- ------- -+
l l l SIMPLE l e l index l NULL l ename_did l 85 1 NULL 1 S l Using index l
l l l SIMPLE l d l eq_ref l PRIMARY l PRIMARY l 4 l e.departmentiD l l l l
+---- +---- -------- -+--- --- -+--- ---- -+---- ------- -- --+- ----- ---- -+------ -- -+--------------- -+- ---- -+----- ------- -+
2 rows in set (0. OO sec)
Promene su U redu tabele employee sada stoji daje tip spoja index jer
postoji indeks koji se moe upotrebiti . Novi indeks je naveden kao ali
biti upotrebljen. U koloni Extra stoji da za tu tabelu biti upotrebljen indeks
umesto same tabele, bi trebalo da upit bude neto bri.
upotreba komande EXPLAIN jeste za da li biste bolje
osmiljenih indeksa mogli da ubrzate upite, ali da se to moe i na
druge
MySOL-ov mehanizam optimizovanja upita
MySQL prim.enjuje na upite vie pravila optimizovanja.
Na osnovu procenjenog broja redova (koji prikazuje komanda EXPLAIN), MySQL
koji bi bio najbolji redosled spajanja tabela. Ako smatrate da je njegova pro-
cena pogrena, odredbom STRAIGHT JOIN zadajte redosled spajanja tabela.
Merenjem performansi upita pre i posle te izmene, da li time stvari pobolj
avate ili pogoravate.
Kada bira indeks, MySQL trai indeks koji obuhvata manje od 30"/u
redova tabele. Ako ne uspe da indeks koji ispunjava te uslove, sekvenCIJalno
pretrauje 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 onome na koji mnogi pre-
vodioci programskih jezika optimizuju izraze. Na primer, iz izraza se uklanjaju suvine
zagrade. To je jedan od razloga zbog kojih moete slobodno dodavati zagrade u tekst
upita da bi postao lake razumljiv.
Ako se potpun rezultat upita moe dobiti iz podataka sadranih u indeksima, iz
tabela se u nijedan red. Rezultat funkcije COUNT ( *} se dobija bez
i prebroja vanja redova tabele jer su podaci potrebni za tu namenu smeteni
odvojeno od tabele (u indeksu).
da se u MySQL-ovoj dokumentaciji nalazi detaljan spisak svih optimizacija
koje MySQL obavlja, ovde ga nismo ponovili. Ali i taj spisak nije potpun. Ako vas
zanima kako radi optirnizator upita, moete njegov izvorni kod.
Preporuke za optimizovanje upita
Postoje tri najvanije stvari koje moete uraditi da biste optimizovali svoje upite:
Dodajte indekse. Ako imate upit nad neindeksiranom kolo-
nom koji se izvrava, dodajte indeks za tu kolonu. Vie informacija o tome
kako MySQL koristi indekse u poglavlju 18, "Optimizovanje baze
podataka". ne zaboravite iako indeks moe
ubrzati postupak pronalaenja podataka u tabeli, odravanje indeksa u aurnom
stanju produuje upisivanje podataka. Nemojte dodavati indekse koji se
koristiti.
Povremeno izdajte komandu ANALYZE TABLE. (Njena sintaksa je opisana
u poglavlju 18.) Time aurirate podatke o raspodeli vrednosti koje
MySQL Na osnovu tih podataka, MySQL redosled spajanja
tabela u upitu. Ako vam se da MySQL spaja tabele redosledom,
pokuajte s komandom ANALYZE TABLE.
Povremeno izdajte komandu OPTIMIZE TABLE. (Njena sintaksa je opisana u
poglavlju 18.) Time defragmentirate podatke u tabeli, sortirate indekse i auri-
rate podatke o tabeli koje koristi optimizator upita.
Saetak
Otkrijte spore upite funkcije BENCHMARK (} ili dnevnika sporih upita.
komande EXPLAIN utvrdite kako se upiti izvravaju
Ubrzajte izvravanje upita dodavanjem indeksa a zatim ih ponovo ispitajte
komande EXPLAIN.
Komande ANALYZE TABLE i OPTIMIZE TABLE MySQL-ovom optimi-
zatoru upita da dobro obavi svoj posao.
Pitanja
1. funkcija BENCHMARK ()
a) rezultat izraza izvrav;liiJL' llll'JII
b) vreme potrebno za izvravanJL' lllollol
1111
JilL
e) nulu, bez obzira na ulazne JW .IIIH'IIl'
d) nijedno od prethodnog
2. Izdali ste k?mandu EXPLAIN za odredeni up1t 1
11

11
1
0111 1
YI'
1
, ,j
11
,
111
1
1
d orl
1
dob1h ste t1p spoja ALL. To
a) da iz tabele biti samo jedan IL'd
b) tabele biti svi redovi koji sadre vredu osti JL'd.
111
kt VHdnn
st1ma mdeksa
e) da biti sekvencijalno pretraen ceo indeks
d) da biti sekvencijalno pretraena cela tabela
3. ste EXPLAIN za upit i u koloni type jedne od tabela
dob1h ste t1p spoja eq ref. To
a) da iz tabele biti u samo jedan red
b) tabele biti u svi redovi koji sadre vrednosti jedanke vredno-
stlma mdeksa
e) da biti sekvencijalno pretraen ceo indeks
d) da biti sekvencijalno pretraena cela tabela
4. Izda.li ste k?mandu EXPLAIN za upit i u koloni type jedne od tabela
dob1h ste t1p spoja index. To
a) da iz tabele biti samo jedan red
b) da tabele biti svi redovi koji sadre vrednosti jedanke vredno-
Stlma mdeksa
e) da biti sekvencijalno pretraen ceo indeks
d) da biti sekvencijalno pretraena cela tabela
S. komande EXPLAIN pokazuju da MySQL spaja dve tabele neoptimal-
mm redosledom. Zbog toga bi trebalo da
a) izdate komandu ANALYZE TABLE za obe tabele
b) zadate redosled spajanja odredbe STRAIGHT JOIN
e) ili a) ili b)
d) ni a) ni b)
240 Poglavlje 19 Optimizovanje upita
Vebe
Pogledajte upit:
select department.name
from client, assignment, employee, department
where client.name='Telco Inc'
and client.clientiD = assignment.clientiD
and assignment.employeeiD = employee.employeeiD
and employee.departmentiD = department.departmentiD;
funkcije BENCHMARK vie puta izmerite vreme izvravanja ovog upita
i komande EXPLAIN utvrdite kako se on izvrava. Proverite da li moete
brzinu izvravanja dodavanjem novog indeksa i ponovnim merenjem.
Odgovori
Pitanja
1. e
2. d
3. a
4. e
5. e
Spisak termina u knjizi
alijas alias nedelji vost
atribut, obeleje attribrtle niti izvravanja
b-stablo b-tree obeleje, atribut
bafer za read bt!!Jer ostava za tabele
bafer za key br"!!fer otpornost sistema
bafer za sortiranje sort br!ffer na greke
bafer za zapise record br!lfer podu pit
blokiranje next key /ocking polje
ponititi
sadraja tabele table scan potvrditi
sekvencijalnim preklapanje
redosledom dva servera
datoteka slike dumpfile "na
Dekartov proizvod Cartesian product prenosni dnevnik
dnevnik greaka error log
dnevnik izmena binary log od korena
dnevnik sporih upita slow query log pun spoj,
dnevnik upita query log unakrsni spoj
fantomski podaci phantom reads rad sa vie glavnih
funkcionalna functional servera istovremeno
zavisnost dependency
glavni server master
jednakovredni spoj equijoin red
jezik za definisanje Data Diftnition sistem za upravljanje
podataka Language, DDL relacionim bazama
jezik za rad Data Manipulation podataka
s podacima Language, DML slog, zapis
kandidati za candidate keys spoJ
key spoljni
koeficijent poveza- relevance value
nosti s traenim ema baze podataka
poJmOm tabela
kolona column upit
korelira n correlated unakrsni spoj,
maina za skladitenje storage engine pun spoJ
merenje performansi benchmarking zapis, slog
n-torkc tup/es zavisni server
nebitne stop words
SVEUCIIlNAl<Nl\N\0\
Rl J KA
atomicity
thread s
attribute
table cache
fau/t tolerance
subquery
field
roll back
commit
fa ilo ver
re/ay log
stemming
full join
multimastering
load balancing
row
Relational Database
Management
System, RDBMS
record
join
foreign key
superkey
database schema
table
nested query
full join
record
slave
Simboli
l (deljenje), operator, 110
= (jednako), operator, 111
A (karet), znak, 116
<(manje od), operator, 111
\ (obrnuta kosa crta), 67
-(oduzimanje), operator, 110
+ (sabiranje), operator, 110
; i zarez), 46
od), operator, 111
$(znak za dolar),116
* (zvezdica), 110, 116
Brojevi
1NF (prva normalna forma),
34-36
2NF (druga normalna forma),
36-37
3NF normalna forma),
37-38
A
abs(), funkcija, 118
ACID transakcije,
149-150
activestate.com, Web lokacija, 235
adddate(),funkcija, 119
administriranje baze podataka
datoteke dnevnika, 183
MySQL server, pokretanje
i sputanje, 177-178
pranjenje ostava, 182-183
prikazivanje podataka o bazi,
178-180
prikazivanje podataka
o dodeljenim pravima, 181
prikazivanje podataka
o procesima, 181
prikazivanje podataka o tabelama,
181-182
prikazivanje statusa servera
i vrednosti serverskih
promenljivih, 180
skript mysqladmin,lista opcija,
184
unitavanje niti, 182
alijasi, komanda SELECT, 82-83
ALL, pravo, 160
ALL, rezervisana 102
ALTER TABLE, komanda, 56-57
ANALYZE TABLE, komanda, 230,
238
AND, operator, 112
anomalije
pri auriranju podataka, 34
pri brisanju podataka, 34
pri dodavanju podataka, 33
anonimni nalozi, brisanje, 17,
202-203
ansi, opcija, podeavanje
MySQL-a, 172
ANY, rezervisana re 102
aplikacije, provera ulaznih
podataka, 204
operatori, 110
atributi, tabele baze podataka, 31
AUTO INCREMENT, rezervisana
49-51
autocornmit, reim rada
transakcija, 147
AVG ROW LENGTH, opcija,
optirnizovanje tabela, 51
avg(), funkcija, 122
auriranje redova tabela, 72-73
B
BACKUP TABLE, komanda, 194
bafer za 224
bafer za definicija, 223
bafer za sortiranje, 224
baferi, 223
basedir, opcija, podeavanje
MySQL-a, 172
baze podataka
adtninistriranje
datoteke duevuika, 183
MySQL server, pokretmlje
i spuftmlje, 177-17 8
pra:bljetlje ostava, 182-183
prikazivmlje podataka o bazi,
178-180
prikazivmlje podataka o
dodeljeuim pravima, 181
prikazivmlje podataka o procesima
181 '
prikazivanje podataka o tabelama,
181-182
prikazivatlje statusa servera
i vreduosti serverskih
promeuljivih, 180
serverske promeuljive, pode!avatlje,
182
skript mysqladmiu, lista opcija,
184
utli!tavarlje uiti, 182
biranje, 43
brisanje, 56
entiteti, definicija, 29
identifikatori
dozvoljeu broj zuakova, 43
rwvoduici, 43
rezervismJe reli, 4 3
indeksi
brismlje, 56
izrada, 55-56
Indeks
izrada rezervnih kopU.1 i
restauriranje podatak:l
komauda BACKUI'TilBL/i,
194
komauda RESTORE TABLI'
194 .
mogubwsti, 187-188
pomo{u duevuika iz meua,
194-195
19 3-194
skript mysqldump, 188-192
skript mysqlhotcopy, 192- 193
tabele, proveravmlje i popravljmljc,
195-198
testirmlje rezervtle kopije, 19 5
zaklju{avatlje tabela, 18 8
izrada, komanda CREATE
DATABASE, 43
komanda ANALYZE TABLE
230
optimizovanje
iudeksi, 229-230
izbori pri projektovarlju, 228
OPTIMIZETABLE
230
preporuke, 227-228
principi projektovanja
auomalije, 33-34
twrmalizovatlje, 3 4-3 8
NULL vreduosti, 34
reduudmlttwst i gubljetlje
podataka, 33
vaua pitmya, 32
relacije
29
tipa ,Jeda tl prema jed au", 2 9
tipa .,jeda tl prema viJe", 2 9
tipa" vie prema vi! e
11
, 2 9
rep likovanje
beziJedtlostle mere, 211
budt.tbwst, 216
d11evuik izmwa, 21 O
dodeljivatlje prava za, 211
kopije teku{eg stmya, pravljerye,
212-214
otpomost Ila gre!ke, 209
preklapatlje servera 11a vm{e, 217
pri11cipi, 209-21 O
p rovera glavtwg servera, 2 12
opterdetlja, 2 15
upotrebljive verz;;e MySQLtt,
210
vifestn1ki glav11i serveri, 2 17
zavistti serveri,
i pokretmlje, 2 14
sistem za upravUanjc rci.Ki<lllllll
bazama podat.1k.1
(RDBMS),11
ema, dcfinkJ-,
4 Indeks
tabele
ALTER TABLE, 56
atribwi, 31
BerkeleyDB (BDB), 50, 135
brisanje, 5 6
fimkcioualne zavisnosti, 32
gmptw r111ofenje podataka, 7 3-7 5
HEAP, 50, 138
indeksi, 229-230
lmwDB, 50, 134-135
ISAM, 50, 128-129
31
ko/otre, 31, 52-55, 80
komanda CREATETABLE,
48-52
MERCE, 136-137
merge, 50
MylSAM, 50, 129-134
uovi redovi, umeta11je, 65-69
n-torke, 31
podrfka za tramakcije, 127-128
pod11piti Je rezultat Jedna
vrednost, tao-t 01
podupiti za izraze logitkog tipa,
101-103
pod upiti za izvedme tabele, 1 OO
pra"", 161-164
prav!ietife, 44-52
preimeiiOIJ(Itife, 57
redovi, 31
redovi, azurirmife, 72-7 3
redovi, brismife, 7Q-72
redovi, brismife koma11de
TRUNCATE, 72
redovi, drtpliralli, 84-86
redovi, 83-84
redovi, zameua, 70
redovi rezulltZta upittr,gmpismye,
86-87
spa)m!je, 95-99
stnrktura, metifmife, 56-57
zada""ife imena u kommrdi
SELECT, 81-82
zapisi, 31
zadavanje apsolutnih in1ena.,
81-82
BCNF (Boyce-Coddova normalna
forma), 38
DDB (Berkeley), tip tabela, 50, 135
benchmark(), funkcija, 121, 234
llcrkeleyDB (BDB), tip tabela, 50,
135
IIIGINT, celobrojni tip podataka,
53
hin, dlrektorijum, 20
IIINARY, rezervisana 111
nje
b.t7C podataka, komanda use, 43
podataka iz redova
tnbela, 83-84
DLOB, tip podataka, 54
Doyce-Coddova normalna forma
(DCNF),38

.11tnn11nr11h naloga, 17, 202-203
h.".1 p<><b t,,ka, 56
indeksa, 56
redova iz tabela, 7Q-72
tabele, 56
brisanje redova, komanda
TRUNCATE, 72
brojevi s pokretnim zarezom, 48
b-stabla, 135
e
CASE, funkcija, 113
cast, funkcija, 120
ceiling(), funkcija, 118
celo brojni tipovi podataka, 52
CHAR, tip podataka, 53
CHECK TABLE, komanda, 196
CHECKSUM, opcija,
optimizovanje tabela, 51
promena datoteka
dnevnika, 183
column_priv, kolona
tabela columns_priv, 164
tabela tables_priv, 164
colum.ns_priv, tabela, prava
pristupa, 164
COMMENT, komanda
optimizovanje tabela, 51
conv(), funkcija, 114
convert(), funkcija, 120
count(), funkcija, 122
CREATE, pravo, 159
CREATE DATABASE, SQL-ova
komanda, 43
CREATE TABLE, SQL-ova
komanda, 44, 48-52
CREATE TEMPORARY TABLES,
pravo, 159
CSV format, 75
curdate(), funkcija, 119
curtime() funkcija, 119
D
data, direktorij um, 20
Data Definition Language (DDL),
42
DATA DIRECTORY, opcija,
optimizovanje tabela, 51
Data Manipulation Language
(DML), 42, 65
datadir, opcija, podeavanje
MySQL-a, 172
DATETIME, tip podataka, 55
datoteke
dnevnika, 183
slike stanja, 188
datoteke opcija, podeavanje
MySQL-a, 169-171
internacionalizovanje, 174
konfiguracione opcije za vie
inst.:llacija na istom
173-174
mysqld, podeavanje opcija za,
171-172
opcije za InnoDB, 172-173
datumski tipovi podataka, 54
dayname(), funkcija, 119
db, tabela, prava pristupa, 163
DDL (Data Definition Language),
42
Decimal, tip podataka, 52
DEFAULT, odredba, komanda
INSERT,69
DEFAULT, rezervisana 49
defragmentiranje MyiSAM tabele,
130
DELAY KEY WRITE opcija,
optimizovanje tabela, 51
DELAYED, odredba, komanda
INSERT, 68
DELETE, komanda, 7Q-72
DELETE, pravo, 159
deljenje (/),operator, 110
describe, komanda, 48
desni spoj, 98-99
MyiSAM tabele,
129-130
DISTINCT, odredba, komanda
SELECT, 84-86
DML (Data Manipulation
Language), 42, 65
dnevnici
aktiviranje, 183
dnevnik greaka, 183
log-bin, opcija, podeavanje
MySQL-a, 172
log-error, opcija, podeavanje
MySQL-a, 172
log-slow-queries, opcija,
podeavanje MySQL-a, 172
opcije za dnevnike izmena,
podeavanje MySQL-a, 173
prenosni, 21 O
sporih upita, 183, 234-235
u Linuxu, 183
upita, 183
dnevnik izmena
opis, 183
rep! i kovanje, 21 O
restauriranje baze podataka,
194-195
does, direktorij um, 20
dodeljivanje prava, 157
globalna prava, 160
prava za administratore, 159
prava za korisnike, 159
tabele prava, 161
za baze podataka, 160
za kolone, 161
za replikovanje, 211
dolar($), znak, 116
DOUBLE, tip podataka, 53
drop database, komanda, 45, 56
DROP INDEX, komanda, 56
DROP TABLE, komanda, 56, 191,
194
DROP, pravo, 160
druga normalna forma (2NF),
36-37
dupli rani redovi, 84-86
E
Ernie Application Cluster, alatka,
217
encrypt(), funkcija, 121
entiteti,definicija,29
ENUM, tip podataka, 54
EXECUTE, pravo, 159
EXISTS, rezervisana 102
EXPLAIN, rezervisana podaci
o izvravanju upita, 235-237
extra, vrednost, komanda
EXPLAIN, 236
extract(), funkcija, 119
F
fantomski podaci, nivo
izolovanosti transakcija, 151
FIELDS, odredba, komanda
LOAD DATA INFILE, 74
FILE, pravo, 160,203
filtriranje ulaznih podataka,
bezbednosne preporuke, 204
FLOAT, tip podataka, 53
float, tip podataka, 48
floor(), funkcija, 118
FLUSH, komanda, pranjenje
ostava, 182-183
FLUSH PRIVILEGES, komanda,
202-203
FLUSHTABLES, komanda, 137,
193
FOREIGN KEY, rezervisana
50
found rows(), funkcija, 121
fragmentacija, My ISAM tabele,
130
FROM, odredba
podupiti, za izvedene tabele, 100
spojevi, 94
FULLTEXT rezervisana 50
funkcije
abs(),118
a ddda te(), 119
avg(), 122
benchmark(), 121 , 234
CASE, 113
cast, 120
ceiling(), 118
concat(), 114
convert(), 114,120
counc(), 122
curdate(), 119
curtime(), 119
dayname(), 119
encrypc(), 121
extract, 11 9
floor(), 118
found rows(), 121
grupne, 121-122
IF, 113
last insert id(), 121
length(), 114
LIKE,115
load file, 114
locate(), 114
lower(), 114
MATCH,115
max(),122
md5(),121
min(), 122
mod(),118
now(),119
117-118
operatori
aritmetitki, 11 O
logitki, 112
za poredetife vred11osti, 11 Q-112
password(), 121
power(), 118
quote(), 114
rand(), 118
replace(), 114
RLIKE,115-117
round(),118
soundex(), 114
sqrt(), 118
std(), 122
STRCMP,115,117
subdate(), 119
substring(), 114
sum(), 122
timestamp, 119
trim(),114
109
upper(), 114
z.'l rad s datumima i vremen itna,
119-120
za rad sa znakovnim vrednostima
obrada zuakovuih vreduosti, 114
poredenje ztrakovuih vred11osti,
115-117
za upravljanje tokom izvrlavanja,
113
funkcije za rad s datumima
i vremenima, 119-120
funkcije za upravljanje tokom
izvravanja, 113
funkcionalne zavisnosti, koncepti
i terminologija, 32
G
glavni serveri, replikovanje,
podeavanje, 209-212, 215
globalna prava
dodeljivanje, 160
zatita servera, 202
Google, Web lokacija, 135
GRANT, komanda
odredba IDENTIFIED BY, 158
odredba ON,158
odredba REQUIRE, 159
odredba TO, 158
odredba WITH, 159
odredba WITH GRANT
OPTION,159
grantor, kolona, tabela tables_priv,
164
GROUP BY, odredba, komanda
SELECT, 86-87
grupisanje redova rezultata upita,
86-87
grupnt luni. t ll, l J l l
grupno ttOHINtlt
gubljenjo (llHiucul.,, l
redunduutuwt.sunJ k tn
baza pothohol.u, l l
H
Hafmanovo kodirnnjt,
komprimovanjt. litlwl1t, l' l
HAVING, odredba, konmnolu
SELECT, 87
HEAP, tip tabela, 50, 138
host, tabela, prava pristupa
kolone za opseg vidljivmu, l (1,\
kolone za prava, 163
I
id, opcija, komanda EXPLAIN,
236
IDENTIFIED BY, odredba,
komanda GRANT, 158
identifikatori
maksimalan broj znakova, 43
navodnici, 42
razlikovanje malih i velikih slov:1,
42
rezervisane 43
IF, funkcija, 113
IF NOT EXISTS, odredba, 49
IGNORE, odredba
komanda INSERT, 69
komanda LOAD DATA IN FILE,
74
komanda UPDATE, 72
IN, rezervisana 101
indeksi
brisanje, 56
izrada, 55-56
jednokolonski, 229
levi kraj grupe, 229
optimizovanje baze podataka, 227,
229-230
optimizovanje upita, 238
viekolonski, 229
INDEX, rezervisana 50
INDEX, pravo, 159
index, vrednost, komanda
EXPLAIN, 237
INDEX DIRECTORY, opcija,
optimizovanje tabela, 51
InnoDB, konfiguracione opcije,
podeavanje MySQL-a,
172-173
lnnoDB, tip tabela, 50
dosledno bez
pod1caka, 134
transakcije, 143-146
ACID uskladeuost, 149-/50
izolo""11ost tmn<akcij11, 150- 152
reZi lli J 47- /49
uslovi licence, 135
Web lokacij.t, 135
11,1 IIIVnll
rcd.t, 13-1
Indeks
INSERT, komanda
listing, 6S-66
odredbe, 68-69
opti oblik, 68
primer rezultata, 67
INSERT, pravo, 1S9
INSERT METHOD, opcija,
optirnizovanje tabela, S1
instaliranje MySQL-a
anonimni nalozi, brisanje, 17
lozinka korisnika root, zadavanje,
17
na Linux, 12
naOSX,14
naWindows,12-14
nalozi, pravljenje za
poslove, 17-18
podeavanje sistema, 14-16
provera da li sistem radi, 16-17
instalirane datoteke, zatita
filtriranje podataka, 204
zatita, 20S
preporuke, 203
pristup i prava upotrebe, 204
provera ulaznih podataka
u aplikaciji, 204
SSL (Secure Sockets Layer), 20S
internacionalizovanje, podeavanje
MySQL-a,174
ISAM tabele, SO
129
pregled, 128
izbori pri projektovanju,
optimizovanje baze
podataka, 228
izolovanost, nivoi (transakcije),
1SO
fantomski podaci, 1S1
prljavi podaci, 1S2
read committed, 1S1
read uncommitted, 1S2
repeatable read, 1 SO
serializable, 1SO
izrada
baze podataka, komanda
CREATE DATABASE, 43
HEAP tabela, 138
indeksa, SS-S6
kopije stanja,
replikovanje, 212-214
naloga, za poslove,
17-18
tabele
komanda CREATE TABLE,
44, 48-52
opcije za optimizovanje, 51
primer baze podataka employee,
44-48
izrada rezervnih kopija i
restauriranje podataka
komanda BACKUPTABLE,194
komanda FL USH TABLES, 193
komanda LOCKTABLES,193
komanda R.ESTOR.ETABLE,
194
187-188
dnevnika izmena,
194-19S
razlozi, 1 87
193-194
skript mysqldump
nedostaci, 192
opcija --add-drop-table, 191
opcija --add-locks, 191
opcija --all-databases, 192
opcija --allow-keywords, 192
opcija --d, 192
opcija --databases, 192
opcija --extmded-imert, 191
opcija --lock-tables, 192
opcija --no-data, 192
opcija --opt, 18 8
opcija --quick, 191
predtwsti, 192
primer rezultata, 188-191
skript mysqlhotcopy, 192-193
tabele, proveravanje i popravljanje
komanda CHECKTABLE, 196
kommzda REPAIR TABLE, 196
195
program myisamchk, 196-198
program mysqlcheck, 197
tabela, 188
testiranje kopije, 19S
izvrive datoteke, MySQL-ove,
20-21
J
jednako (=), operator, 111
jednakovredni spojevi, 97
jednokolonski indeksi, 229
K
kandidati za 31
karet (A), znak, 116
key, vrednost, komanda
EXPLAIN, 236
key _len, vrednost, komanda
EXPLAIN, 236
kandidati za
i 31
kolone tabela
datumski i vremenski tipovi
podataka, S4
31
tipovi podataka, S2-S3
opcija unique, SO
tabela baze podataka, 31
tabela columns_priv, 164
tabela db, 163
tabela host
kolone za opseg vidlj"ivosti, 163
kolone za prava, 163
tabela tables_priv, 164
tabela user
kolone za ograni{avonje upotrebe
resursa, 162
kolone za opse.(! vidlj"ivosti, 162
kolone za pravo, 162
kolatze za uspostavlj"anje
veze, 162
podataka iz odredenih
kolona, 80
znakovni i tekstualni tipovi
podataka
BLOB, 54
CI-JAR, 53
ENUM, 54
SET, 54
TEXT, 54
VARCHAR,54
kolone za upotrebe
resursa, tabela user, 162
kolone za uspostavljanje
veze, tabela user, 162
komande. Videti i naredbe
ALTER TABLE, S7
ANALYZE TABLE, 230,238
CHECKTABLE,196
COMMIT, transakcije, 147
drop database, 4S, S6
DROP INDEX, S6
DROPTABLE,S6,194
EXPLAIN, 23S-237
FLUSHTABLES,137, 193
FLUSH, pranjenje ostava,
182-183
LOCKTABLES,148-149,193
OPTIMIZE TABLE, 130, 230,
238
REPAIR TABLE, 130,196
R.ESET, pranjenje ostava,
182-183
SET
aktiviranje datoteka dnev11ika,
183
reim autocommit, isklj'u{ivmije,
147
SHOW,23,180
START TRANSACTION, 147
UNLOCKTABLES, 148-149
komprimovanje
concatQ, funkcija, 114
MyiSAM tabele, 131
kopije stanja, pravljenje,
212-214
interfejsi
MySQL Control Center, 21
MySQL monitor, 21-23
phpMyAdmin, 21
nalozi. Videti i prava
anonin1ni nalozi, brisanje,
202-203
anonimni, brisanje, 17
bezbednost
auouinwi Halozi, brismije, 17
pravljenje za poslove,
instaliranje MySQL-a,
17-18
zatita
attmzinwi ualozi, brisanje,
202-203
lozi11kd z a tzalo_q root, 202
opmm1 20.1
.(i(toiW/JI' lo i11kl, ?OJ
L
last insert id(), funkcija, 121
length(), funkcija, 114
levi spoj, 98-99
LIKE, funkcija, 11S
LIKE, odredba, 49
LIMIT, odredba
komanda DELETE, 72
komanda SELECT, 88-89
komanda UPDATE, 72
LINES, odredba, komanda LOAD
DATA INFILE, 74
Linux, instaliranje MySQL-a na, 12
listinzi
baza podataka, formiranje tabela,
44-4S
instaliranje MySQL-a,
konfiguracione opcije,
14-16
izrada rezervnih kopija i
restauriranje podataka,
skript mysqldump, 188-191
MERCE tabele, 136-137
podeavanje MySQL-a, reenje s
datotekom opcija, 169-171
primer komande INSERT, 6S-66
LOAD DATA INFILE, komanda,
73-7S
load file(), funkcija, 114
locate(), funkcija, 114
LOCK TABLES, komanda,
148-149,191,193
LOCK TABLES, pravo, 1S9
operatori, 112
tekstualno pretraivanje,
133-134
long_query _time, promenljiva
(dnevnik sporih upita), 23S
LOW PRIORITY, odredba
komanda DELETE, 72
komanda INSERT, 68
komanda LOAD DATA INFlLE,
74
komanda UPDATE, 72
lower(), funkcija, 114
lozinke
ifrovanje, 203
za nalog root, 17, 202
M
maksimalan broj znakova,
identifikatori, 43
manje od (<),111
MATCH, funkcija, 11S
max(), funkcija, 122
mdS(), funkcija, 121
MEDlUMINT, celobrojni tip
podataka, S3
mcrenje performansi, upiti, 234
MERGE, tip tabela, 136-137
merge, tip tabela, SO
MIN ROWS, opcija,
optimizovanje tabela, S1
min(), funkcija, 122
mnoenje (*),operator, 110
mod(), funkcija, 118
My ISAM, tip tabela, SO
129-130
komprimovanje, 131
poboljanja u odnosu na ISAM
tabele, 129
popravljanje, 130
pregled, 129
129-130
tekstualno pretraivanje, 131-134
myisamchk, ala tka za komandnu
liniju, 130
myisamchk, program, 20, 196-197
MySQL
instaliranje, 9, 11
auonimtzi tuzlozi, brisanje, 17
lozi11ka korimika root, zadava11je,
17
Ila U11ux, 12
na OS X, 14
11a Windows, 12-14
nalozi, pravlj"e11je za uobi{ajene
poslove, 17-18
podefavo1zje sistema, 14-16
provera da li sistem radi, 16-17
izvrive datoteke, 20--21
interfejsi
MySQL Control Ce11ter, 21
MySQL mo11itor, 21-23
phpMyAdmi11, 21
podeavanje
I111zoDB, 172-173
itttemacioualizovanje
1
17 4
kot!figuraciol!e opcije za vife
instalacija tUJ istom raluuant
1
173-174
mysqld, podefavo1zje opcija za,
171-172
refetzje s datotekom opcija,
169-171
server
pokretarzje i spuftmzje, 177-17 8
prikazivanje podataka o procesima
1
181
server, optimizovanje
parametri servera, 222-224
RAm diskovi,prepomka, 224
Solaris, preporuka, 224
struktura direktoriju ma, 19-20
MySQL Control Center, 21
MySQL monitor, 21-23
mysqladmin, program (skript), 20,
184
mysqlbinlog, program, 20
mysqlcheck, program, 197
mysqld, podeavanje opcija za,
171-172
mysqldump, skript, 20
nedostaci, 192
opcija --add-drop-table, 191
opcija --all-databases, 192
opcija --allow-keywords, 192
opcija --databases, 192
hill
opcija --cxtcndd ""'"" l 'J l
opcija --lock- tabl,.,, l
1
!2
opcija --no- dara, IIJ2
opcija --opt, 188
opcija --quick, 191
prednosti, 192
primer rezultata, '188 l 'J l
mysqlhotcopy, skript, 192 l 9.1
mysqlshow, program, 20
N
naredbe. Videti i komande
ALTER TABLE, S6
DROP TABLE, 191
FL USH PRIVILEGES, 202 20.1
GRANT,1S8-1S9
LOAD DATA INF! LE, 73-7S
LOCK TABLES, 191
ON, komanda GRANT, 1S8
R.EVOK.E, ukidanje prava
pristupa, 161
SELECT, izraela tabela, S2
SET, podeavanje promenljivih,
182
show processlist, niti, 181
show variables, 180
SQL-ove
CREATE DATABASE, 43
CREATETABLE, 44, 48-52
DELETE, 7{}-72
INSERT, 68-69
REPLACE, 70
SELECT, 8{}-89
TRUNCATE, 72
UPDATE, 72-73
UNLOCK,191
use, biranje baze podataka, 43
navodnici, identifikatori, 43
nebitne tekstualno
pretraivanje, 132
niti, unitavanje, 182
normalizovanje
Uoyce-Coddova normalna forma
(BCNF),38
definicija, 34
druga normalna forma (2NF),
36-37
prva normalna forma (1 NF),
34-36
normalna forma (3NF),
37-38
NOT NULL vrednost, izrada
tabela, 49
NOT, operator, 112
now(), funkcija, 119
n-torke, koncepti i tertninologijn,
31
NULL, vrednost
izrada tabela, 49
operatori za porcdcnjc vttdlln,t<.
110--111
projektovanjc """' pod.u.tk.t, H
funkclJ, 117 liH
tipovi putlut1'""' 1\
1
'\ \
8 Indeks
o
obrnute kose crte (\), 67
odredbe
DEFAULT, komanda INSERT
69
DELAY ED, komanda INSERT,
68
DISTINCT, komanda SELECT
84-86
FIELDS, komanda LOAD DATA
IN FILE, 74
FROM
spojevi, 94
11 podupitima za izvedme tabele,
100
GROUJ> BY, komanda SELECT,
86-87
HAVING, komanda SELECT, 87
IDENTIFIED BY, komanda
GRANT,158
IF NOT EXISTS, 49
IGNORE
koma11da INSERT, 69
koma11da LOAD DATA
INFILE, 74
komanda UPDATE, 72
LIKE,49
LIMIT
komanda DELETE, 72
koma11da SELECT, 88-89
koma11da UPDATE, 72
LINES, komanda LOAD DATA
INFILE, 74
LOW PRIORITY
koma11da DELETE, 72
komanda INSERT, 68
koma11da LOAD DATA
INF/LE, 74
koma11da UPDATE, 72
ON, komanda GRANT, 158
ON DUPLICATE KEY
UPDATE, komanda
INSERT,69
ORDER BY
komanda DELETE, 72
koma11da SELECT, 87
komanda UPDATE, 72
redovi tabele, 57
QUICK, komanda DELETE, 72
RENAME, tabele, 57
REQUIRE, komanda GRANT,
159
' f'O, komanda GR.ANT, 158
WIIERE
km11a11da SELECT, 83-84
koma11da UPDATE, 72
.<fll>jevi, 94--95
WITII, komanda GRANT, 1S9
oduzimanje (-),operator, 110
ON DUPLICATE KEY UPDATE,
odredba, komanda INSERT,
69
opcija MAX ROWS,
optitnizovanjc tabela, St
OpenSSL, biblioteka, Web lokacija,
205
operatori
11 O
112
109
za poredenje vrednosti, 110-112
OPTIMIZE TABLE, komanda,
130, 230, 238
optirnizovanje
baze podataka
i11deksi, 229-230
iz bod pn" projektova11ju, 22 8
korna11da OPT/M/ZE TABLE,
230
prepon1ke, 227-228
izrada tabela, Sl
MySQL servera
parametri servera, 222-224
RAID diskovi, prepomka, 2 2 4
Solaris, 224
r;brzavanje, prevodet!ie i
povezivatife, 221-222
upiti
d11ev11ik sporih upila, 234--235
dodmxuife i11deksa, 238
koma11da ANALYZE TABLE,
238
koma11da EXPLAIN, 235-237
koma11da OPTIMJZETABLE,
238
meretife peiformaiiSi, 234
spori upiti, otkrivatife, 233
meha11izam
optimizovatifa upita, 237-238
OR, operator, 112
OS X, instaliranje MySQL-a na, 14
ostave, pranjenje, 182-183
otpornost na greke, replikovanje,
209
za replikovanje, 211
p
PACK KEYS, opcija,
optirnizovanje tabela, 51
parametri servera, tehnike
optirnizovanja, 222-224
password(), funkcija, 121
PASSWORD, opcija,
optirnizovanje tabela, 51
phpMyAdrnin, interfejs,
21
pid-file, opcija, podeavanje
MySQL-a, 173
podaci, grupno unoenje, 73-75
podeavanje MySQL-a
instaliranje, 14-16
internacionalizovanje, 17 4
konfiguracione opcije za vie
instalacija na iston1
173-174
mysqld, podeavanje opcija za,
171-172
opcije za lnnoDB, 172-173
reenje s datotekom opctja,
169 171
pod upiti
je rezultat jedna vrednost,
100-101
vrste, 99
za izraze tipa,101-103
za izvedene tabele, l OO
pokretanje
MySQL servera, 177-178
zavisnih servera, 214
popravljanje i proveravanje tabela
komanda CHECK TABLE, 196
komanda REPAIR TABLE 196
19S '
program myisamchk, 196-197
program mysqlcheck, 197
popravljanje My!SAM tabele, 130
s dokerskim znacima,
funkcija UKE, 115
poredenje s regularnim izrazima,
funkcija RLIKE, 115-117
sa opsegom vrednosti,
operatori za 112
possible_keys, vrednost, komanda
EXPLAIN, 236
power(), funkcija, 118
prava
doddjivanje, IS7
global11a prava, 160
prava za admi11istmtore, 159
prava za obil'11e 159
za pojedi11a1'11e baze podataka,
160
za pojedit1111'11e kolo11e, 161
za pojedi11abte tabele, 161
FILE, 203
prikazivanje podataka o, 181
PRO CESS, 203
tabele, 160,161
tabela colunms_priv, 164
tabela db, 163
tabela host, 163
tabela tables_priv, 164
tabela user, 1 62
ukidanje, 161
GRANT OPTION, 203
zasuta
global11a prava, 202
koma11da FLUSH
PR/V/LEGES, 202-203
opast1a prava, 203
veze sa serverom, 201
prava, za replikovanje, 211
preimenovanje tabele, 57
preklapanje na replikovanje,
217
prenosivost, My ISAM tabele, 129
pre nosni dnevnik, 21 O
pretraivanje
MyiSAM tabele,131-134
tekstualno pretraivanje, 131-134
PRIMARY KEY, rezervisana 49
principi projektovanja, baze
podataka
anomalije
NULL vred11osti, 34
pri auriraty'u podataka, 34
pri hrisanju podataka, J 4
fiti dm/m;wju p<>rlataka, JJ
normalizovanje
Boyce-Coddova twrmal11a forma
(BCNF), 38
dn<ga llormalllajorma (2NF),
36-37
prva (1 NF),
34--36
11ormalllajorma (3NF},
37-38
redundantnost i gubljenje
podataka, 33
vana pitanja, 32
pristup datotekama,
204
prljavi podaci, nivo izolovanosti
transakcija, 152
PROCESS, pravo, 160, 203
promenljive, podeavanje
serverskih, 182
prostor na disku, My!SAM tabele,
130
provera (testiranje)
instalacije MySQL-a, 16-17
rezervnih kopija, 19S
provera ulaznih podataka
u aplikacijama, 204
proveravanje i popravljanje tabela
komanda CHECK TABLE 196
komanda REPAIR TABLE, 196
19S
program myisamchk,196-197
program mysqlcheck, 197
prva normalna forma (1NF),
34-36
puni spojevi, 97
Q
QUICK, odredba, komanda
DELETE, 72
quote(), funkcija, 114
R
RAID diskovi, preporuka, MySQL
server, tehnike
optimizovanja, 224
RAID TYPE, opcija,
optimizovanje tabela, 51
rand(), funkcija, 118
range, vrednost, komanda
EXPLAIN, 237

replikovanje, 215
razlikovanje malih i velikih slova,
identifikatori, 43
RDBMS (relational database
management system), 31
read uncommitted, nivo
izolovanosti transakcija, 152
redovi
auriranje, 72-73
brisanje, 70-72
brisanje, komanda TRUN CATE
72
duplikati, 84-86
grupisanje, 86-87
tabela baze pod.u,tka, konnpu
i 31
H3- H4
umetanje u t.tbdu, !.S ()\1
zamenjivanje, 70
redundantnost i gubljenje
podataka, projektovanje baza
podataka, 33
ref, vrednost, komanda EXPLAIN,
236
REFERENCES, pravo, 160
relacije
definicija, 29
tipa ,j ceb n prema jedan", 29-30
tipa ,jedan prema vie", 29-30
ttpa "vie prema vie", 29-30
RELOAD, pravo, 160
RENAME, odredba, 57
REPAm TABLE, komanda, 130,
196
repeatable read, nivo izolovanosti
transakcija, 150
replace(), funkcija, 114
REPLACE, komanda, 70
REPLICATION CLIENT, pravo,
160
REPLICATION SLAVE, pravo,
160
replikovanje baze podataka
bezbednosne mere, 211
216
dnevnik izme na, 21 O
dodeljivanje prava za, 211
hijerarhijski organizovani glavni
serveri, 21S
kopije stanja, pravljenje,
212-214
otpornost na greke, 209
podeavanje zavisnih servera, 214
servera na 21 7
principi, 209-210
provera glavnog servera, 212
sloenije topologije, 21S
upotrebljive verzije MySQL-a,
210
viestruki glavni serveri, 217
zavisni serveri, pokretanje, 214
REQUIRE, odredba, komanda
GRANT,159
RESET, komanda, pranjenje
ostava, 182-183
RESTORE TABLE, komanda, 194
REVOKE, komanda, 161
rezervisane
ALL,102
ANY,I02
AUTO INCREMENT, 49
BINARY,III
EXISTS, 102
FOREIGN KEY, SO
FULL TEXT, SO
IN,IOI
!NDEX,50
PRI MARY KEY, 49
ROLLBACK, 146
SOME, 102
TEMPORARY, 49
UNIQUE, SO
UNSIGNED, 52
rczervia11e kun lchntlllklltnrl
43 l
RLIKE, lunkdjn, 11 117
ROLLBACK, rezt'rvhmrm l.ff1
root, nalog, lozinkn :ru, 17, lfP
round(), funkcija, II H
ROW FORMAT, opcija,
optimizovanje ta be l
rows, vrednost, kon1nndn
EXPLAIN, 236
RPM datoteke, instaliranje
MySQL-a iz, 12
izrada rezervnih kopija
i obnavljanje podataka,
193-194
s
sabiranje(+), operator, 110
sarnospojevi, 96
scripts, direktorijum, 20
Secure Sockets Layer (SSL), 205
SELECT, komanda
alija.1i, 82-83
kolone, 80
izrada tabela, S2
odredba DISTINCT, 84-86
odredba GROUP BY, 86-87
odredba HAVING, 87
odredba LIMIT, 88-89
odredba ORDER BY 87
odredba WHERE, 83..:_84
opti oblik, 80
primer jednostavnog upita, 80
tabele, 81-82
zadavanje baze podataka, 81-82
SELECT, pravo, 159
select_type, opcija, komanda
EXPLAIN, 236
serializable, nivo izolovanosti
transakcija, 150
serveri
glavni, u replikovanju, 209-212,
21S
MySQL
pokretarye i spt<ftatife, 177-17 8
prikazivatife podataka o procesimtl,
181
pdkazivatife statusa, 180
tehuike oplimizovatifa, 221-224
zavisni
pokretmife, 214
u replikovatifu, 209-21 O, 214
Services, prozor (Windows
Administrative tools), 179
SET, komanda
datoteke dnevnika, aktiviranje,
183
reim autocommit,
147
serverske promenUivc,
podeavanje, l !!2
SET, tip podataka, 54
shared-mcmory-ban-nnw,
opcija, podcJnvnllJt
MySQL-n, 173
SHOW, konmntln, ll, l Hil
SHOW DAT/\111\SI , l"'"''' l \1
1\1 IIIUI:II.)
show processlist, komanda, 181
show variables, komanda, 180
SHUTDOWN, pravo, 160
sistemi za upravljanje relacionim
bazama podataka (RDBMS),
31
skupovi znakova, podeavanje
MySQL-a,
internacionalizovanje, 174
Slashdot, Web lokacija, 135
Sleepycat, Web lokacija, 135
slow _queries, serverska
promenljiva, 180
SMALLINT, celobrojni tip
podataka, 52
socket, opcija, podeavanje
MySQL-a, 173
Solaris, preporuka, MySQL server,
tehnike optirnizovanja, 224
SOME, rezervisana 102
soundex(), funkcija, 114
spojevi tabela
desni spojevi, 98-99
dve tabele, spajanje, 93-95
jednakovredni, 97
levi spojevi, 98-99
puni spojevi, 97
samospojevi, 96
unakrsni spojevi, 97
vie tabela, spajanje, 95-96
sputanje MySQL servera, 177-178
sql-bench, direktorij um, 20
SQL-ove komande
CREATE DATABASE 43
CREATE TABLE, 44,48-52
DELETE, 70-72
INSERT, 65---<i9
REPLACE, 70
SELECT, 80-89
TRUNCATE, 72
UPDATE, 72-73
sqrt(), funkcija, 118
SSL (Secure Sockets Layer), 205
START TRANSACTION,
komanda, 147
MyiSAM tabele, 129-130
std(), funkcija, 122
STRCMP, funkcija, 115,117
struktura direktorijuma,
MySQL-ova, 19-20
subdate(), funkcija, 119
substring(), funkcija, 114
tum(), funkcija, 122
SUPER, pravo, 160
31

lemn, definicija, 32
t.1bcla columns_priv, 164
tabela tables_priv, 164
tabele db, 163
tabele host, 163
tabele user, 162
Jifrovanje lozinki, 203
T
tabele
BerkeleyDB (BDB), 50,135
grupno unoenje podataka, 73-75
HEAP,50,138
indeksi
jedrwkolonski, 229
levi kraj grupe, 229
229-230
vifekolomki, 229
lnnoDB,50
dosledno bez
zak(iu{avanja podataka, 13 4
tramakcije, 14 3-146
uslovi licence, 13 5
Web lokacija, 13 5
zak(iu{avanje podataka na 11ivou
reda, 134
ISAM,50
ogrmli{enja, 128-129
pregled, 128
izrada
komanda CREATE TABLE
44, 48-52 '
opcije za optimizovanje, 51
primer baze podataka employee,
44-48
kolone
datumski i vrememki tipovi
podataka, 5 4
tipovi podataka, 52-53
opcija unique, 50
podataka iz odredenih
kolo11a, 80
znakovni i tekstualni tipovi
podataka, 5 3-5 4
komanda ALTER TABLE 56
komanda BACKUP TABLE 194
komanda DROPTABLE 194
komanda FLUSH TABLES, 193
komanda LOCKTABLES, 193
komanda RESTORE TABLE
194
menjanje strukture, 56-57
MERGE, 136-137
MERGE, komanda FLUSH
TABLES,137
MylSAM,SO
129-130
komprimovane, 131
pobo(ifanja u odnosu rw ISAM
tabele, 129
poprav(imije, 13 O
pregled, 129
129-130
tekstualtw pretraivarije,
131-134
podrka za transakcije, 127-128
podupiti za izraze tipa,
101-103
podupiti za izvedene tabele, 1 OO
prava, 160,161
tabela cohmuiS_priv, 164
tabela db, 163
tabela host, 163
tabela tables_priv, 164
tabela user, 162
preimenovanje, 57
prikazivanje sistemskih podataka
o, 181-182
proveravanje i popravljanje
komanda CHECKTABLE, 196
koma11da REPAIR TABLE, 196
mogubwsti, 19 5
program myisamchk, 196-197
program mysqlcheck, 197
redovi
auriranje, 72-7 3
brisatije: 70-72
brismije komande
TRUNCATE, 72
duplikati, 84-86
grupisarije, 86-87
u{itavarije, 83-84
umetatije, 65-69
zamma, 70
spajanje
deSili spojevi, 98-99
dve tabele, 93-95
spoj, 97
levi spojevi, 98-99
ptmi spojevi, 97
samospojevi, 96
UllakrSIIi spojevi, 97
vife tabela, 95-96
tabele baze podataka, 31
tip merge, SO
podataka iz, 81-82
upiti je rezultat jedna vrednost,
100-101
188
tabele, podrka za transakcije
BerkeleyDB (BDB), 135
lnnoDB
dosled11o u{itavanje bez
zakiju{avarija podataka, 13 4
uslovi licettce, 13 5
l#b lokacija, 13 5
zak(iu{avmije podataka 11a 11il.<lu
reda, 134
tipovi tabela, 127-128
tabele prava, kolone
tabela db, 163
tabela host, 163
tabele user, 162
table, vrednost, komanda
EXPLAIN, 236
table_ cache, parametar, 223
tables_priY, tabela, prava pristupa,
164
i zarez (;),znak, 46
tekstualni i znakovni tipovi
podataka za kolone
BLOB,54
CHAR,53
ENUM,S4
SET,S4
TEXT,54
VARCIIAJ1..,54
tekstualno pretraivanje
133-134
MylSAM tabele, 131-134
TEMPORARY, rezervisana 49
TEXT, tip podataka, 54
threads_connected, serverska
promenljiva, 180
estam p(), funkcija, 119
ttmestamp, kolona, tabela
columns_priv, 164
TIMESTAMP, tip podataka, 55
TINYINT, celo brojni tip
podataka, 52
tipovi podataka, float, 48
TO, odredba, komanda
158
trajnost podataka, transakcije, 150
transakcije
definicija, 143-146
START TRANSACTION
komanda, 147 '
u lnnoDB tabelama, 143-146
ACID uskladerwst, 149-150
izolova11ost tramakcija, 150-152
reim autocommit, 147-149
normalna forma (3NF),
37-38
trim(), funkcija, 114
TRUN CATE, komanda, 72
type, vrednost, komanda
EXPLAIN, 236
u
ubrzavanje MySQL servera,
221-222
mehanizam
optirnizovanja upita, 237-238
funkcije/operatori, 109
ukidanje prava pristupa, 161
umetanje novih redova u tabelu
65-<i9
unakrsni spojevi, 97
UNION, opcija, optirnizovanje
tabela, 51
UNIQUE, rezervisana SO
UNLOCK TABLES komanda,
148-149
UNLOCK TABLES, komanda, 191
UNSIGNED, rezervisana 52
UPDATE, komanda, 72-73
UPDATE, pravo, 159
upiti
dnevnik, 183
komanda SELECT, 80
optimizovanje
drtev11ik sporih upita, 234-235
dodava1ije i11deksa, 238
kommtdaANALYZE, 238
koma11da EXPLAIN, 235-237
komm1da OPTIMIZETABLE
238
meretije peiformami, 234
spori upiti, otkrivatije, 233
111eluwizam
optimizovmija upita, 237-238
podupiti
je rezultat jed t ta vredttost,
100-101
vrste, 99
za izraze tipa, 101-103
za izvedeue tabele, 1 OO
spojevi tabela
deSili spojevi, 98-99
97
levi spojevi, 98-99
ptmi spojevi, 97
samospojevi, 96
spajanje vife tabela, 95-96
unakrSIIi spojevi, 97
uppercase(), funkcija, 114
uptime, serverska promenljiva, 180
USAGE, pravo, 159
use, komanda, biranje baze
podataka, 43
user, opcija, podeavanje
MySQL-a, 172
user, tabela, prava pristupa
kolone za upotrebe
resursa, 162
kolone za opseg vidljivosti, 162
kolone za prava, 162
kolone za uspostavljanje
veze, 162
podataka, transakcije,
150
uslovi licence, InnoDB tabele, 135
uspostavljanje veze s bazom
podataka
MySQL, testiranje, 16-17
SSL (Secure Sockets Layer), 205
zatita servera, 201
v
tip podataka, 54
vece od(>), 111
viekolonski indeksi, 229
viestruki glavni serveri,
replikovanje, 217
vremena, funkcije za rad s
datumima i vremenima
119-120
vremenski tipovi podataka za
kolone, 55
w
Web lokacije
activestate.com, 235
Google,135
lnnoDB,135
OpenSSL, 205
Slashdot, 135
Sleepycat, 135
Yahoo!, 135
WHERE, odredba
komanda SELECT, 83--84
komanda UPDATE, 72
spojevi, 94-95
Windows 1\<loululoltll 1
prozor l IM
Windows, lm! olhoonf 1\h 1
na,12-14
WITH, odredbu, kmmu11lt
GRANT, 159
WITH GRANT 1'' 1' 11 IN,
odredba, komandu l .ll i\ N 1
159 l
WITH GRANT OP1'10N, l"" .,,
160,203
X
XOR, operator, 112
y
Yahoo!, Web lokacija, 135
YEAR, tip podataka, 55
z
podataka na nivou
reda, lnnoDB tabele, 134
podataka na nivou
stranice, BerkeleyDB (BDB)
tabele, 135
tabela, 188
zamena redova, 70
zapisi, tabele baze podataka,
. koncepti i terminologija, 31
zastlta
instalirane datoteke
jiltrirmije podataka, 204
zaftita, 205
preporuke, 203
pristup i prava upotrebe, 204
provera ulaz11ih podataka u
aplikaciji, 204
SSL (Secure Sockets Layer), 205
nalozi
mwuinmi nalozi, brisanje,
202-203
lozi11ka za 11alog root, 202
opas11a prava, 203
!ifrovatije lozi11ki, 203
sistem prava pristupa
veze sa serverom, 201
sistema pri replikovanju, 211
zavisni serveri
pokretanje, 214
u replikovanju, 209-210,214
zlonamerni korisnici, zatita, 205
znakovni i tekstualni tipovi
podataka, 53-54
LIKE, funkcija, 115
MATCH,funkcija,115
obrada znakovnih vrednosti, 11 4
RUKE, funkcija, 115
STR CM P, funkcija, 115, 117
zvezdica (*),znak, 116

You might also like