MySQL Optimizasyonu

 bcakir
 16 Temmuz 2011

Merhaba arkadaşlar bu makalede herkesin en büyük sorunları arasında gelen veritabanını daha az yorma ve daha hızlı sonuç elde etme üzerine tavsiyelerde bulunacağım. Bu makaleyi MySQL veritabanına göre hazırladım fakat bu işlenmler diğer veritabanlarında da var. Bu yüzden farklı bir veritabanı kullanıyorsanız kendinizinkine göre kolayca uyarlayabilirsiniz.

1) Sadece gerekli kolanları ve gerekli olan kadar kayıtı veritabanından isteyin. Başka bir deyişle * kullanımından kaçının ve sorgularınızda Limit kullanmaya özen gösterin.

# Hatalı Kullanım:
SELECT * FROM kullanicilar;

# Doğru Kullanımı:
SELECT ad, soyad, email FROM kullanicilar LIMIT 5;

2) Rasgele kayıt çekme işlemini veritabanı ile yapmamaya çalışın. Yani veritabanı sorgularınızda rand() fonksiyonunu kullanmamaya çalışın. Onun yerine; tablodaki kayıt sayısını saydırıp, Php ile 1 ile tabloda bulunan kayıt sayısı arasında rasgele sayı üretip daha sonra o kaydı veritabanından çekebilirsiniz. Bununla ilgili olarak bir makale okumuştum. Makalede 3.5 milyon kayıtlı tabloda, veritabanına rasgele kayıt alma işlemini yaptırmak 128 saniye, bu işlemi anlattığım tarz bir metodla yapmak 4 saniye sürüyor diyordu. Eğer kayıt sayınız 10 bin kayıt altındaysa ve öyle kalacaksa aralarında pek bir fark yok istediğinizi kullanabilirsiniz. Fakat kayıt sayınız fazlaysa kimse sizin sayfanızın açılmasını 10 saniyeden fazla beklemez. Bu yüzden bu tür alternatif optimizasyonlara gitmek zorundasınız.

# Hatalı Kullanım:
SELECT * FROM kullanıcılar ORDER BY rand() LIMIT 1;

<?php
// Doğru Kullanımı:

//kayit sayisi bulma
$result = mysql_query("Select Count(id) FROM kullanıcılar", $connection);
while ($row = mysql_fetch_array($result)) {$kayitsayisi = $row["0"];}

//rastgele sayi bulma
$rastgele=Rand(1,$kayitsayisi);

//rastgele seçilen kişinin adını alma
$result = mysql_query("SELECT ad FROM kullanicilar Where id='{$rastgele}'", $connection);
while ($row = mysql_fetch_array($result)) {$ad = $row["0"];}
?>

3) Veritabanınızda INDEX kullanmaya çalışın. Veritabanı istenen veriyi ilk kayıttan itibaren arayarak bulduğu için istenilen kayıtın bulunması zaman alacaktır. Bu yüzden en çok kullanılan sütunlar için INDEX yaratırsak veritabanı kayıtları sıralı olarak hafızada tutar ve istenilen daha hızlı getirir. INDEX mantığını tam olarak oturtmak için bir örnek vereyim. Örneğin; öğrencilerin numaralarının sıralı olarak ilerlediği bir tabloda öğrenci numarasına göre kayıt alıyorsanız INDEX kullanmanıza gerek yok. Ama öğrenci adına göre kayıt alıyorsanız INDEX kullanmanız gerekiyor.

# Bu tarz sorguyu sürekli kullanıyorsak:
SELECT adres FROM kullanicilar WHERE ad="Bünyamin" AND soyad="ÇAKIR";

# Aşağıdaki gibi INDEX kullanmalıyız:
CREATE INDEX kullanici_ad_soyad ON kullanicilar (ad, soyad)

4) Veritabanınızda kelime araması yapıyorsanız FULLTEXT INDEX kullanmaya çalışın. Daha ayrıntılı açıklamam gerekirse;  tablonuzdan Char, Varchar ve Text gibi veri tiplerinde LIKE “%aranan%” gibi kelime aratıyorsanız FULLTEXT INDEX kullanın.

# Makaleler tablomuzda yazıların bulunduğu sütuna bunu ekliyoruz.
CREATE FULLTEXT INDEX index_makale ON makaleler (yazilar);

# Yazılar içinde arama yapacaksak bunu kullanmalıyız:
SELECT baslik, yazilar FROM makaleler WHERE MATCH(yazilar) AGAINST('aranan');

Yukarıdaki sorgunun sonucunda; içinde aranan geçen bütün makaleler sonuç olarak döndürülecekti. Bu makalemizin sonuna geldik. Sonraki makalelerimde görüşmek üzere.

 663 Okunma

Bu yazıya 7 yorum yapılmış.

  1. Bir sorum olucaktı ben ” $toplam = count($dosya); ” bunu geriye nasıl saydırıcam yani dosya içince kayıt sayısını geri doğru sayması gerekiyor yarfımcı olursan çok sevinirim.

    • Eğer MySQL’den son kayıtları alacaksan Order By id Desc kullanabilirsin.
      Yok for döngüsünde geriye saydıracağım diyorsan
      for($i=count($dosya);$i<1;$i--){

      • ya ben ekleyemedim kod bu

        // Sohbet Güncelleme
        case “guncelle”;
        $dosya = file(“chat.txt”);
        if (empty($dosya)){
        echo “Temizlendi…”;
        }else {
        $toplam = count($dosya);
        echo”Sohet {$toplam} Mesaj sonra Temizlenecektir…”;
        if ($toplam >= 30){
        unlink(“chat.txt”);
        touch(“chat.txt”);
        echo “Temizlendi…”;
        }

        burda nereye eklemem gerekiyor

        • Yazmış olduğun kodda dosyanın içeriğini satır satır okuma yok. Sen girilen mesaj sayısını bulabildiğine emin misin? Dosya içeriğini satır satır okuma işlemine örnek yapmıştım.

          • $mesaj_kaldi = 30;
            $sayi = ($mesaj_kaldi)-($toplam);

            yaptım oldu ben bir bölümünü göndermiştim çok tşkederim

      • Konu performanssa
        for($i=count($dosya);$i<1;$i–){
        bunun yerine
        $say = count($dosya);
        for($i=$say;$i<1;$i–){
        bunu kullanmak daha performanslı olacaktır.

  2. Tesekkürler sağlam bilgiler …

Yazı hakkında görüşlerinizi belirtmek istermisiniz?

Daha fazla MySQL
Kapat