• 19-07-2014, 18:00:22
    #1
    Büyükçe bir MySQL veritabanından rastgele bir veri çekmem gerekiyor. Ancak rand() kullanımı oldukça yavaşlatıyor işlemi. Daha iyi bir öneriniz var mı? İlgili tabloda eksiksiz bir primary key yok maalesef. Arada silinmiş verilerden ötürü sıçramalar mevcut. Bu da kayıt sayısını belirleyip aradan rastgele bir sayı seçip bunu kullanarak veriyi seçmeyi engelliyor haliyle. Şuan aklıma gelen tek çözüm sql sorgusunda order by rand() limit 1 ile veriyi çekmek ancak bu da oldukça yavaş.
  • 19-07-2014, 18:02:38
    #2
    Id leri bir diziye aktarıp o diziden rastgele çekmek de bi yöntem ama daha verimli olacağını sanmıyorum.
  • 19-07-2014, 18:04:54
    #3
    CanArs12 adlı üyeden alıntı: mesajı görüntüle
    Id leri bir diziye aktarıp o diziden rastgele çekmek de bi yöntem ama daha verimli olacağını sanmıyorum.
    Yaklaşık 1 milyon kadar kayıt var. Evet o da sorun olacaktır.
  • 19-07-2014, 18:19:30
    #4
    ylv
    Üyeliği durduruldu
    pole.ws adlı üyeden alıntı: mesajı görüntüle
    Yaklaşık 1 milyon kadar kayıt var. Evet o da sorun olacaktır.
    1 milyon kayıtlı tabloda hiç rastgele çekim yapmadım ama mantıken
    id sütunu veritipi int olsa, index boyutu 4byte*1.000.000 / (1024*1024) yaklaşık 4 mb

    direk SELECT * FROM tablo ORDER BY RAND() yerine

    sadece rastgele id leri almayı dene

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

    daha sonra IN query yapın,

    daha hızlıda olabilir, daha yavaşta olabilir ama rand sıralaması kullanmayın ve kullanıcaksanızda verileri en kötüsü 5 dk da olsa cache yapın
  • 19-07-2014, 18:29:34
    #5
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Merhaba

    Verileri rasgele 100 parçaya bölün ve sadece id leri bir koleksiyona veya veritabına kayıt edin.

    Bu işlemden sonra 1den 100e kadar rasgele bir dizi seçin ve seçilen dizidende 1den 100 e kadar bir id seçin , bundan sonra id hangi ürüne aitse onu çektirebilirsiniz.

    Burdaki altın nokta yeni oluşturacağınız tablo veya dizilerde id atlaması olmamasıdır.
  • 19-07-2014, 18:33:27
    #6
    1 milyon kayıttan rand ile alırsanız elbetteki performans sorunu olur.

    Mysql'de bir view oluşuturun, bu view'de sadece ID olsun ya da sadece RAND ile almak istediğiniz başlıklar olsun. Ya da başka bir mantık geliştirin sorgunuza göre, view'de tutun bunları. Sonra view tablonuzdan rand yaparsınız. Sorgunuz sırasındaki çekilen veri ne kadar az olursa o kadar iyi.

    Cache yapmak diğer çözüm. Cache süresi dolduktan bir sonraki cache sırasında yine sorgu zamanı çok olacak. Cache mutlaka kullanmanız gerekiyor. Tavsiyem memcache. Sunucu sizin elinizdeyse server side memcache kurun ve sorgularınız da optimize edin.

    Kolay gelsin


    pole.ws adlı üyeden alıntı: mesajı görüntüle
    Büyükçe bir MySQL veritabanından rastgele bir veri çekmem gerekiyor. Ancak rand() kullanımı oldukça yavaşlatıyor işlemi. Daha iyi bir öneriniz var mı? İlgili tabloda eksiksiz bir primary key yok maalesef. Arada silinmiş verilerden ötürü sıçramalar mevcut. Bu da kayıt sayısını belirleyip aradan rastgele bir sayı seçip bunu kullanarak veriyi seçmeyi engelliyor haliyle. Şuan aklıma gelen tek çözüm sql sorgusunda order by rand() limit 1 ile veriyi çekmek ancak bu da oldukça yavaş.
  • 19-07-2014, 18:47:49
    #7
    ylv adlı üyeden alıntı: mesajı görüntüle
    direk SELECT * FROM tablo ORDER BY RAND() yerine

    sadece rastgele id leri almayı dene

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

    daha sonra IN query yapın,
    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.


    betmo adlı üyeden alıntı: mesajı görüntüle
    Merhaba

    Verileri rasgele 100 parçaya bölün ve sadece id leri bir koleksiyona veya veritabına kayıt edin.

    Bu işlemden sonra 1den 100e kadar rasgele bir dizi seçin ve seçilen dizidende 1den 100 e kadar bir id seçin , bundan sonra id hangi ürüne aitse onu çektirebilirsiniz.

    Burdaki altın nokta yeni oluşturacağınız tablo veya dizilerde id atlaması olmamasıdır.
    Teşekkürler öneri için. Ancak sanırım cache kullanımına yöneleceğim.

    mtl adlı üyeden alıntı: mesajı görüntüle
    Cache yapmak diğer çözüm. Cache süresi dolduktan bir sonraki cache sırasında yine sorgu zamanı çok olacak. Cache mutlaka kullanmanız gerekiyor. Tavsiyem memcache. Sunucu sizin elinizdeyse server side memcache kurun ve sorgularınız da optimize edin.
    Teşekkür ederim. Sanırım en sağlıklı kullanım cache kullanımı olacak. Bahsettiğim rastgele seçim sadece yönetim kısmında gerekli ve sadece sınırlı sayıda kişi muhattap oluyor olacak. Sitenin genelini etkilemediği için cache süresi dolsa dahi bir miktar bekleme sıkıntı olmayacaktır. Memcache kurulumu ile ilgileniyorum hemen.


    ylv adlı üyeden alıntı: mesajı görüntüle
    rand sıralaması kullanmayın ve kullanıcaksanızda verileri en kötüsü 5 dk da olsa cache yapın

    Teşekkür ederim. Evet cache sorunu çözecektir bendeki uygulamada.
  • 19-07-2014, 18:50:07
    #8
    Memcache ile ilgili profesyonel destek almak isterseniz yardımcı olabilirim. İmzamda da yazar zaten..

    rand konusunda yardımcı olabildiysek ne âlâ..

    pole.ws adlı üyeden alıntı: mesajı görüntüle
    Memcache kurulumu ile ilgileniyorum hemen.
  • 19-07-2014, 18:51:40
    #9
    mtl adlı üyeden alıntı: mesajı görüntüle
    Memcache ile ilgili profesyonel destek almak isterseniz yardımcı olabilirim. İmzamda da yazar zaten..

    rand konusunda yardımcı olabildiysek ne âlâ..
    Teşekkür ederim. Hallederim sanırım. Ama sorun olursa mesaj atarım.