• 08-08-2012, 23:37:56
    #1
    Sorgularınızda ORDER BY rand() kullanmanın ne kadar servar kaynağı tükettiğini birçoğunuz biliyorsunuzdur zaten.

    Gelin onun yerine size yeni bir teknik öğretelim.

    Bu kodlari test etmeden yaziyorum direk buraya, herhangi bir hata varsa bildirin düzenleyeyim. Her halükarda tekniği anlamanıza yardımcı olacaktır.

    Önce tablonuzda kaç adet satır var onu öğrenin.
    // id diye bir PRIMARY KEY sütununuz var sayıyorum
    $xAdet = mysqli_result(mysqli_query("SELECT COUNT(id) FROM tablo_adi"),0,0);
    Şimdi bu rakamdan çekmek istediğiniz veri adetinin 2 katını çıkarın.
    // bu rakam sayesinde ofsetiniz max satırı taşmayacaktir.
    $kalan = $xAdet - 20; // 10 adet için 20 çıkardık
    // 10 yerine 20 cikardim çünkü yakın zamanda silinmiş satırlar yüzünden atlanan ID rakamları olabilir. Ben şahsen ofseti geniş tutup tedbirli olmaktan yanayım.
    Verileri çekmeye başlayacağınız sütun IDsini rasgele belirleyin
    $burdan = rand(0,$kalan);
    Sonra şu şekilde sorgulama yaptırın.
    $sonuclar = mysqli_query("SELECT * FROM tablo_adi WHERE id > $burdan LIMIT 10");

    Bu rasgele veri çekmenin tek yolu değildir, en sağlıklı yoluda değildir, fakat performans bakımından en hızlısıdır çünkü PRIMARY KEY değerine sahip ID sütunları indexlenir.

    LIMIT 512312,10 gibi teknikler kullanarak çekilen rasgele sorgularda mysql yine o 500bin küsür satırın üstünden geçecektir ve sayacaktır oraya geldiğini eğer index kullanmazsanız.

    Sebep: mysql index değeri olan sütunlar için look up tabloları oluşturur.
  • 09-08-2012, 00:17:50
    #2
    Üyeliği durduruldu
    random yöntemleri hatırladığım kadarıyla 10 sayfa kadar tartışıldı.

    Konu açmadan eski konuları bir inceleyin bence.

    Yöntem komple yanlış. ID lere bakılarak rastgele sayı cekilemez. 20 den fazla kayıt silindiyse ne olacak ?

    kayıt sayısı 20 den azsa hiç sonuç üretmez ayrıca.

    kolay gelsin.
  • 09-08-2012, 00:19:04
    #3
    Üyeliği durduruldu
    doom hoşgeldin yeniden
  • 09-08-2012, 00:39:18
    #4
    Gamega adlı üyeden alıntı: mesajı görüntüle
    random yöntemleri hatırladığım kadarıyla 10 sayfa kadar tartışıldı.

    Konu açmadan eski konuları bir inceleyin bence.

    Yöntem komple yanlış. ID lere bakılarak rastgele sayı cekilemez. 20 den fazla kayıt silindiyse ne olacak ?

    kayıt sayısı 20 den azsa hiç sonuç üretmez ayrıca.

    kolay gelsin.
    Konuyu tamamen okuduysan "en sağlıklı yol değildir" diye belirttim, ve daha sağlıklı olan LIMIT burdan,bukadar seklinde tekniğinede değindim. Lakin herkesin senaryosu farklıdır. Tablonda binlerce satır var ise, 200 ofset verirsiniz isterseniz. Yada aşşağıda vereceğim minnacık kod ile tablonuzu optimize eder, yeni temiz IDler atarsınız silinen kayıtlar için. Artık birçok script ID rakamı bile geçirmiyor URL'de, slug kullanıyor onun yerine. O yuzden aşşağıdaki kodla tabloyu günlük yenilemek sakınca yaratmayacaktır. Kısacası bu teknik birçok senaryoya uygundur, ve sonuç olarak en hızlı yöntemdir. Tabii ki herkese uygun olmadığını konuda belirttim.

    ALTER TABLE tablo_adi DROP id;  ALTER TABLE tablo_adi ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id), AUTO_INCREMENT=1;
    Sekosa adlı üyeden alıntı: mesajı görüntüle
    doom hoşgeldin yeniden
    Hoşbuldum
  • 09-08-2012, 01:32:28
    #5
    Üyeliği durduruldu
    Anlıyorum hocam nasıl hız yapılacağını göstermişsiniz. ancak unutmayın ki yanlış olan her şekilde yanlıştır. bu yöntem bazı durumlarda çalışıyor diye kullanılabilir olamaz.
    mysql liimit saydırmak çok büyük bir sorun teşkil etmez eğer ediyorsa tablolama sisteminizde veya veri yapınızda hatta büyük ihtimalle komple projenizde bir hata var demektir. Yoksa arama motorlarının hiç biri çalışamaz ve kilitlenirdi.

    iyi çalışmalar.
  • 09-08-2012, 04:11:38
    #6
    Gamega adlı üyeden alıntı: mesajı görüntüle
    Anlıyorum hocam nasıl hız yapılacağını göstermişsiniz. ancak unutmayın ki yanlış olan her şekilde yanlıştır. bu yöntem bazı durumlarda çalışıyor diye kullanılabilir olamaz.
    mysql liimit saydırmak çok büyük bir sorun teşkil etmez eğer ediyorsa tablolama sisteminizde veya veri yapınızda hatta büyük ihtimalle komple projenizde bir hata var demektir. Yoksa arama motorlarının hiç biri çalışamaz ve kilitlenirdi.

    iyi çalışmalar.
    Bunun yanlis olan bir yonu yok. Kullandiginiz senaryoya gore server masrafinizi yariya indirecek derecede performans saglar. Sen 20den assagi kayit varsa problem cikarir vs demissin fakat 20 kayitli tablo icin bu zaten gerekli olmaz. 20 satir dediginiz hicbirseydir. onu ORDER BY rand() kullanarak ceksenizde kimseyi incitmez. Ben sahsen bunu kendim kullandim 2 milyon satirli tabloda. Gunluk 100k tekil hiti 4GB ramli VPS'te rahatca barindirdim

    Genis capli buyuk projeleriniz varsa tabii ki daha esnek bir sorgu bicimi yapilmali, fakat verdigim ornek bu forumdaki 50liralik VPS icin pazarlik yapan bircok kisiyi kurtaracaktir. : )

    Limit saydirmada ile arasindaki fark %1lik bir hiz farki bile olsa bu binlerce ziyaretci tarafindan katlaniyor. Ben sahsen sizin verdiginiz ornegi yillarca kullandim aklima bu gelene kadar. Her ikisininde gunluk 10binlerce hiti olan siteler ustundeki etkisini gayet biliyorum.