PHP-MySQL Optimizasyonu

8 Mayıs 2006 tarihli, Programlama köşesine ait yazı.

Php-MysqlMySQL 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 (WHERE ve ORDER 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 EXPLAIN komutunu kullanın.
  • Yaptığınız aramada yalnızca 1 girdiye ihtiyacınız varsa her zaman LIMIT 1 kullanmalı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 NULL tanı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 INT unsigned olarak 4294967295′e kadar sayıları tutar, ki bu çoğu zaman çok büyüktür. Uygunsa MEDIUMINT veya SMALLINT kullanı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 echo ile 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 echo fonksiyonu için geçerlidir.

  • echo, print‘ten hızlıdır.
  • for dö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:



Yorumlar - Başa Dön

Volkan Karakuş
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…

hakan
13 Ağustos 2006

Gerçekten faydalı şeyletr var güzelll

Tankado
10 Eylül 2006

Güzel ve faydalı bir yazı olmuş. Teşekkürler.

gökbey
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..

Yarn
30 Temmuz 2007

Tşkler

briyantin
28 Ağustos 2007

gercekten faydalı bilgiler var.. tesekkurler

Yavuz
2 Eylül 2009

teşekkürler güzel bi makale. inş yeter istediğim hız için



Yorum Yazın

(gerekli)

(gerekli)


Yorum yapacaklar için bilgi:
Verdiğiniz mail adresi sitede asla görüntülenmeyecektir. Sonraki yorumlarınız için isim, e-posta gibi bilgiler cookie olarak bilgisayarınızda saklanacaktır.



Önizleme: