order by rand() performans sorunu
17
●1.159
- 19-07-2014, 18:00:22Bü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:04:54Yaklaşık 1 milyon kadar kayıt var. Evet o da sorun olacaktır.CanArs12 adlı üyeden alıntı: mesajı görüntüle
- 19-07-2014, 18:19:30Üyeliği durduruldu1 milyon kayıtlı tabloda hiç rastgele çekim yapmadım ama mantıkenpole.ws adlı üyeden alıntı: mesajı görüntüle
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:34Kimlik 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:271 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 - 19-07-2014, 18:47:49Eklemeyi 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.ylv adlı üyeden alıntı: mesajı görüntüle
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.
Teşekkürler öneri için. Ancak sanırım cache kullanımına yöneleceğim.betmo adlı üyeden alıntı: mesajı görüntüle
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.mtl adlı üyeden alıntı: mesajı görüntüle
ylv adlı üyeden alıntı: mesajı görüntüle
Teşekkür ederim. Evet cache sorunu çözecektir bendeki uygulamada. - 19-07-2014, 18:50:07Memcache 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 - 19-07-2014, 18:51:40Teşekkür ederim. Hallederim sanırım. Ama sorun olursa mesaj atarım.mtl adlı üyeden alıntı: mesajı görüntüle