Bir baska soru
ise birden fazla tabloda ayni anda arama yapmak? Iste indeks
islemi ile gelen bir baska nimet de budur.Indeksleme yapilmadan
iliskisel veritabani veya tablolarda arama gibi islemler,gelismis
sorgular ile yapildiginda uzun zaman alacaktir ve temel olarak
bunu yapmak kotu bir programcilik uygulamasidir.
Ornek vermek gerekirse, iki tablomuz oldugunu ve bu tabololarin
herbirinde yanlizca 500 adet satir oldugunu varsayalim.Boyle
bir durumda yapilacak arama islemi icin veritabani yonetim
sostemi 250.000 olasiligida (kombinasyonu) da denemek zorundadir.
Indekslenmis bir tabloda ise veritabani yonetim motoru ilk
tablonun indeksini kontrol ederek,yanlizca ilk tablodan aranilan
kayitlari belirler.Ardindan ikinci tablodan bu kayitlara gore
gene inkinci tablonun indeksini kullanarak istenilen kayitlarin
cikarilmasini saglar.
Bir baska deyisle indekslenmis veritabani tabolarinda kayitlari
boyle “elinizle tutup” cikarir gibi islem yapabilirsiniz.
Kendi ajandanizin fihristini dusunun.Ornegin “Serkan Ceylani”
isimli kisinin telefonuna ulasmak icin cevireceginiz ilk sayfa
“S” ile baslayan kayitlarin yer aldigi sayfa olacaktir.Eger
hepsi karmasik olarak ,belirli bir siraya gore yazilmamis
olsaydi benim ismimi nasil bulabilirdiniz? Tabii ki butun
kayitlari deneyerek :)
Primary Key (birincil anahtar) ozel bir indeks’tir.Bu
ozel konuyu yazi dizimizin ilk makalesinde ele almis ve oldukca
detayli olarak aciklamistik.Biraz daha ek bilgi vermek gerekirse,
her iliskilendirilmis tablo bir adet (ve yanlizca bir
tane) primary key olarak belirlenmis alana sahip olabilir.Bu
alan tablodaki kayitlari tanimlayabilmek icin kullanilan bir
anahtardir.Kisaca her kaydin ID’si yani kimligidir.Nasil sizin
10 tane kimliginiz yoksa/olamiyorsa MySQL veritabani tablolarinda
da birden fazla alan Primary Key olarak tanimlanamaz.
Son bir soz soylemek gerekirse bu konu ile ilgili, indeksler
ve primary key’ler tablodaki alanlarin kombinasyonlarindan
da turetilebilir.(Bu tur turemeler yapilsa bile primary key
alanindaki veriler halen biricik (unique) olmak zorundadir.)
Indeksler bu kadar fazla performans artisi sagliyorsa,oldukca
fazla kullanilmalidir mantigi hatalidir.En yuksek performansi
almak icin birden cok indeks tanimlamak dusuncesi yanlistir.
Bunun temel nedeni indekslerin tablolarda arama yapmak veya
kayitlarin web sayfalarinda goruntulenmesi icin veritabanindan
dondurulmesi islemlerinde faydali ve hizli olmasina ragmen,kayitlari
eklemek veya guncellemek sirasinda karsimiza dezavantaj
olarak cikacaklardir.Bir baska neden ise tablonun hacmini
(dosya boyutunu) genisletmeleridir.
Indekslenmis bir tabloya veri eklerken veritabani o verinin
uygun olacagi satiri secmek icin bir takim islemler yapacaktir.Hesabini
siz yapin :)
Eger birden fazla indeks’e sahipseniz bu gibi durumlar icin
gececek islem suresi de artacaktir.
Gereksinim duyulandan daha fazla indeks yaratilmamalidir.Gerek
duyuldugunda ise yanlizca veritabani performansini arttirmak
icin bir secenek olarak gorulmelidir.
Ozet : Halen indeks nedir diye bir soru soruyorsaniz
biraz daha anlatmak istiyorum.Indeksler bir tablodaki fihristler
gibidir.Bir tablo alanini indeks olarak sectiginiz zaman ornegin
“adi” alanini secelim, bir kayidi bu tabloda bulmak istedigimizde
veritabani motoru bu indeksi kullanarak “serkan” icin ismi
“s” ile baslayan kisilerin bulundugu alandan itibaren kayitlari
arayacaktir.
Tablonuzda isterse milyonlarca kayit olsun yanlizca “s” ile
baslayanlar arasindan ornegin 500 kayidin aranmasi sonucunda
ilgili kayit bulununabilir.Bu sekilde indeks alanlarini nasil
belirleyebilcegimizi yazinin ilerleyen kisimlarinda goreceksiniz.
Sorgular
SQL yapi ve komutlari iliskisel veritabanlarinda “sorgu” gerceklestirmek
icin kullanilir.Hazirladiginiz uygulama veritabanina bu komutlar
ile sorular sorar.Bu sorularin cevabi veritabani
motoru tarafindan programa dondurulur.
Dondurulen bu bilgi, istenilen sartlara uyan (SQL yapilariyla
istedigimiz sartlari biz belirliyoruz…) ve secilen tablo
alanlarina iliskin kayitlarin yer aldigi kayitlar
dizisidir.
Burada neden alti cizili olarak “kayitlar dizisi” lafini kullandik?iste
isin tum anafikiri burada.Lutfen cok iyi anlamaya calisiniz.
“PHP ve diger bir cok programlama dilleri bir veritabanindan
donen sonuc dizisine, kendi icinde olusturulmus bir dizi gibi
davranir.Bu baglamda ici veri yuklu olarak donen bu dizileri
programimiz icerisinden herhangi bir zorlukla karsilasmadan
herhangi bir “dizi degisken” gibi kullanabiliriz.”
Donen bu sonuc dizisine “sonuc seti” ismi verilir.Bu sonuc
seti sizin sordugunuz soruya veritabaninin verdigi cevaptir.
Ornegin veritabaninda ilk ismi “serkan” isimli bir kayidin
olup olmadigina iliskin bir soru soruldugunda bu kayida iliskin
verilerden, “sectigimiz alanlarla” ilgili olanlar dondurulecektir.Eger
herhangi bir kayit bulunmaz ise NULL sonucu donecektir.
Null kavramina birazdan bakacagiz.
Bazi SQL komutlari ise veritabanina birseyler sormak yerine,
veritabanina bir gorevi yaptirmak icin kullanilirlar.Ornek
vermek gerekirse:
“Serkan ilk isimli kayida ait tum satiri, veritabanindan SIL”
Bu tip SQL komutlari veritabanindan herhangi bir sonuc
seti dondurmezler.
NULL
Asagidaki senaryolari inceleyin :
Okuldaki ogretmen
yaptigi testin sonuclarini test devam ederken bilgisayarindaki
veritabanina girmek istiyor.Halen sinav devam ediyor ama oldukca
fazla test sonucu hazir.Veya bazi alanlari cocuklar once doldurdular
ama hocamiz yavas yavas bilgisyara girmek istiyor.Bu durumda
ornegin cocuklarin bazilari matematik testini bazilarida fizik
testini bitirdiler…
Bu durumda daha girilmesi beklenen veriler oldugu aciktir.Bunu
veritabaninina nasil anlatabiliriz?.Ongurulen degerler girmek
gordugunuz gibi urada cocuklara haksizlik olacaktir.
Oyle bir veritabani
hazirliyorsunuz ki kuslar hakkinda, veritabanindaki bir alan
kuslarin hizi ile ilgili.
Tam penguenin kaydini girerken farkediyorsunuz ki “penguen
ucamaz !” dolayisi ile bir ucus hizi da yoktur.
Bu durumda tablonun bu alanina penguen icin ne girebiliriz?.
Iki durumda da ortada tabloya girebilecek bir veri yoktur.Fakat
aralarinda cok onemli bir fark vardir.
“Birinci durumda veri bir sureligine yani gecici olarak
tablodan eksiktir.” Cunku hocamiz sinavin tamami bitince
kensidisine ulasan verilerin hepsini veritabanina girecektir.
“Ikinci durumda ise veri tablodan sonsuza kadar eksiktir.”
Cunku penguenler ucamaz.
Iste bu tip durumlarda verinin tablonun o alanindan “eksik”
oldugunu belirtmek icin NULL girisi kullanilir.
MySQL tablolarinda Null girisi tablodaki o alanda verinin
eksik oldugunu gostermek icin kullanilir.Null belirli bir
veri tipine ait degildir.Fakat NULL belirli olan herhangi
bir veri tipine ait bir veri ile degistirilebilir.Null bir
veri veya veri tipi degildir.Fakat boyle olmasina karsin
alanda bir giris olarak konumlandirilabilir.
Deneyimsiz bilgisayar kullanicilari veya programcilari NULL
ifadesini “sifir” zannetmektedir.Oysaki sifir bir degerdir.NULL
bir deger degildir.
NULL bir veya iki bosluk string veri zannedilmektedir.Veya
sifir uzunlukta string gibi dusunulmektedir.String en basta
bir veri tipidir.NULL degildir.Sonra bosluk ta bir veridir.NULL
degildir.
“NULL hicbirseydir.” yanlizca herseyle ( herhangi bir veri
tipine ait herhangi bir veri kastediliyor.) degis tokus
edilebilir.
NULL bir veri veya veritipi degildir.
Peki bu kadar anlatimdan sonra bir seyi dusunmeye baslayalim:
Ya sorgu sonucundaki bir alanda null degeri varsa ne olacak.Bu
durumda bu deger ile yapilacak aritmetik islemlerde onem
kazaniyor zira donen sonuc ile ilgili islemler yapiliyor
olabilir.
Altin Kural : Null iceren herhangi bir aritmetik islem
gene Null sonucunu dondurur.
Bu mantiklidir cunku islemi yapmak icin gereken verinin
kendisi zaten oratada yoktur.Yani “sonucumuz” da “hicbirsey”
olacaktir.
NULL degerinin sifira bolumu gene NULL dondurur.
NULL kelimesinin Turkceye tersumesi ise “gecersiz” dir.
Sorgu Komutlari
MySQL veritabani icindeki verileri yonetmek icin asagidaki
ana komutlar kullanilabilir:
SELECT : Veritabanindan
verileri almak icin kullanilir.
DELETE : Veritabanindan
verileri silmek icin kullanilir.
INSERT : Veritabani
icerisine verileri eklemek icin kullanilir.
REPLACE : Veritabanindaki
verileri degistirmek icin kullanilir.Eger ayni veri
varsa tabloda, bu komutla yeni veriler eskilerin uzerine yazilir.
UPDATE : Tablodaki
verileri guncellemek icin kullanilir.
Geriye kalan ana komutlar ise veri’den cok veritabani yapilarini
olusturmak veya duzenlemek icin kullanilir.
CREATE : Veritabani,tablo
veya indeks yaratmak icin kullanilir.
ALTER : Tablo
yapisini duzenlemek icin kullanilir.
_DROP : Veritabani
veya Tabloyu yok etmek icin kullanilir.
Tpik bir SQL Select sorgusu asagidaki gibidir.
mysql > SELECT soyadi, adi FROM kullanicilar WHERE
adi = ‘serkan’;
Ilk bahsedecegimiz konu sorgunun sonladirilmasi icin “;”
noktali virgulun kullanilmasi zorunlulugudur.Ayni PHP de
oldugu gibi burada da sonlandirma noktali virgul ile yapiliyor.
Sorgular birden fazla satirda icra edilebilir.Yukaridaki
ornek sorguyu asagidaki gibi de yazabilirdik :
mysql > SELECT soyadi, adi
-> FROM kullanicilar
-> WHERE adi=’serkan’;
Simdi burada gecen FROM ve WHERE yancumlelerine bakalim.FROM
turkcedeki “den/dan” ekine karsilik gelir.WHERE ise “nerede”
anlamindadir.
Bu durumda yan cumleler kullanarak olusturdugumuz sorgunun
acik kelilmelerle olan hali soyl olacaktir:
“kullanicilar tablosunda adi alaninda serkan yazan butun
verileri dondur.”
Ornek bir cikti su sekildedir
Ceylani Serkan
Altunergil Serkan
Oner Serkan
Simdi de MySQL ile biraz oyun oynayalim ve ince noktalarini
ogrenelim :)
MySQL istemci programi ile calismak
Simdi sizlere “mysql” isimli bu veritabani istemci programi
ile calismanin inceliklerini gosterecem.Bu program ile veritabani
uzerindeki sorgulari kolaylikla gerceklestirebiliriz.Ilk
once birkac kucuk oyun ve ardindan “kullanici izinlerine”
giris yapacagiz.
mysql istemcisi nasil calistirrilir?
Linux kullanicilari komut satirindan asagidaki komutu giriniz.Windows
kullanicilari MySQL kurulumunda bu programin oldugu dizine
gecip asagidaki komutu giriniz : ( > isareti komut satirini
temsil etmektedir.Bu isaretin komut ile bir ilgisi yoktur.)
> mysql -uUSER –pPASSWORD -hHOST
Buyuk harfle yazilan USER,PASSWORD ve HOST argumentlerini
kendi kisisel degerleriniz ile degistiriniz.Ornegin sizin
veritabani kullanici adiniz “phpuser” ve sifreniz de “phppass”
ise komut su sekilde olmalidir :
> mysql -uphpuser –pphppass –hlocalhost
Bu komuttaki butun argumentler istege baglidir.Hic bir sey
girilmediginde ongorulen degerler olarak :
-u sizin kabuk
kullanici adiniz veya login adiniz.
-p sifre yok
-h localhost
“mysql” isimli istemci programi artik veritabanina verilen ID/Sifre
degeri ile baglanmistir.
Asagidaki gibi bir ekrani goruyor olmaniz gerekmektedir :
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10 to server version : 3.22.32
Type ‘help’ for help.
mysql>
Eger “mysql” baglanti saglanmiyor diye bir mesj veriyorsa
verdiginiz kullanici adi ve sifresinin dogrulugunu kontrol
ediniz.
Kullanmak icin veritabani secmek
Server’da hazir bulunan veritabanlarini listesini gormek icin
SHOW DATABASES komutunu giriniz.
mysql> SHOW DATABASES;
Database
mysql
test
2 rows in set (0.00 sec)
Yukarida bu komutun kullanilmasini ve ciktisini izlemektesiniz.
mysql istemci programi bize iki tane veritabani oldugunu,bunlarin
isimlerinin mysql ve test oldugunu, (2) adet sonuc satirinin
donduruldugunu ve bu sorgu icin gecen zamanin (0.00 saniye)
surdugunu bildirdi.
Bir veritabanini secmek icin USE veritabani_adi yapisini kullanalim
:
mysql> USE mysql;
Database changed
Windows makinelerde buyuk/kucuk harf ayrimi yapilmamaktadir.Bu
nedenle USE MYSQL gibi bir komut ta ayni sekilde mysql isimli
veritabaninin kullanilmasini saglar.
Linux ta durum oyle degildir ve mysql,MYSQL veya MySQL hepsi
farkli veritabanalarina isaret eder.Gene eyni sekilde tablo
alanlarinin isimleri Linux’ta buyuk/kucuk harfe duyarli iken
Windows makinlerde durum boyle degildir.
Alin size windows kullanmamak icin bir baska neden :)
Bir sonraki yazimizda kullanici izinleri konusuna deginecek
ve bir ornek kullanici yaratip o kullaniciyi yetkilerle donatacagiz…
Kalin saglicakla
Serkan Hadi Ceylani
serkan@turk-php.com
|