• 06-05-2013, 17:11:06
    #1
    Merhaba Arkadaşlar,

    yaklaşık 100bin kayıtlı tablodan hızlı rastgele 20 veri nasıl çekebiliriz acaba bu şekil de denememe rağmen çok yavaş,

    SELECT title,thumb FROM videos AS y1 
    INNER JOIN (SELECT ( RAND() * (SELECT MAX(id) FROM videos) ) AS rand_id) AS y2
    WHERE y1.id >= y2.rand_id
    LIMIT 20
  • 06-05-2013, 17:14:10
    #2
    Kimlik doğrulama veya yönetimden onay bekliyor.
    http://lmgtfy.com/?q=mysql+optimizin...s+%22select%22
  • 06-05-2013, 17:27:26
    #3
    verdiğiniz link için teşekkür ederim ama işin içinden çıkamadım.
  • 06-05-2013, 17:36:12
    #4
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Bu soruyu takip ediyorum.
  • 06-05-2013, 18:31:23
    #5
    Bir fiyat karşılaştırma sitesi yazmıştım bir acemilik zamanlarımda.
    350k ürün, bunlarla alakalı 3 milyon etiket, taxonomyleri falan vardı.
    Oradan aldığım dersler şunlar.
    Tek büyük sorgu yerine bölünmüş küçük sorgular kullanın...
    Mümkün mertebe varchar ve text indexler yerine doğrudan sayısal primary indexler üzerinden veri çağırın.

    1) hiç bir zaman mysql rand() fonksiyonunu kullanma
    - bunun yerine php rand fonksiyonunu kullan, mysql "rand() LIMIT 20" ile tek sorgu yapacağına rand olmadan primary index id üzerinden php ile üreteceğim 20 rand id yi 20 sorgu ile çağırmak daha hızlı yanıt veriyor.
    - ya da tek query ile maksimum id yi öğren, sonra php ile tek rand değer üret ve id < $rand_deger şeklinde sıralı 20 kayıt getir.

    2) büüyk veritabanlarında inner join, left join falan girmeyin. rand gibi işlem süresi çok uzuyor işlemci kullanımı tavan yapıyor.
    -onun yerine tek sorguda işi halletmekten ziyade 2 sorgu kullanın.

    Yalnız bu tek sorgu yerine iki sorgu kullanmak için indexlenmiş sayısal id alanlarını kullanın.
    Mysql çok kararsız bir veritabanı. Boşken çat diye yanıt verebiliyor ama büyük veritabanlarında aynı anda çoklu istek geldiğinde tablo birleştirmeli sorgular ve rand lı sorgular işlem süresini çok uzatıyor, işlemci kullanımını tavan yaptırıyor.
  • 06-05-2013, 18:46:35
    #6
    @digiklan hocam yorumunuz için teşekkür ederim aynen size katılıyorum php rand ile 20 sayısı üretip sql le bağlamak ile direk sql rand komutu arasında fark var, fakat atıyorum 500 bin 1 milyon kayıtlı veritabanında rand ile ürettiğim sayıyı kontrol ettiğimiz de az da olsa hız veriyor fakat "en faydalı yapılabilecek" bir yöntem gerek.
    test ettim direk rand ile site 20 saniyede açılırken php rand ile sayı üreterek 15sn civarında açılıyor. 5sn'ye ye düşürmek gerek.
  • 06-05-2013, 19:09:37
    #7
    BLaH adlı üyeden alıntı: mesajı görüntüle
    @digiklan hocam yorumunuz için teşekkür ederim aynen size katılıyorum php rand ile 20 sayısı üretip sql le bağlamak ile direk sql rand komutu arasında fark var, fakat atıyorum 500 bin 1 milyon kayıtlı veritabanında rand ile ürettiğim sayıyı kontrol ettiğimiz de az da olsa hız veriyor fakat "en faydalı yapılabilecek" bir yöntem gerek.
    test ettim direk rand ile site 20 saniyede açılırken php rand ile sayı üreterek 15sn civarında açılıyor. 5sn'ye ye düşürmek gerek.
    Tam rand yerine belirli bir id den sonraki videolari göstermek daha hızlı yanıt verilmesini sağlayacaktır.
    Yani maksimum idyi öğrenip, sonra php $rand = rand(1,($max_id-20)) şeklinde bir id oluşturup bu id üzerinden WHERE id > $rand ORDER BY id ASC LIMIT 20 gibi bir sorgu ile tek sorguda 20 satır daha hızlı şekilde gelir.

    Ayrıca bu rastgele video gösterimini bir file cache olarak yazmak, 10-15 dakikada bir güncellemek sistem performansını daha az yorar. Böylece 15 dakikada bir kez sayfa açılışı 15 saniye sürer diğer zamanlarda mikro saniyelerde yüklenir rastgele videolar.
  • 06-05-2013, 19:51:51
    #8
    digiklan adlı üyeden alıntı: mesajı görüntüle
    Tam rand yerine belirli bir id den sonraki videolari göstermek daha hızlı yanıt verilmesini sağlayacaktır.
    Yani maksimum idyi öğrenip, sonra php $rand = rand(1,($max_id-20)) şeklinde bir id oluşturup bu id üzerinden WHERE id > $rand ORDER BY id ASC LIMIT 20 gibi bir sorgu ile tek sorguda 20 satır daha hızlı şekilde gelir.

    Ayrıca bu rastgele video gösterimini bir file cache olarak yazmak, 10-15 dakikada bir güncellemek sistem performansını daha az yorar. Böylece 15 dakikada bir kez sayfa açılışı 15 saniye sürer diğer zamanlarda mikro saniyelerde yüklenir rastgele videolar.
    ama maximum idyi öğrenmek için işlenecek sorgu çok fazla yoracaktır düşünsenize o kadar kayıtlı verinin sayısını öğrenip sonrasında tekrar işlemeyi.
  • 06-05-2013, 19:59:40
    #9
    Üyeliği durduruldu
    "order by id desc limit 1" ile son idyi öğrenip baştan sona bir rastgele sayı kümesi oluşturabilirsiniz , bunun kasacağını sanmıyorum.