Professional Documents
Culture Documents
(http://www.aydinmahmut.com/)
22773 okunma 2
6 Yorum (http://www.aydinmahmut.com/mysql-programlama-icin-performans-
ipuclari/#comments)
Merhaba arkadaşlar bu dersimde sizlere önemli makalelerden birini daha paylaşacağım .MYSQL için
1-Sistem Performansı
Öncelikle sisteminizi kuracağınız makinanın RAM ve İşlemci özelliklerini elinizden geldiğince
kullanmanız daha iyi sonuçlar verebilir.Bunun için hangi sürümün en hızlı olduğunu takip
– InnoDB
– Berkeley DB
– MyISAM
– HEAP
– MERGE
– ISAM
MySQL her iki tür işlemi de desteklediği için kullanıcı,uygulamasında atomik işlemlerin hızına
mı yoksa transaction özelliklerine mi ihtiyacı olduğuna karar verebilir. Seçimler tablo bazında
yapılabilir.
Transaction’lı tablo ile atomik işlemle çalışan tablo arasındaki enbüyük fark performans
konusunda oluşur. Transactionlı tablolar çalışırken daha fazla bellek, daha fazla disk alanı ve
daha fazla işlemci gücü harcar.Başka bir pencereden bakacak olursak, sürekli “UPDATE”
yapılan veriler için farklı,sürekli “INSERT” yapılacaksa farklı bir tablo yapısı olmalıdır.Daha
INSERT eder fakat veri sayısı arttıkça çok yavaş SELECT yapar.4GB’lık veri boyutundan
sonra select sorgularında verim çok fazla düşer.Ayrıca metin alanlarını indexlemek için
kullanılan full text index yapısını kullanmak için bu tablo yapısına ihtiyaç duyarız.Bu tablo
olmasının yanısıra bir çok kötü özelliğe sahiptir.Bunladan biride yapılan her UPDATE komutu
yapının sırasını bozacaktır ve SELECT sorgularında performans düşecektir.MYISAM ile
etmemiz gerekir.
Kötü özelliklerden bir diğeri de windows sunucuda çalışıyorsa çok güvenli olmayışıdır.Myisam,
text bazlı yapıya sahip olduğu için server üzerinde oluşabilecek aksaklıklardan dolayı tablo
yapısında bozulma olasılığı yüksektir.
*INNODB:Kayıt girilirken MyISAM gibi bütün tabloyu kitlemezler. Bu tip veritabanları özel
transaction fonksiyonlarınıda (basit olarak locking, begin ve commit olayları) çalıştırmanızı
sağlar.Sürekli UPDATE işlemleri yapılacak projelerde ve veri sayısının fazla olduğu yerlerde
performans artışı için kullanılır.Bu durumlarda BERKELEYDB tablo yapısıda kullanılabilir.Bu
iki tablo yapısının da transaction desteği vardır.İyi ve performanslı tablo yapıları olduğu için
bu iki tablo yapısını da ORACLE firması satın almış ve kendi bünyesinde geliştirmektedir.
değildir.
*MEMORY:Bazı durumlarda verinin çok hızlı gelmesi gerekir.Mesela session bilgilerini veri
sakladığından ,fiziksel bellekle doğrudan bağı olmadığından hızlı bir şekilde çalışır.Dikkat
edilecek diğer bir hususta oluşturacağımız RAM miktarıdır.RAM boyutu 16MB’dır.Ama RAM
miktarı ayarlanabilir.
*CSV:excel kullanımı ile ilgili bir tablo yapısıdır.
Aslında 10 dan fazla tablo yapısı vardır ama tablo yapıları konumuz değil,onun için daha fazla
anlatmaya gerek yok.Sadece projemize uygun tablo yapısı seçmemiz önem arzeder.
Bir tablonun yapısını öğrenmek için
1 DESCRIBE `tablo_adi`;
kodlarını kullanabilirsiniz.Çıktı olarak her alanın adını, türünü, null olup olmadığı, indeks türü
gibi değerler döner. Kaç alanınız var ise o kadar satır çıktı alırsınız.
kodlarını kullanabilirsiniz.
TINYINT Çok küçük nteger S gned tanımlı durumda ken alab leceğ değerler –128 le 127
SMALLINT Küçük nteger değerler S gned tanımlı durumda ken alab leceğ değerler –32768 le 32767
MEDIUMINT Orta büyüklüktek nteger S gned tanımlı durumda ken alab leceğ değerler –8388608 le 8388607
INT orNormal büyüklüktek S gned tanımlı durumda ken alab leceğ değerler –2147483648 le
arasındadır.
BIGINT Büyük nteger değerler The s gned range s –9223372036854775808 to 9223372036854775807. The
ç nd r.Uns gned olarak kısmı(v rgül önces ) atanmamışsa ya da 24 basamaktan küçük veya eş tse <=
PRECISION, number. Cannot be arası. Eğer sayının onluk kısmı(v rgül önces ) atanmamışsa ya da onluk
REAL uns gned basamak sayısı 25 ve 53 arasında ya da 25 veya 53’e eş tse bu b r double-
DATE Tar h Desteklenen aralık ‘1000-01-01’ le ‘9999-12-31’ arasıdır. MySQL tar hler
DATETIME Tar h ve zaman Desteklenen aralık ‘1000-01-01 00:00:00’ le ‘9999-12-31 23:59:59’ arasıdır.
TIMESTAMP Zaman damgasıı Desteklenen aralık ‘1970-01-01 00:00:00’ le 2037 yılında herhang b r zaman
YEAR 2 ya da 4 basamaklı yıl 4 basamaklı yıl b lg s nde değer aralığı 1901 le 2155 arasındadır. 2 basamaklı
CHAR A f xed-length str ng that Maks mum 255 karakter barındırab l r. Tekrar eden boşluklar değer alındığı
w th spaces to the değerler büyük-küçük harf duyarlılığı olmadan sıralanır veya karşılaştırılırlar.
stored
VARCHAR A var able-length str ng. Maks mum 255 karakter barındırab l r. VARCHAR değerler BINARY anahtar
Note: Tra l ng spaces aresözcüğü ver lmed ğ takd rde büyük-küçük harf duyarlılığında sıralanır veya
TINYTEXT
TEXT
MEDIUMTEXT
LONGBLOB, 4294967295 karakterl b r BLOB ya da TEXT ver s
LONGTEXT
ENUM An enumerat on Değer l stes nden seç leb lecek her b r maks mum 65535 karakterl str ng
değerler tutab l r.
Erkeklerin sayısı 150 olsun.1.sınıfta ki öğrenci sayısı ise 60 olsun.Şimdi bu öğrenci kayıtlarının
arasından cinsiyeti erkek ve 1.sınıfta okuyan öğrencileri isteyelim.İlk WHERE şartında 1.sınıf
öğrencilerini,ikinci WHERE şartında ise cinsiyetini istememiz daha performanslı olur.Neden
derseniz ilk önce 300 kayıt içinde 60 kayıt bulacak daha sonra 60 veri içinden erkekleri
seçecek.Yani(önce 300 kayıt içinden ,sonra 60 kayıt içinden seçecek).Diğer türlü 300 kayıt
içinden önce erkekleri seçecek,daha sonra erkek olan 150 kayıt içinden 1.sınıfları
seçecek.Yani(önce 300 kayıt içinden seçecek,sonra 150 kayıt içinden seçecek).İlk sorgu daha
performanslı olur.
sadece iki tabloda da eşleşen kayıtlar varsa getirir.Eğer sadece eşleşen kayıtlar işinize
yarayacaksa INNER JOIN kullanın.
6-Sorgularda Lokal Değişkenler Kullanmak
Gerek temiz kodlama açısından gerekse iyi yönetilebilirlik ve performans açısından olsun
1 $tarih = date("Y-m-d");
2 $sorgu = mysql_query("SELECT username FROM user WHERE signup_date >= '$
Curdate() gibi sonucu belli olmayan fonksiyonlar kullanıldığı zaman query cache devreye
girmiyor.
7-Resim Saklamak
Web üzerinde yazılım geliştirirken, resimleri veritabanında tutmaktansa, dosya sisteminde
resim dosyası olarak tutup, veritabanına sadece resmin nerede olduğunun bilgisini
bulundurmaya çalışın. Bir web sunucusu dosya cache’leme konusunda, veritabanı bilgisi
cache’lemekten daha başarılıdır. MySQL’in resim üzerinde arama yapma ve benzeri özellikleri
olmadığından, pratikte resmi veritabanında saklamanızın da bir anlamı yoktur.
8-EXPLAIN kullanmak
Çoğu zaman karmaşık sorgular için “explain” kullanmak performansı artırabilir. Bunun sebebi
EXPLAIN komutunun sorguları hızlandırması değil, sorgunun nasıl yapıldığını göstermesi. Bu
sayede sorgunuzu gerektiği gibi optimize edebilirsiniz.
9-Özgün sonuçlarda LIMIT 1
Belirli durumlarda tek bir özgün sonuç arıyor olabilirsiniz. Ya da sadece WHERE koşullarına
uygun kayıtlar olup olmadığını kontrol ediyor olabilirsiniz. Her iki durumda da LIMIT 1
kullanmak sorgu hızını arttırabilir.
1 // daha iyisi
2 $r = mysql_query("SELECT * FROM user WHERE sehir = 'Istanbul' LIMIT 1"
3 if (mysql_num_rows($r) > 0) {
4 // ...
5 }
10-Server Özelliği
MYSQL, Linux altında daha hızlı bir performans sergilemektedir,buna dikkat etmek
gerekir.MYSQL veri tabanı ile birlikte PHP dili kullandığınız bir projenizi Apachi değilde IIS
üzerine kurarsanız hız performansı unutun derim.Ama ben IIS üzerinde de aynı performansı
yakalayabilecek ipuçları biliyorum diyen biri varsa bizimle paylaşırsa memnun olurum.
11-VIEW Kullanamak
Sıklıkla kullandığımız sorguları VIEW kullanarak yaparsak daha performanslı sonuçlar elde
edebiliriz.
View Nedir : Sorguları basitleştirmek , sorgu sürelerini kısaltmak ve sistemin daha
performanslı çalışmasını sağlamak için kullanılan sanal tablodur.VIEW sanal bir tablo olarak
işlem yapar,ancak bu sanal tabloyu daha önceden oluşturmamız gerekir.Mesela sıklıkla
kullandığımız bir sorgu olsun ve biz bu sorgunun VIEW‘ını oluşturalım.
Bu sorguyu daha performanslı hale getirmek için bir isim verip, VIEW oluşturalım.Kodlar şu
şekilde olacak: