• 19-07-2014, 18:52:20
    #10
    ylv
    Üyeliği durduruldu
    pole.ws adlı üyeden alıntı: mesajı görüntüle
    Eklemeyi unuttuğum bir kısım var. Veriyi seçerken where kullanarak belli bir değere sahip verileri sıralıyorum. where status = 0 gibi.
    Bu durumda sizin önerdiğiniz şekil uygun olmayacaktır sanırım. Rastgele id seçimini yaparken sadece status = 0 olanlar arasından seçim yaptırmama gerekeceği için yine aynı şey olacaktır.
    status alacağı değer 0 veya 1
    tinyint atadım 1 byte

    index eklesem boyutu 1 milyon kayıtta önemsiz olur,

    SELECT id FROM tablo USE INDEX(PRIMARY,status) WHERE status=0 ORDER BY RAND() LIMIT 10

    deneyip sonuçlarıda yazın merak ettim mysql performansını, elimde o kadar büyük veritabanı olmadığı için test edemiyorum
  • 19-07-2014, 19:19:37
    #11
    ylv adlı üyeden alıntı: mesajı görüntüle
    status alacağı değer 0 veya 1
    tinyint atadım 1 byte

    index eklesem boyutu 1 milyon kayıtta önemsiz olur,

    SELECT id FROM tablo USE INDEX(PRIMARY,status) WHERE status=0 ORDER BY RAND() LIMIT 10

    deneyip sonuçlarıda yazın merak ettim mysql performansını, elimde o kadar büyük veritabanı olmadığı için test edemiyorum
    Denedim ancak sanırım bir yerlerde hata yaptım. Cevap vermedi.
  • 19-07-2014, 19:45:53
    #12
    ylv
    Üyeliği durduruldu
    pole.ws adlı üyeden alıntı: mesajı görüntüle
    Denedim ancak sanırım bir yerlerde hata yaptım. Cevap vermedi.
    PRIMARY (index adı) phpmyadmin 'de tablo yapısında altta indexler kısmında anahtar adıyla yazar, farklı ise değiştirin

    SELECT id FROM tablo USE INDEX(PRIMARY) ORDER BY RAND() LIMIT 10

    status olmadan test edin, hata verirse uğraşmayın boşverin.
    hata vermez ise ortalama sorgu süresini merak ediyorum.
  • 20-07-2014, 14:06:41
    #13
    ylv adlı üyeden alıntı: mesajı görüntüle
    PRIMARY (index adı) phpmyadmin 'de tablo yapısında altta indexler kısmında anahtar adıyla yazar, farklı ise değiştirin

    SELECT id FROM tablo USE INDEX(PRIMARY) ORDER BY RAND() LIMIT 10

    status olmadan test edin, hata verirse uğraşmayın boşverin.
    hata vermez ise ortalama sorgu süresini merak ediyorum.
    Sadece bu sorgu 1.4 saniye civarı zaman alıyor. Ancak işin içine status girince yani "SELECT id FROM tablo USE INDEX(PRIMARY,status) WHERE status=0 ORDER BY RAND() LIMIT 1" şeklinde kullandığımda sorgu süresi 2.8 civarına yükseldi. Benim doğrudan tüm veriden rand ile veri çektiğim zaman ise 3.4 civarındayıdı sorgu süresi. Bu durumda biraz iyileşme olacak gibi ancak yeterli olmayacaktır maalesef.
  • 20-07-2014, 16:59:09
    #14
    Kayıt sayısı fazla olunca kaçınılmaz sorunlardan.

    Aklıma direk üçkağıt geldi benim, ne de olsa random veri çekileceğinden sadece status kontrolü olduğuna göre , şöyle yapsanız olmaz mı.

    Kafanıza göre 100 adet kayıt belirleyin. bunların ID 'lerini ister diziye atın, ister veritabanına kaydedin. bu 100 adet ID içinden seçiverin olsun bitsin
  • 20-07-2014, 18:44:18
    #15
    uysal_rockci adlı üyeden alıntı: mesajı görüntüle
    Kayıt sayısı fazla olunca kaçınılmaz sorunlardan.

    Aklıma direk üçkağıt geldi benim, ne de olsa random veri çekileceğinden sadece status kontrolü olduğuna göre , şöyle yapsanız olmaz mı.

    Kafanıza göre 100 adet kayıt belirleyin. bunların ID 'lerini ister diziye atın, ister veritabanına kaydedin. bu 100 adet ID içinden seçiverin olsun bitsin
    Aslında olur ama, bu 100 adet kayıtı kafaya göre nasıl belirleyeceğim Yine yavaş olacaktır. Arada silinmiş kayıtlar olmasaydı id numaraları içinden seçim kolay olurdu, ancak bu durumda kayıtlar arasında sıçramalar mevcut.

    Bu arada cache işide çözüm değil. Hem ram kullanımı hem de cache içinde sorgu yapamamak sorun.

    Şöyle bir kullanım deniyorum şimdi, sonucu buraya yazarım.

    1 ile MAX(id) arasında rastgele bir sayı seçip, bu rastgele sayı ile sorguyu şu şekilde yapacağım:
    SELECT sutun1 FROM tablo where status='0' and id>'$randid' LIMIT 1
    Bu durumda ilgili id'nin karşılıksız olması durumunda en yakın değeri döndürecektir ve rand() ile kıyaslanınca daha hızlı olacaktır diye düşünüyorum.

    --R10.NET; Flood Engellendi -->-> Yeni yazılan mesaj 18:44:18 -->-> Daha önceki mesaj 18:37:18 --

    Evet denedim ve sonuç mükemmel
    Sorgu süresi 0.009 - 0.0012 s arası değişti.
    İhtiyacı olabilecekler için:

    SELECT sutun1 FROM tablo WHERE status = '0' and id>= FLOOR(1 + RAND() * (SELECT MAX(id) FROM tablo)) LIMIT 1
  • 20-07-2014, 18:56:04
    #16
    ylv
    Üyeliği durduruldu
    pole.ws adlı üyeden alıntı: mesajı görüntüle
    Aslında olur ama, bu 100 adet kayıtı kafaya göre nasıl belirleyeceğim Yine yavaş olacaktır. Arada silinmiş kayıtlar olmasaydı id numaraları içinden seçim kolay olurdu, ancak bu durumda kayıtlar arasında sıçramalar mevcut.

    Bu arada cache işide çözüm değil. Hem ram kullanımı hem de cache içinde sorgu yapamamak sorun.

    Şöyle bir kullanım deniyorum şimdi, sonucu buraya yazarım.

    1 ile MAX(id) arasında rastgele bir sayı seçip, bu rastgele sayı ile sorguyu şu şekilde yapacağım:
    SELECT sutun1 FROM tablo where status='0' and id>'$randid' LIMIT 1
    Bu durumda ilgili id'nin karşılıksız olması durumunda en yakın değeri döndürecektir ve rand() ile kıyaslanınca daha hızlı olacaktır diye düşünüyorum.

    --R10.NET; Flood Engellendi -->-> Yeni yazılan mesaj 18:44:18 -->-> Daha önceki mesaj 18:37:18 --

    Evet denedim ve sonuç mükemmel
    Sorgu süresi 0.009 - 0.0012 s arası değişti.
    İhtiyacı olabilecekler için:

    SELECT sutun1 FROM tablo WHERE status = '0' and id>= FLOOR(1 + RAND() * (SELECT MAX(id) FROM tablo)) LIMIT 1

    $rand = rand(1,1000000);

    sizin sorgunuzun Select * FROM tablo WHERE id >= $rand LIMIT 1 böyle bir sorgudan farkı yok.

    rastgele 10 tane çekmek isterseniz??

    lucene solr gibi büyük veriler için yapılmış sistemleri kullanın, kayıt sayınız şu an 1 milyon yarın 2 milyon olur, net çözümler üretin..

    iyi çalışmalar
  • 20-07-2014, 19:06:12
    #17
    ylv adlı üyeden alıntı: mesajı görüntüle
    $rand = rand(1,1000000);

    sizin sorgunuzun Select * FROM tablo WHERE id >= $rand LIMIT 1 böyle bir sorgudan farkı yok.

    rastgele 10 tane çekmek isterseniz??

    lucene solr gibi büyük veriler için yapılmış sistemleri kullanın, kayıt sayınız şu an 1 milyon yarın 2 milyon olur, net çözümler üretin..

    iyi çalışmalar
    Rastgele veri çekme ihtiyacı duyduğum yer sadece yönetim erişimi olan bir kaç kişinin erişebildiği oldukça sınırlı bir alan. Bu durumda sürede kısa oynamalar sorun olmayacaktır. Ancak yukarıda belirttiğim "SELECT sutun1 FROM tablo WHERE status = '0' and id>= FLOOR(1 + RAND() * (SELECT MAX(id) FROM tablo)) LIMIT 1 " ile performans inanılmaz ölçüde arttı. Şuan veriyi browserdan neredeyse eş zamanlı çekiyor gibi. İhtiyacım olan status=0 olan verilerden herhangi birini rastgele çağırabilmekti, bu ise işimi çözdü.
    Yardımlarınız için çok teşekkür ederim.
  • 20-07-2014, 20:18:31
    #18
    pole.ws adlı üyeden alıntı: mesajı görüntüle
    Aslında olur ama, bu 100 adet kayıtı kafaya göre nasıl belirleyeceğim Yine yavaş olacaktır. Arada silinmiş kayıtlar olmasaydı id numaraları içinden seçim kolay olurdu, ancak bu durumda kayıtlar arasında sıçramalar mevcut.



    Bu arada cache işide çözüm değil. Hem ram kullanımı hem de cache içinde sorgu yapamamak sorun.



    Şöyle bir kullanım deniyorum şimdi, sonucu buraya yazarım.



    1 ile MAX(id) arasında rastgele bir sayı seçip, bu rastgele sayı ile sorguyu şu şekilde yapacağım:

    SELECT sutun1 FROM tablo where status='0' and id>'$randid' LIMIT 1

    Bu durumda ilgili id'nin karşılıksız olması durumunda en yakın değeri döndürecektir ve rand() ile kıyaslanınca daha hızlı olacaktır diye düşünüyorum.



    --R10.NET; Flood Engellendi -->-> Yeni yazılan mesaj 18:44:18 -->-> Daha önceki mesaj 18:37:18 --



    Evet denedim ve sonuç mükemmel

    Sorgu süresi 0.009 - 0.0012 s arası değişti.

    İhtiyacı olabilecekler için:



    SELECT sutun1 FROM tablo WHERE status = '0' and id>= FLOOR(1 + RAND() * (SELECT MAX(id) FROM tablo)) LIMIT 1

    Güzel bir çözüm olmuş, ancak idler şöyle ise;
    1-2-3-99-100-103-105 bu durumda sorguların neredeyse hepsinde 99 olan çıkar. Bunu da size hatırlatmam gerektiğini düşündüm.