PHP, MySQL - sonuçları-array shuffle "seçeneğini daha hızlı olurdu ...

3 Cevap php

I've been reading a lot about the disadvantages of using "order by rand" so I don't need update on that. I was thinking, since I only need a limited amount of rows retrieved from the db to be randomized, maybe I should do:

$r = $db->query("select * from table limit 500");
for($i;$i<500;$i++)
$arr[$i]=mysqli_fetch_assoc($r);
shuffle($arr);

(i know this only randomizes the 500 first rows, be it).

Bundan daha hızlı olacaktır

$r = $db->("select * from table order by rand() limit 500");

bana sadece bahsedelim, db tabloları daha ... 10,000 satır daha dolu olduğunu söylüyorlar.

why don't you do it yourself?!? - Evet, ben var, ama ben tecrübeli görüş için arıyorum.

teşekkürler!

3 Cevap

500 ya da 10K, örneklem büyüklüğü somut sonuçlara varmak mümkün çok küçük. 100K de, yine 1/2 second region on this graph bakıyoruz. Hala performans ile ilgili iseniz, two options for a randomized number I provided in this answer bakmak.

Biz veri veya kurulum yok, bu yüzden aslında durumu sınamak için size bıraktı. PHP geçen süreyi hesaplamak için nasıl çok sayıda sayfa vardır - RAND () sorgu kullanarak shuffle ve diğer kullanarak iki sayfa, bir tane oluşturun. En az her 10, ve çalıştır bir göz atın.

MySQL ile deneyim bu bakıyorum.

Kodunun ilk parça hakkında konuşalım:

$r = $db->query("select * from table");
for($i=0;$i<500;$i++){
  $arr[$i] = mysqli_fetch_assoc($r);
}
shuffle($arr);

Açıkçası bunun yerine PHP bunu yapmanın SQL deyimindeki satır sayısını sınırlamak için daha verimli olacaktır.

Böylece:

$r = $db->query("SELECT * FROM table LIMIT 500");
while($arr[] = mysqli_fetch_assoc($r)){}
shuffle($arr);

SQL işlemi satır gibi büyük miktarda var, özellikle, PHP bunu yapıyor daha hızlı olacaktır. Öğrenmek için iyi bir yolu kıyaslama yapmak ve daha hızlı olurdu iki hangi bulmaktır. Benim bahis SQL PHP sürüyerek daha hızlı olacağını olmasıdır.

Yani benim oy için de geçerli:

$r = $db->query("SELECT * FROM table ORDER BY RAND() LIMIT 500");
while($arr[] = mysqli_fetch_assoc($r)){}

Ben shuffle durumda uzun sürer eminim, ancak veritabanından hızlı rasgele setleri örnekler için bu linki görmek istiyorum olabilir. Bu ekstra SQL biraz gerektirir, ama hız sizin için önemli ise, o zaman bunu.

http://devzone.zend.com/article/4571-Fetching-multiple-random-rows-from-a-database