PHP-MySQL Optimizasyonu
8 Mayıs 2006 tarihli, Programlama köşesine ait yazı.
MySQL sorguları ve PHP kodlarınızın performansını artıracak bazı önemli noktalara değiniyorum. Bu yazı Simple Optimization for PHP and MySQL yazısının çevirisidir.
MySQL
- MySQL sorguları sağdan sola işlendiği için özel seçimlerinizi (primary key gibi) en sağa yazın.
- Tüm alanları seçmek yerine (
SELECT *) yalnızca kullanacağınız sütunları seçin (SELECT a, b, c). - Çok nadir değişen bilgileri veritabanına koymak yerine bir dosyaya yazın.
- Seçmek ve sıralamak istediğiniz (
WHEREveORDER BY) alanlar için index kullanın. - Index‘ler aramalarınızı çok hızlandırır, ancak yeni kayıt girişini yavaşlatır (insertion).
- Index’lerinizi analiz etmek için
EXPLAINkomutunu kullanın. - Yaptığınız aramada yalnızca 1 girdiye ihtiyacınız varsa her zaman
LIMIT 1kullanmalısınız. Böylece MySQL istediğiniz girdiyi bulduğu anda aramayı durdurur. - Eğer sonuçlarınızı
$girdi = mysql_fetch_array($sorgu)
şeklinde alıyorsanız verilere iki şekilde ulaşabilirsiniz:
$girdi[0]ve$girdi['sütunismi']. Sütun numarasıyla verilerinize ulaşmıyorsanız ekstradan boşu boşuna bir$girdi[int i]array’i oluşturuyorsunuz demektir. Sadece$girdi['sütunismi']şeklinde verilerinize ulaşıyorsanız$girdi = mysql_fetch_assoc($sorgu)kullanın.
- Bazen
mysql_free_result()kazandırdığından fazla bellek kullanın. Farkımemory_get_usage()ile kontrol edin. - Veritabanından sürekli aynı bilgileri istemeyin, gerekiyorsa sonucu değişkenlere kaydedin.
- Verilerinizi olabildiğince
NOT NULLtanımlayın. Hem her veri başına 1 bit kazanacak, hem de işleminiz hızlanacaktır. - Verinize uygun türü seçin. Örnek olarak
INTunsigned olarak 4294967295′e kadar sayıları tutar, ki bu çoğu zaman çok büyüktür. UygunsaMEDIUMINTveyaSMALLINTkullanın. - Tabloya veri eklerken öntanımlı değerleri kullanın, yalnızca öntanımlıdan farklı değerleri belirtin.
PHP
- Birçok blok kullanmak uygulamanızı yavaşlatır.
Hızlı:
< ?
...
...
...
?>Yavaş
< ? ... ?>
< ? ... ?>
< ? ... ?>(1) şeklinde bir kod genelde (2)’den hızlı çalışır.
- Gerekmediğinde string birleştirmeyi (concatenation) kullanmayın.
Hızlı:
“SELECT id FROM tabell WHERE id = $_SESSION[id] LIMIT 1″Yavaş
“SELECT id FROM tabell WHERE id = “.$_SESSION[’id’].” LIMIT 1″ - String’lerinizi çift tırnak (”) yerine tek tırnakla (’) açıp kapatmanız uygulamayı biraz hızlandırabilir. Php “…” içindeki değişkenlere bakarken ‘…’ içindeki değişkenleri önemsemez. Tabii ki bunu string içerisine değişken yazmak istemediğinizde kullanmalısınız.
- String’leri ve değişkenleri
echoile bastırken nokta (.) yerine virgül (,) kullanmak daha hızlıdır. Örnek:echo “bir degisken” , $degisken, “yaziyor…”;Not: Bu yalnızca birden fazla string parametresi alabilen
echofonksiyonu için geçerlidir. echo,print‘ten hızlıdır.fordöngüleriniz için üst limiti döngüden önce bir değişkene atıp kullanmak her turda bu sayının tekrar tekrar hesaplanmasını engeller:Hızlı:
$maxvalue = 100/10;
for($i=0; $i<$maxvalue; $i++){
// kodlar
}Yavaş:
for($i=0; $i<100/10; $i++){
// kodlar
}- İşiniz bittiğinde değişkenlerinizi ve özellikle büyük array’lerinizi
unset()kullanarak belleğe geri döndürün.
Son söz ve kaynaklar
Mümkünse her veritabanı güncellemesinden sonra veya belli zaman aralıklarında statik html dosyaları oluşturmak tabii ki en iyi optimizasyon olacaktır.
Daha detaylı bilgi için aşağıdaki adresleri ziyaret edebilirsiniz:
- Simple Optimization for PHP and MySQL
- Choosing right data type
- Optimizing Queries with EXPLAIN
- Other Optimization Tips
- A HOWTO on Optimizing PHP
Yorumlar - Başa Dön
9 Mayıs 2006
elinize sağlık Onur bey çok iyi bir makale olmuş bu. birçok coder’in yazarken hiçbir sakınca görmediği kod bölümlerinde aslında performans artışı yapılabileceğini gördük. özellikle kendi adıma çok kullandığım for (kısa for döngüsü örnekte sistem kaynağını yavaşlatan olarak gösterilen) döngüsünde belirttiğiniz gibi bir kod yazımını bundan sonra benimseyeceğim.
tekrar teşekkürler…
13 Ağustos 2006
Gerçekten faydalı şeyletr var güzelll
10 Eylül 2006
Güzel ve faydalı bir yazı olmuş. Teşekkürler.
3 Nisan 2007
iki gündür optimizasyon yapıyorum.sitemin cpu kullanımı hosting firmasının izin verdiği sınırları fazlasıyla aşıyor.umarım optimizasyon sonucu siteyi kapanmaktan kurtabilirim. “Bazen mysql_free_result() kazandırdığından fazla bellek kullanın. ” demişiniz,burdaki kullanın kullanır mı olacaktı? yani mysql_free_result() ı kullanmayalım mı? bir de mysql_pconnect ile mysql_connect arasında ki farklar nelerdir?mysql_pconnect ile mysql_close u kullanmaya gerek var mı? çeviri için teşekkürler .işime yarayacak..
30 Temmuz 2007
Tşkler
28 Ağustos 2007
gercekten faydalı bilgiler var.. tesekkurler